From 167085385be74516ba606d183a8b6a4c9ac98721 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Tue, 27 Apr 2021 19:14:55 +0200 Subject: [PATCH] Fixed bad lighting with objects behind the area light grid bounds --- .../builtin/lighting/ambient_lightgrid_IBL.ps.hlsl | 11 +++++++++-- neo/renderer/RenderProgs_embedded.h | 11 +++++++++-- neo/renderer/RenderWorld_lightgrid.cpp | 5 +++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl b/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl index d5271330..5490f298 100644 --- a/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl +++ b/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl @@ -263,15 +263,19 @@ void main( PS_IN fragment, out PS_OUT result ) { float v; - v = lightOrigin[i] * ( 1.0 / lightGridSize[i] ); + // walls can be sampled behind the grid sometimes so avoid negative weights + v = max( 0, lightOrigin[i] * ( 1.0 / lightGridSize[i] ) ); gridCoord[i] = int( floor( v ) ); frac[ i ] = v - gridCoord[ i ]; + /* if( gridCoord[i] < 0 ) { gridCoord[i] = 0; } - else if( gridCoord[i] >= lightGridBounds[i] - 1 ) + else + */ + if( gridCoord[i] >= lightGridBounds[i] - 1 ) { gridCoord[i] = lightGridBounds[i] - 1; } @@ -326,6 +330,9 @@ void main( PS_IN fragment, out PS_OUT result ) } } + // build P + //float3 P = lightGridOrigin + ( gridCoord2[0] * gridStep[0] + gridCoord2[1] * gridStep[1] + gridCoord2[2] * gridStep[2] ); + float2 atlasOffset; atlasOffset.x = ( gridCoord2[0] * gridStep[0] + gridCoord2[2] * gridStep[1] ) * invXZ; diff --git a/neo/renderer/RenderProgs_embedded.h b/neo/renderer/RenderProgs_embedded.h index c56b7ce6..ea58d2b5 100644 --- a/neo/renderer/RenderProgs_embedded.h +++ b/neo/renderer/RenderProgs_embedded.h @@ -5546,15 +5546,19 @@ static const cgShaderDef_t cg_renderprogs[] = " {\n" " float v;\n" "\n" - " v = lightOrigin[i] * ( 1.0 / lightGridSize[i] );\n" + " // walls can be sampled behind the grid sometimes so avoid negative weights\n" + " v = max( 0, lightOrigin[i] * ( 1.0 / lightGridSize[i] ) );\n" " gridCoord[i] = int( floor( v ) );\n" " frac[ i ] = v - gridCoord[ i ];\n" "\n" + " /*\n" " if( gridCoord[i] < 0 )\n" " {\n" " gridCoord[i] = 0;\n" " }\n" - " else if( gridCoord[i] >= lightGridBounds[i] - 1 )\n" + " else\n" + " */\n" + " if( gridCoord[i] >= lightGridBounds[i] - 1 )\n" " {\n" " gridCoord[i] = lightGridBounds[i] - 1;\n" " }\n" @@ -5609,6 +5613,9 @@ static const cgShaderDef_t cg_renderprogs[] = " }\n" " }\n" "\n" + " // build P\n" + " //float3 P = lightGridOrigin + ( gridCoord2[0] * gridStep[0] + gridCoord2[1] * gridStep[1] + gridCoord2[2] * gridStep[2] );\n" + "\n" " float2 atlasOffset;\n" "\n" " atlasOffset.x = ( gridCoord2[0] * gridStep[0] + gridCoord2[2] * gridStep[1] ) * invXZ;\n" diff --git a/neo/renderer/RenderWorld_lightgrid.cpp b/neo/renderer/RenderWorld_lightgrid.cpp index d19e0c1b..a69a0b90 100644 --- a/neo/renderer/RenderWorld_lightgrid.cpp +++ b/neo/renderer/RenderWorld_lightgrid.cpp @@ -35,6 +35,7 @@ If you have questions concerning this license or the applicable additional terms #define LGRID_FILE_EXT "lightgrid" #define LGRID_BINARYFILE_EXT "blightgrid" #define LGRID_FILEID "LGRID" +const byte LGRID_VERSION = 3; #define STORE_LIGHTGRID_SHDATA 0 @@ -604,9 +605,9 @@ bool idRenderWorldLocal::LoadLightGridFile( const char* name ) lightGridVersion = atoi( token ); } - if( lightGridVersion != BLGRID_VERSION ) + if( lightGridVersion != LGRID_VERSION ) { - common->Warning( "%s has version %i instead of %i", fileName.c_str(), lightGridVersion, BLGRID_VERSION ); + common->Warning( "%s has version %i instead of %i", fileName.c_str(), lightGridVersion, LGRID_VERSION ); delete src; return false; }