mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2025-03-14 22:50:45 +00:00
Use dynamic light grid size in shaders
This commit is contained in:
parent
0596300c45
commit
2752432416
6 changed files with 48 additions and 55 deletions
|
@ -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] );
|
||||
|
||||
|
|
|
@ -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++ )
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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++ )
|
||||
{
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -147,7 +147,6 @@ enum renderParm_t
|
|||
// RB begin
|
||||
RENDERPARM_AMBIENT_COLOR,
|
||||
|
||||
// RENDERPARM_GLOBALVIEWORIGIN,
|
||||
RENDERPARM_GLOBALLIGHTORIGIN,
|
||||
RENDERPARM_JITTERTEXSCALE,
|
||||
RENDERPARM_JITTERTEXOFFSET,
|
||||
|
|
Loading…
Reference in a new issue