Fix GPU particles issues with missing sorting keys data when shader is not yet loaded
This commit is contained in:
@@ -49,7 +49,6 @@ void ParticleMaterialShader::Bind(BindParameters& params)
|
|||||||
auto context = params.GPUContext;
|
auto context = params.GPUContext;
|
||||||
auto& view = params.RenderContext.View;
|
auto& view = params.RenderContext.View;
|
||||||
auto& drawCall = *params.DrawCall;
|
auto& drawCall = *params.DrawCall;
|
||||||
const uint32 sortedIndicesOffset = drawCall.Particle.Module->SortedIndicesOffset;
|
|
||||||
Span<byte> cb(_cbData.Get(), _cbData.Count());
|
Span<byte> cb(_cbData.Get(), _cbData.Count());
|
||||||
ASSERT_LOW_LAYER(cb.Length() >= sizeof(ParticleMaterialShaderData));
|
ASSERT_LOW_LAYER(cb.Length() >= sizeof(ParticleMaterialShaderData));
|
||||||
auto materialData = reinterpret_cast<ParticleMaterialShaderData*>(cb.Get());
|
auto materialData = reinterpret_cast<ParticleMaterialShaderData*>(cb.Get());
|
||||||
@@ -103,7 +102,7 @@ void ParticleMaterialShader::Bind(BindParameters& params)
|
|||||||
static StringView ParticleModelFacingModeOffset(TEXT("ModelFacingMode"));
|
static StringView ParticleModelFacingModeOffset(TEXT("ModelFacingMode"));
|
||||||
|
|
||||||
materialData->WorldMatrix.SetMatrixTranspose(drawCall.World);
|
materialData->WorldMatrix.SetMatrixTranspose(drawCall.World);
|
||||||
materialData->SortedIndicesOffset = drawCall.Particle.Particles->GPU.SortedIndices && params.RenderContext.View.Pass != DrawPass::Depth ? sortedIndicesOffset : 0xFFFFFFFF;
|
materialData->SortedIndicesOffset = drawCall.Particle.Particles->GPU.SortedIndices && params.RenderContext.View.Pass != DrawPass::Depth ? drawCall.Particle.Module->SortedIndicesOffset : 0xFFFFFFFF;
|
||||||
materialData->PerInstanceRandom = drawCall.PerInstanceRandom;
|
materialData->PerInstanceRandom = drawCall.PerInstanceRandom;
|
||||||
materialData->ParticleStride = drawCall.Particle.Particles->Stride;
|
materialData->ParticleStride = drawCall.Particle.Particles->Stride;
|
||||||
materialData->PositionOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticlePosition, ParticleAttribute::ValueTypes::Float3);
|
materialData->PositionOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticlePosition, ParticleAttribute::ValueTypes::Float3);
|
||||||
|
|||||||
@@ -970,6 +970,35 @@ void DrawEmittersGPU(RenderContextBatch& renderContextBatch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Initialize with identity sort indices in case the buffer has been allocated
|
||||||
|
for (const GPUEmitterDraw& draw : GPUEmitterDraws)
|
||||||
|
{
|
||||||
|
if (!draw.Sorting || !draw.Buffer->GPU.SortedIndices)
|
||||||
|
continue;
|
||||||
|
const int32 capacity = draw.Buffer->Capacity;
|
||||||
|
const int32 capacityBytes = capacity * draw.Buffer->GPU.SortedIndices->GetStride();
|
||||||
|
const int32 indicesBytes = draw.Buffer->GPU.SortedIndices->GetSize();
|
||||||
|
RenderListAlloc sortedIndicesAlloc;
|
||||||
|
auto* renderList = renderContextBatch.GetMainContext().List;
|
||||||
|
void* indices = sortedIndicesAlloc.Init(renderList, indicesBytes, GPU_SHADER_DATA_ALIGNMENT);
|
||||||
|
switch (draw.Buffer->GPU.SortedIndices->GetFormat())
|
||||||
|
{
|
||||||
|
case PixelFormat::R16_UInt:
|
||||||
|
for (int32 i = 0; i < capacity; i++)
|
||||||
|
((uint16*)indices)[i] = (uint16)i;
|
||||||
|
break;
|
||||||
|
case PixelFormat::R32_UInt:
|
||||||
|
for (int32 i = 0; i < capacity; i++)
|
||||||
|
((uint32*)indices)[i] = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (int32 i = 1; i < draw.Buffer->Emitter->Graph.SortModules.Count(); i++)
|
||||||
|
Platform::MemoryCopy((byte*)indices + i * capacityBytes, indices, capacityBytes);
|
||||||
|
context->UpdateBuffer(draw.Buffer->GPU.SortedIndices, indices, indicesBytes, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: transition here SortedIndices into ShaderReadNonPixel and Buffer into ShaderReadGraphics to reduce barriers during particles rendering
|
// TODO: transition here SortedIndices into ShaderReadNonPixel and Buffer into ShaderReadGraphics to reduce barriers during particles rendering
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user