From 302eb3fa85231dbf9ccf9001babc4996fd7ccaf4 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Fri, 24 Feb 2023 13:04:34 +0100 Subject: [PATCH] Don't allocate non shadow casting lights into the shadow atlasgit difftool #746 --- neo/renderer/Framebuffer.h | 2 +- neo/renderer/RenderBackend.cpp | 40 ++++++++++++++++++++------ neo/renderer/RenderSystem_init.cpp | 2 +- neo/renderer/tr_frontend_addlights.cpp | 10 +++++-- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/neo/renderer/Framebuffer.h b/neo/renderer/Framebuffer.h index 16770eb3..cb3f52e2 100644 --- a/neo/renderer/Framebuffer.h +++ b/neo/renderer/Framebuffer.h @@ -44,7 +44,7 @@ static const int IRRADIANCE_OCTAHEDRON_SIZE = 30 + 2; //static int shadowMapResolutions[MAX_SHADOWMAP_RESOLUTIONS] = { 2048, 1024, 512, 512, 256 }; // if we use higher resolutions than this than the shadow casting lights don't fit into the 16384^2 atlas anymore -static int shadowMapResolutions[MAX_SHADOWMAP_RESOLUTIONS] = { 1024, 512, 512, 256, 128 }; +static int shadowMapResolutions[MAX_SHADOWMAP_RESOLUTIONS] = { 1024, 512, 256, 256, 128 }; class Framebuffer diff --git a/neo/renderer/RenderBackend.cpp b/neo/renderer/RenderBackend.cpp index 1c182b77..de513c6c 100644 --- a/neo/renderer/RenderBackend.cpp +++ b/neo/renderer/RenderBackend.cpp @@ -1235,7 +1235,7 @@ void idRenderBackend::DrawSingleInteraction( drawInteraction_t* din, bool useFas } else { - if( !r_skipShadows.GetBool() && r_useShadowMapping.GetBool() && din->vLight->globalShadows ) + if( !r_skipShadows.GetBool() && r_useShadowMapping.GetBool() && din->vLight->globalShadows && din->vLight->shadowLOD > -1 ) { // RB: we have shadow mapping enabled and shadow maps so do a shadow compare @@ -1616,7 +1616,7 @@ void idRenderBackend::RenderInteractions( const drawSurf_t* surfList, const view bool lightDepthBoundsDisabled = false; // RB begin - if( !r_skipShadows.GetBool() && r_useShadowMapping.GetBool() ) + if( !r_skipShadows.GetBool() && r_useShadowMapping.GetBool() && vLight->shadowLOD > -1 ) { const static int JITTER_SIZE = 128; @@ -4019,10 +4019,16 @@ void idRenderBackend::ShadowAtlasPass( const viewDef_t* _viewDef ) GL_ViewportAndScissor( 0, 0, r_shadowMapAtlasSize.GetInteger(), r_shadowMapAtlasSize.GetInteger() ); - const nvrhi::FramebufferAttachment& att = currentFrameBuffer->GetApiObject()->getDesc().depthAttachment; - if( att.texture ) + const nvrhi::FramebufferAttachment& attColor = currentFrameBuffer->GetApiObject()->getDesc().colorAttachments[0]; + if( attColor.texture ) { - commandList->clearDepthStencilTexture( att.texture, nvrhi::AllSubresources, true, 1.0f, false, 0x80 ); + commandList->clearTextureFloat( attColor.texture, nvrhi::AllSubresources, nvrhi::Color( 0.0f ) ); + } + + const nvrhi::FramebufferAttachment& attDepth = currentFrameBuffer->GetApiObject()->getDesc().depthAttachment; + if( attDepth.texture ) + { + commandList->clearDepthStencilTexture( attDepth.texture, nvrhi::AllSubresources, true, 1.0f, false, 0x80 ); } // @@ -4031,7 +4037,7 @@ void idRenderBackend::ShadowAtlasPass( const viewDef_t* _viewDef ) int shadowIndex = 0; idList inputSizes; - //idStrList inputNames; + idStrList inputNames; for( const viewLight_t* vLight = viewDef->viewLights; vLight != NULL; vLight = vLight->next ) { @@ -4050,6 +4056,12 @@ void idRenderBackend::ShadowAtlasPass( const viewDef_t* _viewDef ) continue; } + if( vLight->shadowLOD == -1 ) + { + // light doesn't cast shadows + continue; + } + int side, sideStop; if( vLight->parallel ) @@ -4080,8 +4092,13 @@ void idRenderBackend::ShadowAtlasPass( const viewDef_t* _viewDef ) for( ; side < sideStop ; side++ ) { - inputSizes.Append( idVec2i( shadowMapResolutions[ vLight->shadowLOD ], shadowMapResolutions[ vLight->shadowLOD ] ) ); - //inputNames.Append( lightShader->GetName() ); + idVec2i size( shadowMapResolutions[ vLight->shadowLOD ], shadowMapResolutions[ vLight->shadowLOD ] ); + inputSizes.Append( size ); + + if( size.x >= 1024 ) + { + inputNames.Append( lightShader->GetName() ); + } shadowIndex++; } @@ -4182,6 +4199,13 @@ void idRenderBackend::ShadowAtlasPass( const viewDef_t* _viewDef ) continue; } + if( vLight->shadowLOD == -1 ) + { + // light doesn't cast shadows + vLight->imageSize.x = vLight->imageSize.y = -1; + continue; + } + const idMaterial* lightShader = vLight->lightShader; renderLog.OpenBlock( lightShader->GetName(), colorMdGrey ); diff --git a/neo/renderer/RenderSystem_init.cpp b/neo/renderer/RenderSystem_init.cpp index e0c4fd73..03d43e73 100644 --- a/neo/renderer/RenderSystem_init.cpp +++ b/neo/renderer/RenderSystem_init.cpp @@ -271,7 +271,7 @@ idCVar r_useVirtualScreenResolution( "r_useVirtualScreenResolution", "0", CVAR_R idCVar r_useShadowMapping( "r_useShadowMapping", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "use shadow mapping instead of stencil shadows" ); #endif idCVar r_useShadowAtlas( "r_useShadowAtlas", "1", CVAR_RENDERER | CVAR_INTEGER, "" ); -idCVar r_shadowMapAtlasSize( "r_shadowMapAtlasSize", "16384", CVAR_RENDERER | CVAR_INTEGER | CVAR_ROM, "size of the shadowmap atlas" ); +idCVar r_shadowMapAtlasSize( "r_shadowMapAtlasSize", "8192", CVAR_RENDERER | CVAR_INTEGER | CVAR_ROM, "size of the shadowmap atlas" ); idCVar r_shadowMapFrustumFOV( "r_shadowMapFrustumFOV", "92", CVAR_RENDERER | CVAR_FLOAT, "oversize FOV for point light side matching" ); idCVar r_shadowMapSingleSide( "r_shadowMapSingleSide", "-1", CVAR_RENDERER | CVAR_INTEGER, "only draw a single side (0-5) of point lights" ); idCVar r_shadowMapImageSize( "r_shadowMapImageSize", "1024", CVAR_RENDERER | CVAR_INTEGER, "", 128, 2048 ); diff --git a/neo/renderer/tr_frontend_addlights.cpp b/neo/renderer/tr_frontend_addlights.cpp index a42eb258..cbdaee6f 100644 --- a/neo/renderer/tr_frontend_addlights.cpp +++ b/neo/renderer/tr_frontend_addlights.cpp @@ -266,7 +266,9 @@ static void R_AddSingleLight( viewLight_t* vLight ) vLight->scissorRect.zmax = projected[1][2]; // RB: calculate shadow LOD similar to Q3A .md3 LOD code - vLight->shadowLOD = 0; + + // -1 means no shadows + vLight->shadowLOD = -1; if( r_useShadowMapping.GetBool() && lightCastsShadows ) { @@ -275,6 +277,8 @@ static void R_AddSingleLight( viewLight_t* vLight ) int lod; int numLods; + vLight->shadowLOD = 0; + numLods = MAX_SHADOWMAP_RESOLUTIONS; // compute projected bounding sphere @@ -327,9 +331,9 @@ static void R_AddSingleLight( viewLight_t* vLight ) if( lod >= numLods ) { // don't draw any shadow - //lod = -1; + lod = -1; - lod = numLods - 1; + //lod = numLods - 1; } // 2048^2 ultra quality is only for cascaded shadow mapping with sun lights