Optimize decals rendering

This commit is contained in:
Wojtek Figat
2024-03-26 14:05:24 +01:00
parent 2dfb1058b2
commit 01d91bf102
6 changed files with 92 additions and 95 deletions

View File

@@ -130,17 +130,14 @@ void MaterialComplexityMaterialShader::Draw(RenderContext& renderContext, GPUCon
MaterialBase::BindParameters bindParams(context, renderContext, drawCall);
bindParams.BindViewData();
drawCall.WorldDeterminantSign = 1.0f;
drawCall.PerInstanceRandom = 0.0f;
context->SetRenderTarget(lightBuffer);
for (int32 i = 0; i < decals.Count(); i++)
{
const auto decal = decals[i];
ASSERT(decal && decal->Material);
Transform transform = decal->GetTransform();
transform.Scale *= decal->GetSize();
renderContext.View.GetWorldMatrix(transform, drawCall.World);
const RenderDecalData& decal = decals.Get()[i];
drawCall.World = decal.World;
drawCall.ObjectPosition = drawCall.World.GetTranslation();
drawCall.Material = decal->Material;
drawCall.PerInstanceRandom = decal->GetPerInstanceRandom();
drawCall.Material = decal.Material;
decalsWrapper.Bind(bindParams);
boxModel->Render(context);
}

View File

@@ -49,7 +49,8 @@ void QuadOverdrawPass::Render(RenderContext& renderContext, GPUContext* context,
context->BindUA(1, overdrawTexture->View());
context->BindUA(2, liveCountTexture->View());
DrawCall drawCall;
drawCall.PerInstanceRandom = 1.0f;
drawCall.WorldDeterminantSign = 1.0f;
drawCall.PerInstanceRandom = 0.0f;
MaterialBase::BindParameters bindParams(context, renderContext, drawCall);
bindParams.BindViewData();
renderContext.View.Pass = DrawPass::QuadOverdraw;
@@ -62,13 +63,8 @@ void QuadOverdrawPass::Render(RenderContext& renderContext, GPUContext* context,
// Draw decals
for (int32 i = 0; i < renderContext.List->Decals.Count(); i++)
{
const auto decal = renderContext.List->Decals[i];
ASSERT(decal && decal->Material);
Transform transform = decal->GetTransform();
transform.Scale *= decal->GetSize();
renderContext.View.GetWorldMatrix(transform, drawCall.World);
drawCall.ObjectPosition = drawCall.World.GetTranslation();
drawCall.PerInstanceRandom = decal->GetPerInstanceRandom();
const RenderDecalData& decal = renderContext.List->Decals.Get()[i];
drawCall.World = decal.World;
defaultMaterial->Bind(bindParams);
boxModel->Render(context);
}