You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

510 lines
31 KiB

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.AddUnsafePass<ReblurIndirectSpecularPassData>("ReBlur Indirect Specular", out var passData, ProfilingSampler.Get(HDProfileId.RaytracingReflectionFilter)))
{
// 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 = lightingTexture;
builder.UseTexture(passData.lightingTexture, AccessFlags.Read);
passData.distanceTexture = distanceTexture;
builder.UseTexture(passData.distanceTexture, AccessFlags.Read);
passData.depthBuffer = prepassOutput.depthBuffer;
builder.UseTexture(passData.depthBuffer, AccessFlags.Read);
passData.depthPyramidBuffer = prepassOutput.depthPyramidTexture;
builder.UseTexture(passData.depthPyramidBuffer, AccessFlags.Read);
passData.stencilBuffer = prepassOutput.stencilBuffer;
builder.UseTexture(passData.stencilBuffer, AccessFlags.Read);
passData.normalBuffer = prepassOutput.normalBuffer;
builder.UseTexture(passData.normalBuffer, AccessFlags.Read);
passData.motionVectorBuffer = prepassOutput.resolvedMotionVectorsBuffer;
builder.UseTexture(passData.motionVectorBuffer, AccessFlags.Read);
passData.clearCoatTexture = clearCoatTexture;
builder.UseTexture(passData.clearCoatTexture, AccessFlags.Read);
passData.historyValidation = historyValidation;
builder.UseTexture(passData.historyValidation, AccessFlags.Read);
var historyDepth = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.Depth);
if (historyDepth != null)
passData.historyDepth = renderGraph.ImportTexture(historyDepth);
else
passData.historyDepth = renderGraph.defaultResources.blackTextureXR;
builder.UseTexture(passData.historyDepth, AccessFlags.Read);
// Temporary textures
passData.accTexture = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true)
{ format = GraphicsFormat.R8_UInt, enableRandomWrite = true, useMipMap = true, autoGenerateMips = false, name = "ReBlur Acc Texture" });
passData.mipTexture = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true)
{ format = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, useMipMap = true, autoGenerateMips = false, name = "ReBlur Color Pyramid" });
passData.tmpTexture = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true)
{ format = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, useMipMap = true, autoGenerateMips = false, name = "ReBlur Color Pyramid Bis" });
// Output resources
passData.mainHistory = renderGraph.ImportTexture(mainHistory);
builder.UseTexture(passData.mainHistory, AccessFlags.ReadWrite);
passData.accumulationHistory = renderGraph.ImportTexture(accumulationHistory);
builder.UseTexture(passData.accumulationHistory, AccessFlags.ReadWrite);
passData.stabilizationHistory = renderGraph.ImportTexture(stabilizationHistory);
builder.UseTexture(passData.stabilizationHistory, AccessFlags.ReadWrite);
builder.SetRenderFunc((ReblurIndirectSpecularPassData data, UnsafeGraphContext ctx) =>
{
var natCmd = CommandBufferHelpers.GetNativeCommandBuffer(ctx.cmd);
// 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(natCmd, "HALF_RESOLUTION", !data.fullResolution);
// Input data
ConstantBuffer.Push(natCmd, data.reblurCB, data.preBlurCS, _ShaderVariablesReBlur);
natCmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._LightingInputTexture, data.lightingTexture);
natCmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._DistanceInputTexture, data.distanceTexture);
natCmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
natCmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
natCmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
natCmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
// Output texture
natCmd.SetComputeTextureParam(data.preBlurCS, data.preBlurKernel, _LightingDistanceTextureRW, data.tmpTexture);
// Dispatch
natCmd.DispatchCompute(data.preBlurCS, data.preBlurKernel, numTilesX, numTilesY, data.viewCount);
// Reset the half res keyword
CoreUtils.SetKeyword(natCmd, "HALF_RESOLUTION", false);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurTemporalAccumulation)))
{
// Input CB
ConstantBuffer.Push(natCmd, data.reblurCB, data.temporalAccumulationCS, _ShaderVariablesReBlur);
// Simplified GBuffer + History
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._CameraMotionVectorsTexture, data.motionVectorBuffer);
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._HistoryDepthTexture, data.historyDepth);
// Input Data
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _LightingDistanceTexture, data.tmpTexture);
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, HDShaderIDs._ValidationBuffer, data.historyValidation);
// History buffer
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _LightingDistanceHistoryBuffer, data.mainHistory);
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _AccumulationHistoryBuffer, data.accumulationHistory);
// Output texture
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _LightingDistanceTextureRW, data.lightingTexture);
natCmd.SetComputeTextureParam(data.temporalAccumulationCS, data.temporalAccumulationKernel, _AccumulationTextureRW, data.accTexture);
// Dispatch
natCmd.DispatchCompute(data.temporalAccumulationCS, data.temporalAccumulationKernel, numTilesX, numTilesY, data.viewCount);
}
// Generate the mip levels required for the history fix.
GenerateMipLevels(natCmd, data);
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurMipHistoryFix)))
{
// Mini GBuffer
natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, HDShaderIDs._DepthTexture, data.depthPyramidBuffer);
natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _ReBlurMipChain, data.mipTexture);
// Input Data
natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _LightingDistanceTexture, data.lightingTexture);
natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _AccumulationTexture, data.accTexture);
// Output texture
natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _LightingDistanceTextureRW, data.tmpTexture);
// Dispatch
natCmd.DispatchCompute(data.historyFixCS, data.historyFixKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurBlur)))
{
ConstantBuffer.Push(natCmd, data.reblurCB, data.blurCS, _ShaderVariablesReBlur);
// Mini GBuffer
natCmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
natCmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
natCmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
natCmd.SetComputeTextureParam(data.blurCS, data.blurKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
// Input Data
natCmd.SetComputeTextureParam(data.blurCS, data.blurKernel, _LightingDistanceTexture, data.tmpTexture);
natCmd.SetComputeTextureParam(data.blurCS, data.blurKernel, _AccumulationTexture, data.accTexture);
// Output Data
natCmd.SetComputeTextureParam(data.blurCS, data.blurKernel, _LightingDistanceTextureRW, data.lightingTexture);
// Dispatch
natCmd.DispatchCompute(data.blurCS, data.blurKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurCopyHistory)))
{
// Current Data
natCmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _LightingDistanceTexture, data.lightingTexture);
natCmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _AccumulationTexture, data.accTexture);
// History buffers
natCmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _LightingDistanceTextureRW, data.mainHistory);
natCmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryAccumulationKernel, _AccumulationTextureRW, data.accumulationHistory);
// Dispatch
natCmd.DispatchCompute(data.copyHistoryCS, data.copyHistoryAccumulationKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurTemporalStabilization)))
{
ConstantBuffer.Push(natCmd, data.reblurCB, data.temporalStabilizationCS, _ShaderVariablesReBlur);
// Mini GBuffer
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._CameraMotionVectorsTexture, data.motionVectorBuffer);
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._ValidationBuffer, data.historyValidation);
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
// Input
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._DenoiseInputTexture, data.lightingTexture);
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, _StabilizationHistoryBuffer, data.stabilizationHistory);
// Output
natCmd.SetComputeTextureParam(data.temporalStabilizationCS, data.temporalStabilizationKernel, HDShaderIDs._DenoiseOutputTextureRW, data.tmpTexture);
// Dispatch
natCmd.DispatchCompute(data.temporalStabilizationCS, data.temporalStabilizationKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurCopyHistoryStab)))
{
natCmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryKernel, _LightingDistanceTexture, data.tmpTexture);
natCmd.SetComputeTextureParam(data.copyHistoryCS, data.copyHistoryKernel, _LightingDistanceTextureRW, data.stabilizationHistory);
natCmd.DispatchCompute(data.copyHistoryCS, data.copyHistoryKernel, numTilesX, numTilesY, data.viewCount);
}
using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurPostBlur)))
{
ConstantBuffer.Push(natCmd, data.reblurCB, data.postBlurCS, _ShaderVariablesReBlur);
// Mini GBuffer
natCmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._DepthTexture, data.depthBuffer);
natCmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer);
natCmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._StencilTexture, data.stencilBuffer, 0, RenderTextureSubElement.Stencil);
natCmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, HDShaderIDs._ClearCoatMaskTexture, data.clearCoatTexture);
// Input Data
natCmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, _LightingDistanceTexture, data.tmpTexture);
natCmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, _AccumulationTexture, data.accTexture);
// Output buffer
natCmd.SetComputeTextureParam(data.postBlurCS, data.postBlurKernel, _LightingDistanceTextureRW, data.lightingTexture);
// Dispatch
natCmd.DispatchCompute(data.postBlurCS, data.postBlurKernel, numTilesX, numTilesY, data.viewCount);
}
});
return lightingTexture;
}
}
}
}