mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2025-03-14 22:50:45 +00:00
Changed lightgrid texture layout
This commit is contained in:
parent
2752432416
commit
15a9411161
4 changed files with 69 additions and 77 deletions
|
@ -91,11 +91,11 @@ void main( PS_IN fragment, out PS_OUT result )
|
|||
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] );
|
||||
float invXZ = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[2] ) );
|
||||
float invY = ( 1.0 / lightGridBounds[1] );
|
||||
|
||||
normalizedOctCoordZeroOne.x *= invXY;
|
||||
normalizedOctCoordZeroOne.y *= invZ;
|
||||
normalizedOctCoordZeroOne.x *= invXZ;
|
||||
normalizedOctCoordZeroOne.y *= invY;
|
||||
|
||||
int3 gridStep;
|
||||
|
||||
|
@ -105,8 +105,8 @@ void main( PS_IN fragment, out PS_OUT result )
|
|||
|
||||
int3 gridCoord = GetBaseGridCoord( globalPosition );
|
||||
|
||||
normalizedOctCoordZeroOne.x += ( gridCoord[0] * gridStep[0] + gridCoord[1] * gridStep[1] ) * invXY;
|
||||
normalizedOctCoordZeroOne.y += ( gridCoord[2] * invZ );
|
||||
normalizedOctCoordZeroOne.x += ( gridCoord[0] * gridStep[0] + gridCoord[2] * gridStep[1] ) * invXZ;
|
||||
normalizedOctCoordZeroOne.y += ( gridCoord[1] * invY );
|
||||
|
||||
float4 envMap = tex2D( samp0, normalizedOctCoordZeroOne );
|
||||
|
||||
|
|
|
@ -249,11 +249,11 @@ void main( PS_IN fragment, out PS_OUT result )
|
|||
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] );
|
||||
float invXZ = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[2] ) );
|
||||
float invY = ( 1.0 / lightGridBounds[1] );
|
||||
|
||||
normalizedOctCoordZeroOne.x *= invXY;
|
||||
normalizedOctCoordZeroOne.y *= invZ;
|
||||
normalizedOctCoordZeroOne.x *= invXZ;
|
||||
normalizedOctCoordZeroOne.y *= invY;
|
||||
|
||||
int3 gridCoord;
|
||||
float3 frac;
|
||||
|
@ -328,8 +328,8 @@ void main( PS_IN fragment, out PS_OUT result )
|
|||
|
||||
float2 atlasOffset;
|
||||
|
||||
atlasOffset.x = ( gridCoord2[0] * gridStep[0] + gridCoord2[1] * gridStep[1] ) * invXY;
|
||||
atlasOffset.y = ( gridCoord2[2] * invZ );
|
||||
atlasOffset.x = ( gridCoord2[0] * gridStep[0] + gridCoord2[2] * gridStep[1] ) * invXZ;
|
||||
atlasOffset.y = ( gridCoord2[1] * invY );
|
||||
|
||||
irradiance += tex2D( samp7, normalizedOctCoordZeroOne + atlasOffset ).rgb * factor;
|
||||
|
||||
|
|
|
@ -2811,12 +2811,12 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
"// *INDENT-ON*\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"float3 lightGridOrigin = float3( -192.0, -128.0, 0 );\n"
|
||||
"float3 lightGridSize = float3( 64.0, 64.0, 128.0 );\n"
|
||||
"int3 lightGridBounds = int3( 7, 7, 3 );\n"
|
||||
"\n"
|
||||
"int3 GetBaseGridCoord( float3 origin )\n"
|
||||
"{\n"
|
||||
" float3 lightGridOrigin = rpGlobalLightOrigin.xyz;\n"
|
||||
" float3 lightGridSize = rpJitterTexScale.xyz;\n"
|
||||
" int3 lightGridBounds = int3( rpJitterTexOffset.x, rpJitterTexOffset.y, rpJitterTexOffset.z );\n"
|
||||
"\n"
|
||||
" int3 pos;\n"
|
||||
"\n"
|
||||
" float3 lightOrigin = origin - lightGridOrigin;\n"
|
||||
|
@ -2852,11 +2852,15 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
" float2 normalizedOctCoord = octEncode( globalNormal );\n"
|
||||
" float2 normalizedOctCoordZeroOne = ( normalizedOctCoord + float2( 1.0 ) ) * 0.5;\n"
|
||||
"\n"
|
||||
" float invXY = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[1] ) );\n"
|
||||
" float invZ = ( 1.0 / lightGridBounds[2] );\n"
|
||||
" float3 lightGridOrigin = rpGlobalLightOrigin.xyz;\n"
|
||||
" float3 lightGridSize = rpJitterTexScale.xyz;\n"
|
||||
" int3 lightGridBounds = int3( rpJitterTexOffset.x, rpJitterTexOffset.y, rpJitterTexOffset.z );\n"
|
||||
"\n"
|
||||
" normalizedOctCoordZeroOne.x *= invXY;\n"
|
||||
" normalizedOctCoordZeroOne.y *= invZ;\n"
|
||||
" float invXZ = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[2] ) );\n"
|
||||
" float invY = ( 1.0 / lightGridBounds[1] );\n"
|
||||
"\n"
|
||||
" normalizedOctCoordZeroOne.x *= invXZ;\n"
|
||||
" normalizedOctCoordZeroOne.y *= invY;\n"
|
||||
"\n"
|
||||
" int3 gridStep;\n"
|
||||
"\n"
|
||||
|
@ -2866,8 +2870,8 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
"\n"
|
||||
" int3 gridCoord = GetBaseGridCoord( globalPosition );\n"
|
||||
"\n"
|
||||
" normalizedOctCoordZeroOne.x += ( gridCoord[0] * gridStep[0] + gridCoord[1] * gridStep[1] ) * invXY;\n"
|
||||
" normalizedOctCoordZeroOne.y += ( gridCoord[2] * invZ );\n"
|
||||
" normalizedOctCoordZeroOne.x += ( gridCoord[0] * gridStep[0] + gridCoord[2] * gridStep[1] ) * invXZ;\n"
|
||||
" normalizedOctCoordZeroOne.y += ( gridCoord[1] * invY );\n"
|
||||
"\n"
|
||||
" float4 envMap = tex2D( samp0, normalizedOctCoordZeroOne );\n"
|
||||
"\n"
|
||||
|
@ -4798,6 +4802,7 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
"};\n"
|
||||
"// *INDENT-ON*\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"// RB: TODO OPTIMIZE\n"
|
||||
"// this is a straight port of idBounds::RayIntersection\n"
|
||||
"bool AABBRayIntersection( float3 b[2], float3 start, float3 dir, out float scale )\n"
|
||||
|
@ -4880,15 +4885,14 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
"\n"
|
||||
" float3 globalPosition = fragment.texcoord7.xyz;\n"
|
||||
"\n"
|
||||
" // RB: rpGlobalLightOrigin is global view origin\n"
|
||||
" float3 globalEye = normalize( rpGlobalLightOrigin.xyz - globalPosition );\n"
|
||||
" float3 globalView = normalize( rpGlobalEyePos.xyz - globalPosition );\n"
|
||||
"\n"
|
||||
" float3 reflectionVector = globalNormal * dot3( globalEye, globalNormal );\n"
|
||||
" reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalEye );\n"
|
||||
" float3 reflectionVector = globalNormal * dot3( globalView, globalNormal );\n"
|
||||
" reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalView );\n"
|
||||
"\n"
|
||||
"#if 1\n"
|
||||
" // parallax box correction using portal area bounds\n"
|
||||
" float hitScale;\n"
|
||||
" float hitScale = 0.0;\n"
|
||||
" float3 bounds[2];\n"
|
||||
" bounds[0].x = rpWobbleSkyX.x;\n"
|
||||
" bounds[0].y = rpWobbleSkyX.y;\n"
|
||||
|
@ -4914,7 +4918,7 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
" }\n"
|
||||
"#endif\n"
|
||||
"\n"
|
||||
" half vDotN = saturate( dot3( globalEye, globalNormal ) );\n"
|
||||
" half vDotN = saturate( dot3( globalView, globalNormal ) );\n"
|
||||
"\n"
|
||||
"#if defined( USE_PBR )\n"
|
||||
" const half metallic = specMapSRGB.g;\n"
|
||||
|
@ -5296,36 +5300,6 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
"// *INDENT-ON*\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"float3 lightGridOrigin = float3( -192.0, -128.0, 0 );\n"
|
||||
"float3 lightGridSize = float3( 64.0, 64.0, 128.0 );\n"
|
||||
"int3 lightGridBounds = int3( 7, 7, 3 );\n"
|
||||
"\n"
|
||||
"int3 GetBaseGridCoord( float3 origin )\n"
|
||||
"{\n"
|
||||
" int3 pos;\n"
|
||||
"\n"
|
||||
" float3 lightOrigin = origin - lightGridOrigin;\n"
|
||||
" for( int i = 0; i < 3; i++ )\n"
|
||||
" {\n"
|
||||
" float v;\n"
|
||||
"\n"
|
||||
" v = lightOrigin[i] * ( 1.0f / lightGridSize[i] );\n"
|
||||
" pos[i] = int( floor( v ) );\n"
|
||||
"\n"
|
||||
" if( pos[i] < 0 )\n"
|
||||
" {\n"
|
||||
" pos[i] = 0;\n"
|
||||
" }\n"
|
||||
" else if( pos[i] >= lightGridBounds[i] - 1 )\n"
|
||||
" {\n"
|
||||
" pos[i] = lightGridBounds[i] - 1;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" return pos;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"// RB: TODO OPTIMIZE\n"
|
||||
"// this is a straight port of idBounds::RayIntersection\n"
|
||||
"bool AABBRayIntersection( float3 b[2], float3 start, float3 dir, out float scale )\n"
|
||||
|
@ -5408,15 +5382,14 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
"\n"
|
||||
" float3 globalPosition = fragment.texcoord7.xyz;\n"
|
||||
"\n"
|
||||
" // RB: rpGlobalLightOrigin is global view origin\n"
|
||||
" float3 globalEye = normalize( rpGlobalLightOrigin.xyz - globalPosition );\n"
|
||||
" float3 globalView = normalize( rpGlobalEyePos.xyz - globalPosition );\n"
|
||||
"\n"
|
||||
" float3 reflectionVector = globalNormal * dot3( globalEye, globalNormal );\n"
|
||||
" reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalEye );\n"
|
||||
" float3 reflectionVector = globalNormal * dot3( globalView, globalNormal );\n"
|
||||
" reflectionVector = normalize( ( reflectionVector * 2.0f ) - globalView );\n"
|
||||
"\n"
|
||||
"#if 1\n"
|
||||
" // parallax box correction using portal area bounds\n"
|
||||
" float hitScale;\n"
|
||||
" float hitScale = 0.0;\n"
|
||||
" float3 bounds[2];\n"
|
||||
" bounds[0].x = rpWobbleSkyX.x;\n"
|
||||
" bounds[0].y = rpWobbleSkyX.y;\n"
|
||||
|
@ -5442,7 +5415,7 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
" }\n"
|
||||
"#endif\n"
|
||||
"\n"
|
||||
" half vDotN = saturate( dot3( globalEye, globalNormal ) );\n"
|
||||
" half vDotN = saturate( dot3( globalView, globalNormal ) );\n"
|
||||
"\n"
|
||||
"#if defined( USE_PBR )\n"
|
||||
" const half metallic = specMapSRGB.g;\n"
|
||||
|
@ -5504,11 +5477,20 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
" float2 normalizedOctCoordZeroOne = ( normalizedOctCoord + float2( 1.0 ) ) * 0.5;\n"
|
||||
"\n"
|
||||
"// lightgrid atlas\n"
|
||||
" float invXY = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[1] ) );\n"
|
||||
" float invZ = ( 1.0 / lightGridBounds[2] );\n"
|
||||
"\n"
|
||||
" normalizedOctCoordZeroOne.x *= invXY;\n"
|
||||
" normalizedOctCoordZeroOne.y *= invZ;\n"
|
||||
" //float3 lightGridOrigin = float3( -192.0, -128.0, 0 );\n"
|
||||
" //float3 lightGridSize = float3( 64.0, 64.0, 128.0 );\n"
|
||||
" //int3 lightGridBounds = int3( 7, 7, 3 );\n"
|
||||
"\n"
|
||||
" float3 lightGridOrigin = rpGlobalLightOrigin.xyz;\n"
|
||||
" float3 lightGridSize = rpJitterTexScale.xyz;\n"
|
||||
" int3 lightGridBounds = int3( rpJitterTexOffset.x, rpJitterTexOffset.y, rpJitterTexOffset.z );\n"
|
||||
"\n"
|
||||
" float invXZ = ( 1.0 / ( lightGridBounds[0] * lightGridBounds[2] ) );\n"
|
||||
" float invY = ( 1.0 / lightGridBounds[1] );\n"
|
||||
"\n"
|
||||
" normalizedOctCoordZeroOne.x *= invXZ;\n"
|
||||
" normalizedOctCoordZeroOne.y *= invY;\n"
|
||||
"\n"
|
||||
" int3 gridCoord;\n"
|
||||
" float3 frac;\n"
|
||||
|
@ -5540,7 +5522,7 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
" gridStep[2] = lightGridBounds[0] * lightGridBounds[1];\n"
|
||||
"\n"
|
||||
" float totalFactor = 0.0;\n"
|
||||
" float3 irradiance;\n"
|
||||
" float3 irradiance = float3( 0.0, 0.0, 0.0 );\n"
|
||||
"\n"
|
||||
" /*\n"
|
||||
" for( int i = 0; i < 8; i++ )\n"
|
||||
|
@ -5583,8 +5565,8 @@ static const cgShaderDef_t cg_renderprogs[] =
|
|||
"\n"
|
||||
" float2 atlasOffset;\n"
|
||||
"\n"
|
||||
" atlasOffset.x = ( gridCoord2[0] * gridStep[0] + gridCoord2[1] * gridStep[1] ) * invXY;\n"
|
||||
" atlasOffset.y = ( gridCoord2[2] * invZ );\n"
|
||||
" atlasOffset.x = ( gridCoord2[0] * gridStep[0] + gridCoord2[2] * gridStep[1] ) * invXZ;\n"
|
||||
" atlasOffset.y = ( gridCoord2[1] * invY );\n"
|
||||
"\n"
|
||||
" irradiance += tex2D( samp7, normalizedOctCoordZeroOne + atlasOffset ).rgb * factor;\n"
|
||||
"\n"
|
||||
|
|
|
@ -670,10 +670,20 @@ CONSOLE_COMMAND( generateLightGrid, "Generate light grid data", NULL )
|
|||
}
|
||||
*/
|
||||
|
||||
#if 1
|
||||
int a = tr.primaryWorld->PointInArea( tr.primaryView->renderView.vieworg );
|
||||
if( a == -1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
#else
|
||||
for( int a = 0; a < tr.primaryWorld->NumAreas(); a++ )
|
||||
#endif
|
||||
{
|
||||
portalArea_t* area = &tr.primaryWorld->portalAreas[a];
|
||||
|
||||
idLib::Printf( "Shooting %i grid probes area %i...\n\n", area->lightGrid.lightGridPoints.Num(), a );
|
||||
|
||||
CommandlineProgressBar progressBar( area->lightGrid.lightGridPoints.Num() );
|
||||
if( !useThreads )
|
||||
{
|
||||
|
@ -789,15 +799,15 @@ CONSOLE_COMMAND( generateLightGrid, "Generate light grid data", NULL )
|
|||
|
||||
|
||||
|
||||
int atlasWidth = area->lightGrid.lightGridBounds[0] * area->lightGrid.lightGridBounds[1] * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
int atlasHeight = area->lightGrid.lightGridBounds[2] * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
int atlasWidth = area->lightGrid.lightGridBounds[0] * area->lightGrid.lightGridBounds[2] * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
int atlasHeight = area->lightGrid.lightGridBounds[1] * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
|
||||
idTempArray<halfFloat_t> irradianceAtlas( atlasWidth * atlasHeight * 3 );
|
||||
|
||||
// fill everything with solid red
|
||||
// fill everything with solid black
|
||||
for( int i = 0; i < ( atlasWidth * atlasHeight ); i++ )
|
||||
{
|
||||
irradianceAtlas[i * 3 + 0] = F32toF16( 1.0f );
|
||||
irradianceAtlas[i * 3 + 0] = F32toF16( 0.0f );
|
||||
irradianceAtlas[i * 3 + 1] = F32toF16( 0.0f );
|
||||
irradianceAtlas[i * 3 + 2] = F32toF16( 0.0f );
|
||||
}
|
||||
|
@ -815,8 +825,8 @@ CONSOLE_COMMAND( generateLightGrid, "Generate light grid data", NULL )
|
|||
{
|
||||
// gridPoint = lightGridPoints[ gridCoord[0] * gridStep[0] + gridCoord[1] * gridStep[1] + gridCoord[2] * gridStep[2] ];
|
||||
|
||||
int xx = x + ( job->gridCoord[0] * gridStep[0] + job->gridCoord[1] * gridStep[1] ) * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
int yy = y + job->gridCoord[2] * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
int xx = x + ( job->gridCoord[0] * gridStep[0] + job->gridCoord[2] * gridStep[1] ) * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
int yy = y + job->gridCoord[1] * LIGHTGRID_IRRADIANCE_SIZE;
|
||||
|
||||
irradianceAtlas[( yy * atlasWidth + xx ) * 3 + 0] = job->outBuffer[( y * LIGHTGRID_IRRADIANCE_SIZE + x ) * 3 + 0];
|
||||
irradianceAtlas[( yy * atlasWidth + xx ) * 3 + 1] = job->outBuffer[( y * LIGHTGRID_IRRADIANCE_SIZE + x ) * 3 + 1];
|
||||
|
|
Loading…
Reference in a new issue