mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2025-04-24 10:38:53 +00:00
Include modelMatrix in new SSAO compute shader constant buffer
This commit is contained in:
parent
866244ffdd
commit
6d83ad0f8d
4 changed files with 45 additions and 23 deletions
|
@ -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] );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue