diff --git a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/Cacao.cs b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/Cacao.cs index 064cbc92..d6920135 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/Cacao.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/Cacao.cs @@ -228,6 +228,8 @@ namespace FidelityFX public Vector2 DeinterleavedDepthBufferNormalisedOffset; public Matrix4x4 NormalsWorldToViewspaceMatrix; + + public Vector4 RTHandleScale; } [Serializable, StructLayout(LayoutKind.Sequential)] diff --git a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/CacaoContext.cs b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/CacaoContext.cs index f87286a2..ee4de138 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/CacaoContext.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/CACAO/CacaoContext.cs @@ -106,10 +106,10 @@ namespace FidelityFX private static readonly ProfilerMarker BilateralUpsampleMarker = new ProfilerMarker("Bilateral Upsample"); private static readonly ProfilerMarker ReinterleaveMarker = new ProfilerMarker("Reinterleave"); - public void Draw(CommandBuffer commandBuffer, in Cacao.DispatchInfo dispatchInfo, in Matrix4x4 proj, in Matrix4x4 normalsToView) + public void Draw(CommandBuffer commandBuffer, in Cacao.DispatchInfo dispatchInfo, in Matrix4x4 proj, in Matrix4x4 normalsToView, in Vector4 rtHandleScale) { // Update constant buffers - UpdateConstants(ref Constants, _settings, _bufferSizeInfo, proj, normalsToView); + UpdateConstants(ref Constants, _settings, _bufferSizeInfo, proj, normalsToView, rtHandleScale); commandBuffer.SetBufferData(_constantsBuffer, _constants); // Clear load counter @@ -241,7 +241,8 @@ namespace FidelityFX /// Cacao.BufferSizeInfo buffer size info. /// Projection matrix for the frame. /// Normals world space to view space matrix for the frame. - private static void UpdateConstants(ref Cacao.Constants consts, in Cacao.Settings settings, in Cacao.BufferSizeInfo bufferSizeInfo, in Matrix4x4 proj, in Matrix4x4 normalsToView) + /// Scale used for sampling input buffers. + private static void UpdateConstants(ref Cacao.Constants consts, in Cacao.Settings settings, in Cacao.BufferSizeInfo bufferSizeInfo, in Matrix4x4 proj, in Matrix4x4 normalsToView, in Vector4 rtHandleScale) { consts.BilateralSigmaSquared = settings.bilateralSigmaSquared; consts.BilateralSimilarityDistanceSigma = settings.bilateralSimilarityDistanceSigma; @@ -255,6 +256,8 @@ namespace FidelityFX consts.NormalsWorldToViewspaceMatrix = normalsToView; } + consts.RTHandleScale = rtHandleScale; + // used to get average load per pixel; 9.0 is there to compensate for only doing every 9th InterlockedAdd in PSPostprocessImportanceMapB for performance reasons consts.LoadCounterAvgDiv = 9.0f / (bufferSizeInfo.ImportanceMapWidth * bufferSizeInfo.ImportanceMapHeight * 255); diff --git a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/HDRenderPipeline.FidelityFX.Cacao.cs b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/HDRenderPipeline.FidelityFX.Cacao.cs index 87b42fbe..0a106e8f 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/HDRenderPipeline.FidelityFX.Cacao.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/HDRenderPipeline.FidelityFX.Cacao.cs @@ -21,6 +21,7 @@ namespace UnityEngine.Rendering.HighDefinition public Matrix4x4 projectionMatrix; public Matrix4x4 cameraToWorldMatrix; + public Vector4 rtHandleScale; } class RenderCacaoPassData @@ -30,6 +31,7 @@ namespace UnityEngine.Rendering.HighDefinition public Matrix4x4 projectionMatrix; public Matrix4x4 normalsToView; + public Vector4 rtHandleScale; public TextureHandle aoOutput; } @@ -82,6 +84,7 @@ namespace UnityEngine.Rendering.HighDefinition passData.normalBuffer = normalBuffer; passData.projectionMatrix = parameters.projectionMatrix; passData.normalsToView = parameters.cameraToWorldMatrix * Cacao.UnityToCacaoViewMatrix; + passData.rtHandleScale = parameters.rtHandleScale; builder.SetRenderFunc((RenderCacaoPassData data, RenderGraphContext ctx) => { @@ -96,7 +99,7 @@ namespace UnityEngine.Rendering.HighDefinition ctx.cmd.SetGlobalTexture("_NormalBufferTexture", data.normalBuffer); ctx.cmd.SetGlobalTexture("_OcclusionTexture", data.aoOutput); - m_CacaoContext.Draw(ctx.cmd, dispatchInfo, data.projectionMatrix, data.normalsToView); + m_CacaoContext.Draw(ctx.cmd, dispatchInfo, data.projectionMatrix, data.normalsToView, data.rtHandleScale); }); return passData.aoOutput; diff --git a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/ffx_cacao_common_hdrp.cginc b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/ffx_cacao_common_hdrp.cginc index ff397a7a..51ab895f 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/ffx_cacao_common_hdrp.cginc +++ b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/ffx_cacao_common_hdrp.cginc @@ -14,7 +14,7 @@ #define COORD_TEXTURE2D_X_LOD(coord, lod) uint3(coord, lod) #endif -float4 FFX_CACAO_Prepare_SampleDepthOffsets(float2 uv) +float4 FFX_CACAO_Prepare_SampleDepthOffsets_Unity(float2 uv) { float4 samples; samples.x = _CameraDepthTexture.SampleLevel(s_point_clamp_sampler, UV_TEXTURE2D_X(uv), 0.0f, int2(0, 2)).r; @@ -24,27 +24,27 @@ float4 FFX_CACAO_Prepare_SampleDepthOffsets(float2 uv) return samples; } -float4 FFX_CACAO_Prepare_GatherDepth(float2 uv) +float4 FFX_CACAO_Prepare_GatherDepth_Unity(float2 uv) { return _CameraDepthTexture.GatherRed(s_point_clamp_sampler, UV_TEXTURE2D_X(uv)); } -float FFX_CACAO_Prepare_LoadDepth(int2 coord) +float FFX_CACAO_Prepare_LoadDepth_Unity(int2 coord) { return _CameraDepthTexture.Load(COORD_TEXTURE2D_X_LOD(coord, 0)).r; } -float FFX_CACAO_Prepare_LoadDepthOffset(int2 coord, int2 offset) +float FFX_CACAO_Prepare_LoadDepthOffset_Unity(int2 coord, int2 offset) { return _CameraDepthTexture.Load(COORD_TEXTURE2D_X_LOD(coord, 0), offset).r; } -float4 FFX_CACAO_Prepare_GatherDepthOffset(float2 uv, int2 offset) +float4 FFX_CACAO_Prepare_GatherDepthOffset_Unity(float2 uv, int2 offset) { return _CameraDepthTexture.GatherRed(s_point_clamp_sampler, UV_TEXTURE2D_X(uv), offset); } -float4 FFX_CACAO_BilateralUpscale_LoadDepths(int2 coord) +float4 FFX_CACAO_BilateralUpscale_LoadDepths_Unity(int2 coord) { float4 depths; depths.x = _CameraDepthTexture.Load(COORD_TEXTURE2D_X_LOD(coord, 0), int2(0, 0)).r; @@ -54,7 +54,7 @@ float4 FFX_CACAO_BilateralUpscale_LoadDepths(int2 coord) return depths; } -float3 LoadSceneNormals(int2 coord) +float3 LoadSceneNormals_Unity(int2 coord) { NormalData normalData; DecodeFromNormalBuffer(coord, normalData); @@ -63,12 +63,12 @@ float3 LoadSceneNormals(int2 coord) RW_TEXTURE2D_X(float, _OcclusionTexture); -void FFX_CACAO_Apply_StoreOutput(uint2 coord, float val) +void FFX_CACAO_Apply_StoreOutput_Unity(uint2 coord, float val) { _OcclusionTexture[COORD_TEXTURE2D_X(coord)] = 1.0 - val; } -void FFX_CACAO_BilateralUpscale_StoreOutput(uint2 coord, int2 offset, float val) +void FFX_CACAO_BilateralUpscale_StoreOutput_Unity(uint2 coord, int2 offset, float val) { _OcclusionTexture[COORD_TEXTURE2D_X(coord + offset)] = 1.0 - val; } diff --git a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/shaders/cacao/ffx_cacao_callbacks_hlsl.h b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/shaders/cacao/ffx_cacao_callbacks_hlsl.h index 5486c288..fb7979fd 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/shaders/cacao/ffx_cacao_callbacks_hlsl.h +++ b/com.unity.render-pipelines.high-definition/Runtime/FidelityFX/shaders/cacao/ffx_cacao_callbacks_hlsl.h @@ -112,6 +112,8 @@ FfxFloat32x2 g_FFX_CACAO_DeinterleavedDepthBufferNormalisedOffset; float4x4 g_FFX_CACAO_NormalsWorldToViewspaceMatrix; + + FfxFloat32x4 g_FFX_CACAO_RTHandleScale; }; #define FFX_CACAO_CONSTANT_BUFFER_1_SIZE 172 // Number of 32-bit values. This must be kept in sync with max( cbRCAS , cbSPD) size. @@ -428,6 +430,15 @@ float4x4 NormalsWorldToViewspaceMatrix(){ #endif } +float2 ClampAndScaleUV(float2 UV) +{ +#if defined(CACAO_BIND_CB_CACAO) + return min(UV, 1.0f) * g_FFX_CACAO_RTHandleScale.xy; +#else + return UV; +#endif +} + #if defined(FFX_GPU) #define FFX_CACAO_ROOTSIG_STRINGIFY(p) FFX_CACAO_ROOTSIG_STR(p) #define FFX_CACAO_ROOTSIG_STR(p) #p @@ -645,18 +656,20 @@ FfxFloat32x2 FFX_CACAO_Apply_LoadSSAOPass(FfxUInt32x2 coord, FfxUInt32 passnum) #endif } -// void FFX_CACAO_Apply_StoreOutput(FfxUInt32x2 coord, FfxFloat32 val) -// { +void FFX_CACAO_Apply_StoreOutput(FfxUInt32x2 coord, FfxFloat32 val) +{ + FFX_CACAO_Apply_StoreOutput_Unity(coord, val); // #if defined CACAO_BIND_UAV_OUTPUT // g_RwOutput[coord] = val; // #endif -// } +} // ============================================================================= // Prepare -// FfxFloat32x4 FFX_CACAO_Prepare_SampleDepthOffsets(FfxFloat32x2 uv) -// { +FfxFloat32x4 FFX_CACAO_Prepare_SampleDepthOffsets(FfxFloat32x2 uv) +{ + return FFX_CACAO_Prepare_SampleDepthOffsets_Unity(ClampAndScaleUV(uv)); // #if defined CACAO_BIND_SRV_DEPTH_IN // FfxFloat32x4 samples; // samples.x = g_DepthIn.SampleLevel(g_PointClampSampler, uv, 0.0f, FfxInt32x2(0, 2)); @@ -667,49 +680,53 @@ FfxFloat32x2 FFX_CACAO_Apply_LoadSSAOPass(FfxUInt32x2 coord, FfxUInt32 passnum) // #else // return FfxFloat32x4(0, 0, 0, 0); // #endif -// } -// -// FfxFloat32x4 FFX_CACAO_Prepare_GatherDepth(FfxFloat32x2 uv) -// { +} + +FfxFloat32x4 FFX_CACAO_Prepare_GatherDepth(FfxFloat32x2 uv) +{ + return FFX_CACAO_Prepare_GatherDepth_Unity(uv); // #if defined CACAO_BIND_SRV_DEPTH_IN // return g_DepthIn.GatherRed(g_PointClampSampler, uv); // #else // return FfxFloat32x4(0, 0, 0, 0); // #endif -// } -// -// FfxFloat32 FFX_CACAO_Prepare_LoadDepth(FfxUInt32x2 coord) -// { +} + +FfxFloat32 FFX_CACAO_Prepare_LoadDepth(FfxUInt32x2 coord) +{ + return FFX_CACAO_Prepare_LoadDepth_Unity(coord); // #if defined CACAO_BIND_SRV_DEPTH_IN // return g_DepthIn.Load(FfxInt32x3(coord, 0)); // #else // return 0; // #endif -// } -// -// FfxFloat32 FFX_CACAO_Prepare_LoadDepthOffset(FfxUInt32x2 coord, FfxInt32x2 offset) -// { +} + +FfxFloat32 FFX_CACAO_Prepare_LoadDepthOffset(FfxUInt32x2 coord, FfxInt32x2 offset) +{ + return FFX_CACAO_Prepare_LoadDepthOffset_Unity(coord, offset); // #if defined CACAO_BIND_SRV_DEPTH_IN // return g_DepthIn.Load(FfxInt32x3(coord, 0), offset); // #else // return 0; // #endif -// } -// -// FfxFloat32x4 FFX_CACAO_Prepare_GatherDepthOffset(FfxFloat32x2 uv, FfxInt32x2 offset) -// { +} + +FfxFloat32x4 FFX_CACAO_Prepare_GatherDepthOffset(FfxFloat32x2 uv, FfxInt32x2 offset) +{ + return FFX_CACAO_Prepare_GatherDepthOffset_Unity(ClampAndScaleUV(uv), offset); // #if defined CACAO_BIND_SRV_DEPTH_IN // return g_DepthIn.GatherRed(g_PointClampSampler, uv, offset); // #else // return FfxFloat32x4(0, 0, 0, 0); // #endif -// } +} FfxFloat32x3 FFX_CACAO_Prepare_LoadNormal(FfxUInt32x2 coord) { #if defined CACAO_BIND_SRV_NORMAL_IN //FfxFloat32x3 normal = g_NormalIn.Load(FfxInt32x3(coord, 0)).xyz; - FfxFloat32x3 normal = LoadSceneNormals(coord); + FfxFloat32x3 normal = LoadSceneNormals_Unity(coord); //normal = normal * NormalsUnpackMul().xxx + NormalsUnpackAdd().xxx; normal = mul(normal, (float3x3)NormalsWorldToViewspaceMatrix()).xyz; // normal = normalize(normal); @@ -824,12 +841,13 @@ void FFX_CACAO_Importance_LoadCounterInterlockedAdd(FfxUInt32 val) // These resources ping/pong which is handled by schedule dispatch -// void FFX_CACAO_BilateralUpscale_StoreOutput(FfxUInt32x2 coord, FfxInt32x2 offset, FfxFloat32 val) -// { +void FFX_CACAO_BilateralUpscale_StoreOutput(FfxUInt32x2 coord, FfxInt32x2 offset, FfxFloat32 val) +{ + FFX_CACAO_BilateralUpscale_StoreOutput_Unity(coord, offset, val); // #if defined CACAO_BIND_UAV_OUTPUT // g_RwOutput[coord + offset] = val; // #endif -// } +} FfxFloat32 FFX_CACAO_BilateralUpscale_SampleSSAOLinear(FfxFloat32x2 uv, FfxUInt32 index) { @@ -858,8 +876,9 @@ FfxFloat32x2 FFX_CACAO_BilateralUpscale_LoadSSAO(FfxUInt32x2 coord, FfxUInt32 in #endif } -// FfxFloat32x4 FFX_CACAO_BilateralUpscale_LoadDepths(FfxUInt32x2 coord) -// { +FfxFloat32x4 FFX_CACAO_BilateralUpscale_LoadDepths(FfxUInt32x2 coord) +{ + return FFX_CACAO_BilateralUpscale_LoadDepths_Unity(coord); // FfxFloat32x4 depths; // #if defined CACAO_BIND_SRV_DEPTH_IN // depths.x = g_DepthIn.Load(FfxInt32x3(coord, 0), FfxInt32x2(0, 0)); @@ -870,7 +889,7 @@ FfxFloat32x2 FFX_CACAO_BilateralUpscale_LoadSSAO(FfxUInt32x2 coord, FfxUInt32 in // #else // return FfxFloat32x4(0, 0, 0, 0); // #endif -// } +} FfxFloat32 FFX_CACAO_BilateralUpscale_LoadDownscaledDepth(FfxUInt32x2 coord, FfxUInt32 index) { diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/HDRenderPipeline.AmbientOcclusion.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/HDRenderPipeline.AmbientOcclusion.cs index 37784d37..186164b8 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/HDRenderPipeline.AmbientOcclusion.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/HDRenderPipeline.AmbientOcclusion.cs @@ -164,6 +164,7 @@ namespace UnityEngine.Rendering.HighDefinition downsample = !settings.fullResolution, projectionMatrix = hdCamera.camera.projectionMatrix, cameraToWorldMatrix = hdCamera.camera.cameraToWorldMatrix, + rtHandleScale = hdCamera.historyRTHandleProperties.rtHandleScale, }; cacaoParameters.settings.radius = settings.radius.value;