mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
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:
parent
58d3527130
commit
75bd640bd8
5 changed files with 55 additions and 3 deletions
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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, {});
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in a new issue