Include modelMatrix in new SSAO compute shader constant buffer

This commit is contained in:
Stephen Saunders 2023-01-29 23:38:40 -05:00
parent 866244ffdd
commit 6d83ad0f8d
4 changed files with 45 additions and 23 deletions

View file

@ -34,8 +34,13 @@ If you have questions concerning this license or the applicable additional terms
struct SsaoConstants
{
idVec2i viewportOrigin;
idVec2i viewportSize;
idVec2 viewportOrigin;
idVec2 viewportSize;
idVec4 modelMatrixX;
idVec4 modelMatrixY;
idVec4 modelMatrixZ;
idVec4 modelMatrixW;
idVec2 clipToView;
idVec2 invQuantizedGbufferSize;
@ -244,8 +249,9 @@ void SsaoPass::Render(
quarterResExtent.maxY = ( quarterResExtent.maxY + 3 ) / 4;
SsaoConstants ssaoConstants = {};
ssaoConstants.viewportOrigin = idVec2i( viewDef->viewport.x1, viewDef->viewport.y1 );
ssaoConstants.viewportSize = idVec2i( viewDef->viewport.GetWidth(), viewDef->viewport.GetHeight() );
ssaoConstants.viewportOrigin = idVec2( viewDef->viewport.x1, viewDef->viewport.y1 );
ssaoConstants.viewportSize = idVec2( viewDef->viewport.GetWidth(), viewDef->viewport.GetHeight() );
idRenderMatrix::CopyMatrix( *( idRenderMatrix* )viewDef->worldSpace.modelMatrix, ssaoConstants.modelMatrixX, ssaoConstants.modelMatrixY, ssaoConstants.modelMatrixZ, ssaoConstants.modelMatrixW );
ssaoConstants.clipToView = idVec2(
viewDef->projectionMatrix[2 * 4 + 3] / viewDef->projectionMatrix[0 * 4 + 0],
viewDef->projectionMatrix[2 * 4 + 3] / viewDef->projectionMatrix[1 * 4 + 1] );

View file

@ -26,8 +26,13 @@
struct SsaoConstants
{
int2 viewportOrigin;
int2 viewportSize;
float2 viewportOrigin;
float2 viewportSize;
float4 modelMatrixX;
float4 modelMatrixY;
float4 modelMatrixZ;
float4 modelMatrixW;
float2 clipToView;
float2 invQuantizedGbufferSize;
@ -171,8 +176,9 @@ void main( uint2 groupId : SV_GroupID, uint2 threadId : SV_GroupThreadID, uint2
#endif
int2 storePos = int2( globalId.xy ) + g_Ssao.quantizedViewportOrigin;
float2 storePosF = float2( storePos );
if (all(storePos >= g_Ssao.viewportOrigin.xy) && all(storePos < g_Ssao.viewportOrigin.xy + g_Ssao.viewportSize.xy))
if (all(storePosF >= g_Ssao.viewportOrigin.xy) && all(storePosF < g_Ssao.viewportOrigin.xy + g_Ssao.viewportSize.xy))
{
u_RenderTarget[storePos] = totalOcclusion;
}

View file

@ -26,8 +26,13 @@
struct SsaoConstants
{
int2 viewportOrigin;
int2 viewportSize;
float2 viewportOrigin;
float2 viewportSize;
float4 modelMatrixX;
float4 modelMatrixY;
float4 modelMatrixZ;
float4 modelMatrixW;
float2 clipToView;
float2 invQuantizedGbufferSize;
@ -172,8 +177,8 @@ float ComputeAO( float3 V, float3 N, float InvR2 )
float2 WindowToClip( float2 windowPos )
{
float2 clipToWindowScale = float2( 0.5f * rpWindowCoord.z, -0.5f * rpWindowCoord.w );
float2 clipToWindowBias = rpViewOrigin.xy + rpWindowCoord.zw * 0.5f;
float2 clipToWindowScale = float2( 0.5f * g_Ssao.viewportSize.x, -0.5f * g_Ssao.viewportSize.y );
float2 clipToWindowBias = g_Ssao.viewportOrigin.xy + g_Ssao.viewportSize.xy * 0.5f;
float2 windowToClipScale = 1.f / clipToWindowScale;
float2 windowToClipBias = -clipToWindowBias * windowToClipScale;
@ -204,9 +209,9 @@ void main( uint3 globalId : SV_DispatchThreadID )
// View to clip space.
float3 pN;
pN.x = dot4( float4( pixelNormal, 0 ), rpModelMatrixX );
pN.y = dot4( float4( pixelNormal, 0 ), rpModelMatrixY );
pN.z = dot4( float4( pixelNormal, 0 ), rpModelMatrixZ );
pN.x = dot4( float4( pixelNormal, 0 ), g_Ssao.modelMatrixX );
pN.y = dot4( float4( pixelNormal, 0 ), g_Ssao.modelMatrixY );
pN.z = dot4( float4( pixelNormal, 0 ), g_Ssao.modelMatrixZ );
pixelNormal = normalize( pN );
@ -272,9 +277,9 @@ void main( uint3 globalId : SV_DispatchThreadID )
if( directionalLength > 0 )
{
float3 worldSpaceResult;
worldSpaceResult.x = dot4( float4( normalize( result.xyz ), 0 ), rpModelMatrixX );
worldSpaceResult.y = dot4( float4( normalize( result.xyz ), 0 ), rpModelMatrixY );
worldSpaceResult.z = dot4( float4( normalize( result.xyz ), 0 ), rpModelMatrixZ );
worldSpaceResult.x = dot4( float4( normalize( result.xyz ), 0 ), g_Ssao.modelMatrixX );
worldSpaceResult.y = dot4( float4( normalize( result.xyz ), 0 ), g_Ssao.modelMatrixY );
worldSpaceResult.z = dot4( float4( normalize( result.xyz ), 0 ), g_Ssao.modelMatrixZ );
result.xyz = worldSpaceResult.xyz * directionalLength;
}

View file

@ -26,8 +26,13 @@
struct SsaoConstants
{
int2 viewportOrigin;
int2 viewportSize;
float2 viewportOrigin;
float2 viewportSize;
float4 modelMatrixX;
float4 modelMatrixY;
float4 modelMatrixZ;
float4 modelMatrixW;
float2 clipToView;
float2 invQuantizedGbufferSize;
@ -72,10 +77,10 @@ void main( uint3 globalId : SV_DispatchThreadID )
#else
float4 clipPos = float4( 0, 0, depth, 1 );
float4 viewPos;
viewPos.x = dot4( clipPos, rpModelMatrixX );
viewPos.y = dot4( clipPos, rpModelMatrixY );
viewPos.z = dot4( clipPos, rpModelMatrixZ );
viewPos.w = dot4( clipPos, rpModelMatrixW );
viewPos.x = dot4( clipPos, g_Ssao.modelMatrixX );
viewPos.y = dot4( clipPos, g_Ssao.modelMatrixY );
viewPos.z = dot4( clipPos, g_Ssao.modelMatrixZ );
viewPos.w = dot4( clipPos, g_Ssao.modelMatrixW );
float linearDepth = viewPos.z / viewPos.w;
#endif