Use dynamic light grid size in shaders

This commit is contained in:
Robert Beckebans 2021-04-15 16:09:39 +02:00
parent 0596300c45
commit 2752432416
6 changed files with 48 additions and 55 deletions

View file

@ -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] );

View file

@ -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++ )

View file

@ -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;

View file

@ -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++ )
{

View file

@ -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 );

View file

@ -147,7 +147,6 @@ enum renderParm_t
// RB begin
RENDERPARM_AMBIENT_COLOR,
// RENDERPARM_GLOBALVIEWORIGIN,
RENDERPARM_GLOBALLIGHTORIGIN,
RENDERPARM_JITTERTEXSCALE,
RENDERPARM_JITTERTEXOFFSET,