Rasagar/Library/PackageCache/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/ReblurDenoiser.cs
2024-08-26 23:07:20 +03:00

494 lines
30 KiB
C#

using Unity.Mathematics;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
namespace UnityEngine.Rendering.HighDefinition
{
[GenerateHLSL(needAccessors = false, generateCBuffer = true)]
unsafe struct ShaderVariablesReBlur
{
public float4 _ReBlurPreBlurRotator;
public float4 _ReBlurBlurRotator;
public float4 _ReBlurPostBlurRotator;
public float4 _HistorySizeAndScale;
public Vector2 _ReBlurPadding;
public float _ReBlurDenoiserRadius;
public float _ReBlurAntiFlickeringStrength;
public float _ReBlurHistoryValidity;
public float _PaddingRBD0;
public float _PaddingRBD1;
public float _PaddingRBD2;
}
class ReBlurDenoiser
{
// Random numbers used to do the local rotations for the blur passes
public static readonly float[] k_PreBlurRands = new float[] { 0.840188f, 0.394383f, 0.783099f, 0.79844f, 0.911647f, 0.197551f, 0.335223f, 0.76823f, 0.277775f, 0.55397f, 0.477397f, 0.628871f, 0.364784f, 0.513401f, 0.95223f, 0.916195f, 0.635712f, 0.717297f, 0.141603f, 0.606969f, 0.0163006f, 0.242887f, 0.137232f, 0.804177f, 0.156679f, 0.400944f, 0.12979f, 0.108809f, 0.998924f, 0.218257f, 0.512932f, 0.839112f};
public static readonly float[] k_BlurRands = new float[] { 0.61264f, 0.296032f, 0.637552f, 0.524287f, 0.493583f, 0.972775f, 0.292517f, 0.771358f, 0.526745f, 0.769914f, 0.400229f, 0.891529f, 0.283315f, 0.352458f, 0.807725f, 0.919026f, 0.0697553f, 0.949327f, 0.525995f, 0.0860558f, 0.192214f, 0.663227f, 0.890233f, 0.348893f, 0.0641713f, 0.020023f, 0.457702f, 0.0630958f, 0.23828f, 0.970634f, 0.902208f, 0.85092f};
public static readonly float[] k_PostBlurRands = new float[] { 0.266666f, 0.53976f, 0.375207f, 0.760249f, 0.512535f, 0.667724f, 0.531606f, 0.0392803f, 0.437638f, 0.931835f, 0.93081f, 0.720952f, 0.284293f, 0.738534f, 0.639979f, 0.354049f, 0.687861f, 0.165974f, 0.440105f, 0.880075f, 0.829201f, 0.330337f, 0.228968f, 0.893372f, 0.35036f, 0.68667f, 0.956468f, 0.58864f, 0.657304f, 0.858676f, 0.43956f, 0.92397f};
// Compute shaders and kernels
ComputeShader m_PreBlurCS;
int m_PreBlurKernel;
ComputeShader m_TemporalAccumulationCS;
int m_TemporalAccumulationKernel;
ComputeShader m_MipGenerationCS;
int m_MipGenerationKernel;
int m_CopyMipKernel;
ComputeShader m_HistoryFixCS;
int m_HistoryFixKernel;
ComputeShader m_BlurCS;
int m_BlurKernel;
ComputeShader m_PostBlurCS;
int m_PostBlurKernel;
ComputeShader m_CopyHistoryCS;
int m_CopyHistoryAccumulationKernel;
int m_CopyHistoryKernel;
ComputeShader m_TemporalStabilizationCS;
int m_TemporalStabilizationKernel;
// Shader IDs
public static readonly int _ShaderVariablesReBlur = Shader.PropertyToID("ShaderVariablesReBlur");
public static readonly int _TargetMipLevel = Shader.PropertyToID("_TargetMipLevel");
public static readonly int _ReBlurMipChain = Shader.PropertyToID("_ReBlurMipChain");
public static readonly int _LightingDistanceTexture = Shader.PropertyToID("_LightingDistanceTexture");
public static readonly int _LightingDistanceTextureRW = Shader.PropertyToID("_LightingDistanceTextureRW");
public static readonly int _AccumulationTexture = Shader.PropertyToID("_AccumulationTexture");
public static readonly int _AccumulationTextureRW = Shader.PropertyToID("_AccumulationTextureRW");
public static readonly int _LightingDistanceHistoryBuffer = Shader.PropertyToID("_LightingDistanceHistoryBuffer");
public static readonly int _AccumulationHistoryBuffer = Shader.PropertyToID("_AccumulationHistoryBuffer");
public static readonly int _StabilizationHistoryBuffer = Shader.PropertyToID("_StabilizationHistoryBuffer");
public ReBlurDenoiser()
{
}
public void Init(HDRPRayTracingResources rpRTResources)
{
// PreBlur
m_PreBlurCS = rpRTResources.reblurPreBlurCS;
m_PreBlurKernel = m_PreBlurCS.FindKernel("PreBlur");
// Temporal Accumulation
m_TemporalAccumulationCS = rpRTResources.reblurTemporalAccumulationCS;
m_TemporalAccumulationKernel = m_TemporalAccumulationCS.FindKernel("TemporalAccumulation");
// MIP Generation
m_MipGenerationCS = rpRTResources.reblurMipGenerationCS;
m_MipGenerationKernel = m_MipGenerationCS.FindKernel("MipGeneration");
m_CopyMipKernel = m_MipGenerationCS.FindKernel("CopyMip");
// History Fix
m_HistoryFixCS = rpRTResources.reblurHistoryFixCS;
m_HistoryFixKernel = m_HistoryFixCS.FindKernel("HistoryFix");
// Blur
m_BlurCS = rpRTResources.reblurBlurCS;
m_BlurKernel = m_BlurCS.FindKernel("Blur");
// Post Blur
m_PostBlurCS = rpRTResources.reblurPostBlurCS;
m_PostBlurKernel = m_PostBlurCS.FindKernel("PostBlur");
// Copy History
m_CopyHistoryCS = rpRTResources.reblurCopyHistoryCS;
m_CopyHistoryAccumulationKernel = m_CopyHistoryCS.FindKernel("CopyHistoryAccumulation");
m_CopyHistoryKernel = m_CopyHistoryCS.FindKernel("CopyHistory");
// Temporal Stabilization
m_TemporalStabilizationCS = rpRTResources.reblurTemporalStabilizationCS;
m_TemporalStabilizationKernel = m_TemporalStabilizationCS.FindKernel("TemporalStabilization");
}
public void Release()
{
}
class ReblurIndirectSpecularPassData
{
// Camera parameters
public int texWidth;
public int texHeight;
public int viewCount;
// Denoiser parameters
public bool fullResolution;
public float historyValidity;
public Vector4 historySizeAndScale;
// Constant buffer
public ShaderVariablesReBlur reblurCB;
// Compute shaders and kernels
public ComputeShader preBlurCS;
public int preBlurKernel;
public ComputeShader temporalAccumulationCS;
public int temporalAccumulationKernel;
public ComputeShader mipGenerationCS;
public int mipGenerationKernel;
public int copyMipKernel;
public ComputeShader historyFixCS;
public int historyFixKernel;
public ComputeShader blurCS;
public int blurKernel;
public ComputeShader postBlurCS;
public int postBlurKernel;
public ComputeShader copyHistoryCS;
public int copyHistoryAccumulationKernel;
public int copyHistoryKernel;
public ComputeShader temporalStabilizationCS;
public int temporalStabilizationKernel;
// Input resources
public TextureHandle depthBuffer;
public TextureHandle depthPyramidBuffer;
public TextureHandle stencilBuffer;
public TextureHandle normalBuffer;
public TextureHandle motionVectorBuffer;
public TextureHandle clearCoatTexture;
public TextureHandle historyValidation;
public TextureHandle distanceTexture;
// Temp resources
public TextureHandle accTexture;
public TextureHandle mipTexture;
public TextureHandle tmpTexture;
// History
public TextureHandle mainHistory;
public TextureHandle accumulationHistory;
public TextureHandle stabilizationHistory;
public TextureHandle historyDepth;
// In/out buffer
public TextureHandle lightingTexture;
}
float4 EvaluateRotator(float rand)
{
float ca = Mathf.Cos(rand);
float sa = Mathf.Sin(rand);
return new float4(ca, sa, -sa, ca);
}
static void GenerateMipLevels(CommandBuffer cmd, ReblurIndirectSpecularPassData data)
{
using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.ReBlurMipGeneration)))
{
// Evaluate the dispatch parameters
int tileSize = 8;
int numTilesX = (data.texWidth + (tileSize - 1)) / tileSize;
int numTilesY = (data.texHeight + (tileSize - 1)) / tileSize;
// Mip0 is copied as is.
cmd.SetComputeIntParam(data.mipGenerationCS, _TargetMipLevel, 0);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.copyMipKernel, _LightingDistanceTexture, data.lightingTexture);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.copyMipKernel, _LightingDistanceTextureRW, data.mipTexture, 0);
cmd.DispatchCompute(data.mipGenerationCS, data.copyMipKernel, numTilesX, numTilesY, data.viewCount);
// Mip1 is generated
int numTilesX_1 = (data.texWidth / 2 + (tileSize - 1)) / tileSize;
int numTilesY_1 = (data.texHeight / 2 + (tileSize - 1)) / tileSize;
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, _LightingDistanceTexture, data.lightingTexture);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, HDShaderIDs._DepthTexture, data.depthPyramidBuffer);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, _LightingDistanceTextureRW, data.mipTexture, 1);
cmd.DispatchCompute(data.mipGenerationCS, data.mipGenerationKernel, numTilesX_1, numTilesY_1, data.viewCount);
// Mip2 is generated
int numTilesX_2 = (data.texWidth / 4 + (tileSize - 1)) / tileSize;
int numTilesY_2 = (data.texHeight / 4 + (tileSize - 1)) / tileSize;
cmd.SetComputeIntParam(data.mipGenerationCS, _TargetMipLevel, 1);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, _LightingDistanceTexture, data.mipTexture);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, HDShaderIDs._DepthTexture, data.depthPyramidBuffer);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, _LightingDistanceTextureRW, data.tmpTexture, 2);
cmd.DispatchCompute(data.mipGenerationCS, data.mipGenerationKernel, numTilesX_2, numTilesY_2, data.viewCount);
// Copy the mip
cmd.SetComputeIntParam(data.mipGenerationCS, _TargetMipLevel, 2);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.copyMipKernel, _LightingDistanceTexture, data.tmpTexture);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.copyMipKernel, _LightingDistanceTextureRW, data.mipTexture, 2);
cmd.DispatchCompute(data.mipGenerationCS, data.copyMipKernel, numTilesX_2, numTilesY_2, data.viewCount);
// Mip3 is generated
int numTilesX_3 = (data.texWidth / 8 + (tileSize - 1)) / tileSize;
int numTilesY_3 = (data.texHeight / 8 + (tileSize - 1)) / tileSize;
cmd.SetComputeIntParam(data.mipGenerationCS, _TargetMipLevel, 2);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, _LightingDistanceTexture, data.tmpTexture);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, HDShaderIDs._DepthTexture, data.depthPyramidBuffer);
cmd.SetComputeTextureParam(data.mipGenerationCS, data.mipGenerationKernel, _LightingDistanceTextureRW, data.mipTexture, 3);
cmd.DispatchCompute(data.mipGenerationCS, data.mipGenerationKernel, numTilesX_3, numTilesY_3, data.viewCount);
}
}
public TextureHandle DenoiseIndirectSpecular(RenderGraph renderGraph, HDCamera hdCamera, bool fullResolution, float historyValidity, float denoiserRadius, float antiFlickeringStrength,
in HDRenderPipeline.PrepassOutput prepassOutput, TextureHandle clearCoatTexture,
TextureHandle historyValidation,
TextureHandle lightingTexture, TextureHandle distanceTexture,
RTHandle mainHistory, RTHandle accumulationHistory, RTHandle stabilizationHistory)
{
using (var builder = renderGraph.AddRenderPass<ReblurIndirectSpecularPassData>("ReBlur Indirect Specular", out var passData, ProfilingSampler.Get(HDProfileId.RaytracingReflectionFilter)))
{
builder.EnableAsyncCompute(false);
// Camera parameters
passData.texWidth = hdCamera.actualWidth;
passData.texHeight = hdCamera.actualHeight;
passData.viewCount = hdCamera.viewCount;
// Denoiser parameters
passData.fullResolution = fullResolution;
passData.historyValidity = historyValidity;
// Generate the rotators
uint frameIndex = hdCamera.GetCameraFrameCount() % 32;
passData.reblurCB._ReBlurPreBlurRotator = EvaluateRotator(k_PreBlurRands[frameIndex]);
passData.reblurCB._ReBlurBlurRotator = EvaluateRotator(k_BlurRands[frameIndex]);
passData.reblurCB._ReBlurPostBlurRotator = EvaluateRotator(k_PostBlurRands[frameIndex]);
passData.reblurCB._HistorySizeAndScale = HDRenderPipeline.EvaluateRayTracingHistorySizeAndScale(hdCamera, mainHistory);
passData.reblurCB._ReBlurDenoiserRadius = Mathf.Lerp(0.5f, 1.0f, denoiserRadius);
passData.reblurCB._ReBlurHistoryValidity = historyValidity;
float minAntiflicker = 0.0f;
float maxAntiflicker = 3.5f;
passData.reblurCB._ReBlurAntiFlickeringStrength = Mathf.Lerp(minAntiflicker, maxAntiflicker, antiFlickeringStrength);
// CS & Kernels
passData.preBlurCS = m_PreBlurCS;
passData.preBlurKernel = m_PreBlurKernel;
passData.temporalAccumulationCS = m_TemporalAccumulationCS;
passData.temporalAccumulationKernel = m_TemporalAccumulationKernel;
passData.mipGenerationCS = m_MipGenerationCS;
passData.mipGenerationKernel = m_MipGenerationKernel;
passData.copyMipKernel = m_CopyMipKernel;
passData.historyFixCS = m_HistoryFixCS;
passData.historyFixKernel = m_HistoryFixKernel;
passData.blurCS = m_BlurCS;
passData.blurKernel = m_BlurKernel;
passData.postBlurCS = m_PostBlurCS;
passData.postBlurKernel = m_PostBlurKernel;
passData.copyHistoryCS = m_CopyHistoryCS;
passData.copyHistoryAccumulationKernel = m_CopyHistoryAccumulationKernel;
passData.copyHistoryKernel = m_CopyHistoryKernel;
passData.temporalStabilizationCS = m_TemporalStabilizationCS;
passData.temporalStabilizationKernel = m_TemporalStabilizationKernel;
// Input resources
passData.lightingTexture = builder.ReadTexture(lightingTexture);
passData.distanceTexture = builder.ReadTexture(distanceTexture);
passData.depthBuffer = builder.ReadTexture(prepassOutput.depthBuffer);
passData.depthPyramidBuffer = builder.ReadTexture(prepassOutput.depthPyramidTexture);
passData.stencilBuffer = builder.ReadTexture(prepassOutput.stencilBuffer);
passData.normalBuffer = builder.ReadTexture(prepassOutput.normalBuffer);
passData.motionVectorBuffer = builder.ReadTexture(prepassOutput.resolvedMotionVectorsBuffer);
passData.clearCoatTexture = builder.ReadTexture(clearCoatTexture);
passData.historyValidation = builder.ReadTexture(historyValidation);
var historyDepth = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.Depth);
passData.historyDepth = historyDepth != null ? builder.ReadTexture(renderGraph.ImportTexture(historyDepth)) : renderGraph.defaultResources.blackTextureXR;
// Temporary textures
passData.accTexture = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true)
{ colorFormat = GraphicsFormat.R8_UInt, enableRandomWrite = true, useMipMap = true, autoGenerateMips = false, name = "ReBlur Acc Texture" });
passData.mipTexture = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true)
{ colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, useMipMap = true, autoGenerateMips = false, name = "ReBlur Color Pyramid" });
passData.tmpTexture = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true)
{ colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, useMipMap = true, autoGenerateMips = false, name = "ReBlur Color Pyramid Bis" });
// Output resources
passData.mainHistory = builder.ReadWriteTexture(renderGraph.ImportTexture(mainHistory));
passData.accumulationHistory = builder.ReadWriteTexture(renderGraph.ImportTexture(accumulationHistory));
passData.stabilizationHistory = builder.ReadWriteTexture(renderGraph.ImportTexture(stabilizationHistory));
builder.SetRenderFunc((ReblurIndirectSpecularPassData data, RenderGraphContext ctx) =>
{
// Evaluate the dispatch parameters
int tileSize = 8;
// Tile count to dispatch
int numTilesX = (data.texWidth + (tileSize - 1)) / tileSize;
int numTilesY = (data.texHeight + (tileSize - 1)) / tileSize;
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurPreBlur)))
{
// Set the half res keyword
CoreUtils.SetKeyword(ctx.cmd, "HALF_RESOLUTION", !data.fullResolution);
// Input data
ConstantBuffer.Push(ctx.cmd, data.reblurCB, data.preBlurCS, _ShaderVariablesReBlur);
ctx.cmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._LightingInputTexture, data.lightingTexture);
ctx.cmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._DistanceInputTexture, data.distanceTexture);
ctx.cmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
ctx.cmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
ctx.cmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
ctx.cmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
// Output texture
ctx.cmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, _LightingDistanceTextureRW, data.tmpTexture);
// Dispatch
ctx.cmd.DispatchCompute(data.preBlurCS, data.preBlurKernel, numTilesX, numTilesY, data.viewCount);
// Reset the half res keyword
CoreUtils.SetKeyword(ctx.cmd, "HALF_RESOLUTION", false);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurTemporalAccumulation)))
{
// Input CB
ConstantBuffer.Push(ctx.cmd, data.reblurCB, data.temporalAccumulationCS, _ShaderVariablesReBlur);
// Simplified GBuffer + History
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._CameraMotionVectorsTexture, data.motionVectorBuffer);
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._HistoryDepthTexture, data.historyDepth);
// Input Data
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _LightingDistanceTexture, data.tmpTexture);
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._ValidationBuffer, data.historyValidation);
// History buffer
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _LightingDistanceHistoryBuffer, data.mainHistory);
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _AccumulationHistoryBuffer, data.accumulationHistory);
// Output texture
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _LightingDistanceTextureRW, data.lightingTexture);
ctx.cmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _AccumulationTextureRW, data.accTexture);
// Dispatch
ctx.cmd.DispatchCompute(data.temporalAccumulationCS, data.temporalAccumulationKernel, numTilesX, numTilesY, data.viewCount);
}
// Generate the mip levels required for the history fix.
GenerateMipLevels(ctx.cmd, data);
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurMipHistoryFix)))
{
// Mini GBuffer
ctx.cmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
ctx.cmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
ctx.cmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _ReBlurMipChain, data.mipTexture);
// Input Data
ctx.cmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _LightingDistanceTexture, data.lightingTexture);
ctx.cmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _AccumulationTexture, data.accTexture);
// Output texture
ctx.cmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _LightingDistanceTextureRW, data.tmpTexture);
// Dispatch
ctx.cmd.DispatchCompute(data.historyFixCS, data.historyFixKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurBlur)))
{
ConstantBuffer.Push(ctx.cmd, data.reblurCB, data.blurCS, _ShaderVariablesReBlur);
// Mini GBuffer
ctx.cmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
ctx.cmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
ctx.cmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
ctx.cmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
// Input Data
ctx.cmd.SetComputeTextureParam(data.blurCS, data.blurKernel, _LightingDistanceTexture, data.tmpTexture);
ctx.cmd.SetComputeTextureParam(data.blurCS, data.blurKernel, _AccumulationTexture, data.accTexture);
// Output Data
ctx.cmd.SetComputeTextureParam(data.blurCS, data.blurKernel, _LightingDistanceTextureRW, data.lightingTexture);
// Dispatch
ctx.cmd.DispatchCompute(data.blurCS, data.blurKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurCopyHistory)))
{
// Current Data
ctx.cmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _LightingDistanceTexture, data.lightingTexture);
ctx.cmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _AccumulationTexture, data.accTexture);
// History buffers
ctx.cmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _LightingDistanceTextureRW, data.mainHistory);
ctx.cmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _AccumulationTextureRW, data.accumulationHistory);
// Dispatch
ctx.cmd.DispatchCompute(data.copyHistoryCS, data.copyHistoryAccumulationKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurTemporalStabilization)))
{
ConstantBuffer.Push(ctx.cmd, data.reblurCB, data.temporalStabilizationCS, _ShaderVariablesReBlur);
// Mini GBuffer
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._CameraMotionVectorsTexture, data.motionVectorBuffer);
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._ValidationBuffer, data.historyValidation);
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
// Input
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._DenoiseInputTexture, data.lightingTexture);
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, _StabilizationHistoryBuffer, data.stabilizationHistory);
// Output
ctx.cmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._DenoiseOutputTextureRW, data.tmpTexture);
// Dispatch
ctx.cmd.DispatchCompute(data.temporalStabilizationCS, data.temporalStabilizationKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurCopyHistoryStab)))
{
ctx.cmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryKernel, _LightingDistanceTexture, data.tmpTexture);
ctx.cmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryKernel, _LightingDistanceTextureRW, data.stabilizationHistory);
ctx.cmd.DispatchCompute(data.copyHistoryCS, data.copyHistoryKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurPostBlur)))
{
ConstantBuffer.Push(ctx.cmd, data.reblurCB, data.postBlurCS, _ShaderVariablesReBlur);
// Mini GBuffer
ctx.cmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
ctx.cmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
ctx.cmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
ctx.cmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
// Input Data
ctx.cmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, _LightingDistanceTexture, data.tmpTexture);
ctx.cmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, _AccumulationTexture, data.accTexture);
// Output buffer
ctx.cmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, _LightingDistanceTextureRW, data.lightingTexture);
// Dispatch
ctx.cmd.DispatchCompute(data.postBlurCS, data.postBlurKernel, numTilesX, numTilesY, data.viewCount);
}
});
return lightingTexture;
}
}
}
}