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

@@ -69,20 +69,26 @@ void Decal::OnLayerChanged()
void Decal::Draw(RenderContext& renderContext)
{
MaterialBase* material = Material;
if (EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::Decals) &&
EnumHasAnyFlags(renderContext.View.Pass, DrawPass::GBuffer) &&
Material &&
Material->IsLoaded() &&
Material->IsDecal())
material &&
material->IsLoaded() &&
material->IsDecal())
{
// Check if decal is being culled
const auto lodView = (renderContext.LodProxyView ? renderContext.LodProxyView : &renderContext.View);
const float screenRadiusSquared = RenderTools::ComputeBoundsScreenRadiusSquared(_sphere.Center - renderContext.View.Origin, (float)_sphere.Radius, *lodView) * renderContext.View.ModelLODDistanceFactorSqrt;
// Check if decal is being culled
if (Math::Square(DrawMinScreenSize * 0.5f) > screenRadiusSquared)
return;
renderContext.List->Decals.Add(this);
RenderDecalData data;
Transform transform = GetTransform();
transform.Scale *= _size;
renderContext.View.GetWorldMatrix(transform, data.World);
data.SortOrder = SortOrder;
data.Material = material;
renderContext.List->Decals.Add(data);
}
}