Removes context of terrain shadows and silhouettes

We were unnecessary passing all combinations of our scene shader context
even if we don't need it as for shadows and silhouettes for terrain
rendering. Since we only need to draw a solid color.
This commit is contained in:
Vladislav Belov 2026-05-10 23:56:57 +02:00
parent 58d3527130
commit 75bd640bd8
No known key found for this signature in database
GPG key ID: 353545E45DB9CCB3
5 changed files with 55 additions and 3 deletions

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<effect>
<technique>
<require shaders="glsl"/>
<require shaders="spirv"/>
<pass shader="dummy">
<cull mode="FRONT"/>
<color mask_red="FALSE" mask_green="FALSE" mask_blue="FALSE" mask_alpha="FALSE"/>
</pass>
</technique>
</effect>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<effect>
<technique>
<require shaders="glsl"/>
<require shaders="spirv"/>
<pass shader="dummy">
<!--
To prevent units displaying silhouettes when parts of their model
protrude into the ground, only occlude with the back faces of the
terrain (so silhouettes will still display when behind hills).
-->
<cull mode="FRONT"/>
<color mask_red="FALSE" mask_green="FALSE" mask_blue="FALSE" mask_alpha="FALSE"/>
</pass>
</technique>
</effect>

View file

@ -171,6 +171,8 @@ X(sunDir)
X(terrain_base)
X(terrain_blend)
X(terrain_decal)
X(terrain_shadow_caster)
X(terrain_silhouette_occluder)
X(terrain_solid)
X(tex)
X(texSize)

View file

@ -317,7 +317,7 @@ void CSceneRenderer::RenderShadowMap(
const int cullGroup = CULL_SHADOWS_CASCADE_0 + cascade;
{
PROFILE("render patches");
m->terrainRenderer.RenderPatches(deviceCommandContext, cullGroup, shadowsContext);
m->terrainRenderer.RenderPatches(deviceCommandContext, cullGroup, {});
}
{
@ -739,7 +739,7 @@ void CSceneRenderer::RenderSilhouettes(
{
PROFILE("render patches");
m->terrainRenderer.RenderPatches(deviceCommandContext, CULL_SILHOUETTE_OCCLUDER, contextOccluder);
m->terrainRenderer.RenderPatches(deviceCommandContext, CULL_SILHOUETTE_OCCLUDER, {});
}
{

View file

@ -93,6 +93,8 @@ struct TerrainRendererInternals
/// Fancy water shader
CShaderTechniquePtr fancyWaterTech;
CShaderTechniquePtr shadowCasterTech, silhouettteOccluderTech;
CShaderTechniquePtr shaderTechniqueSolid, shaderTechniqueSolidDepthTest;
Renderer::Backend::IVertexInputLayout* overlayVertexInputLayout = nullptr;
@ -150,6 +152,10 @@ void TerrainRenderer::Initialize()
m->waterSurfaceVertexInputLayout = CPatchRData::GetWaterSurfaceVertexInputLayout(false);
m->waterSurfaceWithDataVertexInputLayout = CPatchRData::GetWaterSurfaceVertexInputLayout(true);
m->waterShoreVertexInputLayout = CPatchRData::GetWaterShoreVertexInputLayout();
CShaderManager& shaderManager{g_Renderer.GetShaderManager()};
m->shadowCasterTech = shaderManager.LoadEffect(str_terrain_shadow_caster);
m->silhouettteOccluderTech = shaderManager.LoadEffect(str_terrain_silhouette_occluder);
}
void TerrainRenderer::SetSimulation(CSimulation2* simulation)
@ -372,7 +378,24 @@ void TerrainRenderer::RenderPatches(
GPU_SCOPED_LABEL(deviceCommandContext, "Render terrain patches");
CShaderTechniquePtr solidTech = g_Renderer.GetShaderManager().LoadEffect(str_terrain_solid, defines);
CShaderTechniquePtr solidTech;
switch (cullGroup)
{
case CSceneRenderer::CULL_SHADOWS_CASCADE_0: [[fallthrough]];
case CSceneRenderer::CULL_SHADOWS_CASCADE_1: [[fallthrough]];
case CSceneRenderer::CULL_SHADOWS_CASCADE_2: [[fallthrough]];
case CSceneRenderer::CULL_SHADOWS_CASCADE_3:
ENSURE(defines.GetMap().empty());
solidTech = m->shadowCasterTech;
break;
case CSceneRenderer::CULL_SILHOUETTE_OCCLUDER:
ENSURE(defines.GetMap().empty());
solidTech = m->silhouettteOccluderTech;
break;
default:
solidTech = g_Renderer.GetShaderManager().LoadEffect(str_terrain_solid, defines);
break;
}
deviceCommandContext->SetGraphicsPipelineState(
solidTech->GetGraphicsPipelineState());
deviceCommandContext->BeginPass();