From 275243241614a8628fd92170cc46d9955686680d Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 15 Apr 2021 16:09:39 +0200 Subject: [PATCH] Use dynamic light grid size in shaders --- .../builtin/debug/lightgrid.ps.hlsl | 12 +++-- .../lighting/ambient_lightgrid_IBL.ps.hlsl | 52 ++++++------------- .../lighting/ambient_lighting_IBL.ps.hlsl | 12 ++--- neo/renderer/OpenGL/RenderDebug_GL.cpp | 11 ++-- neo/renderer/RenderBackend.cpp | 15 ++++-- neo/renderer/RenderProgs.h | 1 - 6 files changed, 48 insertions(+), 55 deletions(-) diff --git a/base/renderprogs/builtin/debug/lightgrid.ps.hlsl b/base/renderprogs/builtin/debug/lightgrid.ps.hlsl index 14f564d2..02b61813 100644 --- a/base/renderprogs/builtin/debug/lightgrid.ps.hlsl +++ b/base/renderprogs/builtin/debug/lightgrid.ps.hlsl @@ -46,12 +46,12 @@ struct PS_OUT { // *INDENT-ON* -float3 lightGridOrigin = float3( -192.0, -128.0, 0 ); -float3 lightGridSize = float3( 64.0, 64.0, 128.0 ); -int3 lightGridBounds = int3( 7, 7, 3 ); - int3 GetBaseGridCoord( float3 origin ) { + float3 lightGridOrigin = rpGlobalLightOrigin.xyz; + float3 lightGridSize = rpJitterTexScale.xyz; + int3 lightGridBounds = int3( rpJitterTexOffset.x, rpJitterTexOffset.y, rpJitterTexOffset.z ); + int3 pos; float3 lightOrigin = origin - lightGridOrigin; @@ -87,6 +87,10 @@ void main( PS_IN fragment, out PS_OUT result ) float2 normalizedOctCoord = octEncode( globalNormal ); float2 normalizedOctCoordZeroOne = ( normalizedOctCoord + float2( 1.0 ) ) * 0.5; + float3 lightGridOrigin = rpGlobalLightOrigin.xyz; + float3 lightGridSize = rpJitterTexScale.xyz; + int3 lightGridBounds = int3( rpJitterTexOffset.x, rpJitterTexOffset.y, rpJitterTexOffset.z ); + float invXY = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[1] ) ); float invZ = ( 1.0 / lightGridBounds[2] ); diff --git a/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl b/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl index 38d06221..30932c86 100644 --- a/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl +++ b/base/renderprogs/builtin/lighting/ambient_lightgrid_IBL.ps.hlsl @@ -63,36 +63,6 @@ struct PS_OUT // *INDENT-ON* -float3 lightGridOrigin = float3( -192.0, -128.0, 0 ); -float3 lightGridSize = float3( 64.0, 64.0, 128.0 ); -int3 lightGridBounds = int3( 7, 7, 3 ); - -int3 GetBaseGridCoord( float3 origin ) -{ - int3 pos; - - float3 lightOrigin = origin - lightGridOrigin; - for( int i = 0; i < 3; i++ ) - { - float v; - - v = lightOrigin[i] * ( 1.0f / lightGridSize[i] ); - pos[i] = int( floor( v ) ); - - if( pos[i] < 0 ) - { - pos[i] = 0; - } - else if( pos[i] >= lightGridBounds[i] - 1 ) - { - pos[i] = lightGridBounds[i] - 1; - } - } - - return pos; -} - - // RB: TODO OPTIMIZE // this is a straight port of idBounds::RayIntersection bool AABBRayIntersection( float3 b[2], float3 start, float3 dir, out float scale ) @@ -175,15 +145,14 @@ void main( PS_IN fragment, out PS_OUT result ) float3 globalPosition = fragment.texcoord7.xyz; - // RB: rpGlobalLightOrigin is global view origin - float3 globalEye = normalize( rpGlobalLightOrigin.xyz - globalPosition ); + float3 globalView = normalize( rpGlobalEyePos.xyz - globalPosition ); - float3 reflectionVector = globalNormal * dot3( globalEye, globalNormal ); - reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalEye ); + float3 reflectionVector = globalNormal * dot3( globalView, globalNormal ); + reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalView ); #if 1 // parallax box correction using portal area bounds - float hitScale; + float hitScale = 0.0; float3 bounds[2]; bounds[0].x = rpWobbleSkyX.x; bounds[0].y = rpWobbleSkyX.y; @@ -209,7 +178,7 @@ void main( PS_IN fragment, out PS_OUT result ) } #endif - half vDotN = saturate( dot3( globalEye, globalNormal ) ); + half vDotN = saturate( dot3( globalView, globalNormal ) ); #if defined( USE_PBR ) const half metallic = specMapSRGB.g; @@ -271,6 +240,15 @@ void main( PS_IN fragment, out PS_OUT result ) float2 normalizedOctCoordZeroOne = ( normalizedOctCoord + float2( 1.0 ) ) * 0.5; // lightgrid atlas + + //float3 lightGridOrigin = float3( -192.0, -128.0, 0 ); + //float3 lightGridSize = float3( 64.0, 64.0, 128.0 ); + //int3 lightGridBounds = int3( 7, 7, 3 ); + + float3 lightGridOrigin = rpGlobalLightOrigin.xyz; + float3 lightGridSize = rpJitterTexScale.xyz; + int3 lightGridBounds = int3( rpJitterTexOffset.x, rpJitterTexOffset.y, rpJitterTexOffset.z ); + float invXY = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[1] ) ); float invZ = ( 1.0 / lightGridBounds[2] ); @@ -307,7 +285,7 @@ void main( PS_IN fragment, out PS_OUT result ) gridStep[2] = lightGridBounds[0] * lightGridBounds[1]; float totalFactor = 0.0; - float3 irradiance; + float3 irradiance = float3( 0.0, 0.0, 0.0 ); /* for( int i = 0; i < 8; i++ ) diff --git a/base/renderprogs/builtin/lighting/ambient_lighting_IBL.ps.hlsl b/base/renderprogs/builtin/lighting/ambient_lighting_IBL.ps.hlsl index a99daa64..981c9ded 100644 --- a/base/renderprogs/builtin/lighting/ambient_lighting_IBL.ps.hlsl +++ b/base/renderprogs/builtin/lighting/ambient_lighting_IBL.ps.hlsl @@ -62,6 +62,7 @@ struct PS_OUT }; // *INDENT-ON* + // RB: TODO OPTIMIZE // this is a straight port of idBounds::RayIntersection bool AABBRayIntersection( float3 b[2], float3 start, float3 dir, out float scale ) @@ -144,15 +145,14 @@ void main( PS_IN fragment, out PS_OUT result ) float3 globalPosition = fragment.texcoord7.xyz; - // RB: rpGlobalLightOrigin is global view origin - float3 globalEye = normalize( rpGlobalLightOrigin.xyz - globalPosition ); + float3 globalView = normalize( rpGlobalEyePos.xyz - globalPosition ); - float3 reflectionVector = globalNormal * dot3( globalEye, globalNormal ); - reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalEye ); + float3 reflectionVector = globalNormal * dot3( globalView, globalNormal ); + reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalView ); #if 1 // parallax box correction using portal area bounds - float hitScale; + float hitScale = 0.0; float3 bounds[2]; bounds[0].x = rpWobbleSkyX.x; bounds[0].y = rpWobbleSkyX.y; @@ -178,7 +178,7 @@ void main( PS_IN fragment, out PS_OUT result ) } #endif - half vDotN = saturate( dot3( globalEye, globalNormal ) ); + half vDotN = saturate( dot3( globalView, globalNormal ) ); #if defined( USE_PBR ) const half metallic = specMapSRGB.g; diff --git a/neo/renderer/OpenGL/RenderDebug_GL.cpp b/neo/renderer/OpenGL/RenderDebug_GL.cpp index 2a88cc0a..5bed7dc6 100644 --- a/neo/renderer/OpenGL/RenderDebug_GL.cpp +++ b/neo/renderer/OpenGL/RenderDebug_GL.cpp @@ -1815,9 +1815,14 @@ void idRenderBackend::DBG_ShowLightGrid() const int numColors = 7; static idVec4 colors[numColors] = { colorBlack, colorBlue, colorCyan, colorGreen, colorYellow, colorRed, colorWhite }; - // use rpGlobalLightOrigin for camera center - idVec4 globalViewOrigin( viewDef->renderView.vieworg.x, viewDef->renderView.vieworg.y, viewDef->renderView.vieworg.z, 1.0f ); - renderProgManager.SetUniformValue( RENDERPARM_GLOBALLIGHTORIGIN, globalViewOrigin.ToFloatPtr() ); + // use rpGlobalLightOrigin for lightGrid center + idVec4 lightGridOrigin( area->lightGrid.lightGridOrigin.x, area->lightGrid.lightGridOrigin.y, area->lightGrid.lightGridOrigin.z, 1.0f ); + idVec4 lightGridSize( area->lightGrid.lightGridSize.x, area->lightGrid.lightGridSize.y, area->lightGrid.lightGridSize.z, 1.0f ); + idVec4 lightGridBounds( area->lightGrid.lightGridBounds[0], area->lightGrid.lightGridBounds[1], area->lightGrid.lightGridBounds[2], 1.0f ); + + renderProgManager.SetUniformValue( RENDERPARM_GLOBALLIGHTORIGIN, lightGridOrigin.ToFloatPtr() ); + renderProgManager.SetUniformValue( RENDERPARM_JITTERTEXSCALE, lightGridSize.ToFloatPtr() ); + renderProgManager.SetUniformValue( RENDERPARM_JITTERTEXOFFSET, lightGridBounds.ToFloatPtr() ); for( int i = 0; i < area->lightGrid.lightGridPoints.Num(); i++ ) { diff --git a/neo/renderer/RenderBackend.cpp b/neo/renderer/RenderBackend.cpp index f4af42dc..4c3d424d 100644 --- a/neo/renderer/RenderBackend.cpp +++ b/neo/renderer/RenderBackend.cpp @@ -1344,6 +1344,17 @@ void idRenderBackend::DrawSingleInteraction( drawInteraction_t* din, bool useFas SetVertexParm( RENDERPARM_WOBBLESKY_Y, probeMaxs.ToFloatPtr() ); SetVertexParm( RENDERPARM_WOBBLESKY_Z, probeCenter.ToFloatPtr() ); + //SetVertexParm( RENDERPARM_WOBBLESK_Z, probeCenter.ToFloatPtr() ); + + // use rpGlobalLightOrigin for lightGrid center + idVec4 lightGridOrigin( viewDef->lightGridOrigin.x, viewDef->lightGridOrigin.y, viewDef->lightGridOrigin.z, 1.0f ); + idVec4 lightGridSize( viewDef->lightGridSize.x, viewDef->lightGridSize.y, viewDef->lightGridSize.z, 1.0f ); + idVec4 lightGridBounds( viewDef->lightGridBounds[0], viewDef->lightGridBounds[1], viewDef->lightGridBounds[2], 1.0f ); + + renderProgManager.SetUniformValue( RENDERPARM_GLOBALLIGHTORIGIN, lightGridOrigin.ToFloatPtr() ); + renderProgManager.SetUniformValue( RENDERPARM_JITTERTEXSCALE, lightGridSize.ToFloatPtr() ); + renderProgManager.SetUniformValue( RENDERPARM_JITTERTEXOFFSET, lightGridBounds.ToFloatPtr() ); + if( specUsage == TD_SPECULAR_PBR_RMAO || specUsage == TD_SPECULAR_PBR_RMAOD ) { // PBR path with roughness, metal and AO @@ -2311,10 +2322,6 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr renderProgManager.SetRenderParm( RENDERPARM_AMBIENT_COLOR, ambientColor.ToFloatPtr() ); - // use rpGlobalLightOrigin for camera center - idVec4 globalViewOrigin( viewDef->renderView.vieworg.x, viewDef->renderView.vieworg.y, viewDef->renderView.vieworg.z, 1.0f ); - SetVertexParm( RENDERPARM_GLOBALLIGHTORIGIN, globalViewOrigin.ToFloatPtr() ); - // setup renderparms assuming we will be drawing trivial surfaces first RB_SetupForFastPathInteractions( diffuseColor, specularColor ); diff --git a/neo/renderer/RenderProgs.h b/neo/renderer/RenderProgs.h index 59f97fed..3709606e 100644 --- a/neo/renderer/RenderProgs.h +++ b/neo/renderer/RenderProgs.h @@ -147,7 +147,6 @@ enum renderParm_t // RB begin RENDERPARM_AMBIENT_COLOR, -// RENDERPARM_GLOBALVIEWORIGIN, RENDERPARM_GLOBALLIGHTORIGIN, RENDERPARM_JITTERTEXSCALE, RENDERPARM_JITTERTEXOFFSET,