diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index 12bc60e991a..275ec8ed281 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -901,6 +901,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Remove the 'Point Cube Size' for cookie, use the Cubemap size directly. - Only building the RTAS if there is an effect that will require it (1262217). - Fixed the first ray tracing frame not having the light cluster being set up properly (1260311). +- Render graph pre-setup for ray traced ambient occlusion. ## [7.1.1] - 2019-09-05 diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs index 18f8afb774f..43574a839ec 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs @@ -311,7 +311,7 @@ internal void Render(CommandBuffer cmd, HDCamera camera, ScriptableRenderContext else { if (camera.frameSettings.IsEnabled(FrameSettingsField.RayTracing) && settings.rayTracing.value) - m_RaytracingAmbientOcclusion.RenderAO(camera, cmd, m_AmbientOcclusionTex, globalRTCB, renderContext, frameCount); + m_RaytracingAmbientOcclusion.RenderRTAO(camera, cmd, m_AmbientOcclusionTex, globalRTCB, renderContext, frameCount); else { Dispatch(cmd, camera, depthTexture, normalBuffer, motionVectors, frameCount); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs index e2bf627d4e6..ade14e2603c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs @@ -101,14 +101,20 @@ internal enum HDProfileId VolumetricLightingFiltering, PrepareVisibleDensityVolumeList, + // RT Cluster RaytracingBuildCluster, RaytracingCullLights, + // RTR RaytracingIntegrateReflection, RaytracingFilterReflection, + // RTAO RaytracingAmbientOcclusion, RaytracingFilterAmbientOcclusion, + RaytracingComposeAmbientOcclusion, + // RT Shadows RaytracingDirectionalLightShadow, RaytracingLightShadow, + // RTGI RaytracingIntegrateIndirectDiffuse, RaytracingFilterIndirectDiffuse, RaytracingDebugOverlay, diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs index 92817728576..410d9adf598 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs @@ -5,14 +5,11 @@ namespace UnityEngine.Rendering.HighDefinition internal class HDRaytracingAmbientOcclusion { // External structures - RenderPipelineResources m_PipelineResources = null; HDRenderPipelineRayTracingResources m_PipelineRayTracingResources = null; - RenderPipelineSettings m_PipelineSettings; HDRenderPipeline m_RenderPipeline = null; // The target denoising kernel - static int m_KernelFilter; - static int m_RTAOApplyIntensityKernel; + int m_RTAOApplyIntensityKernel; // Intermediate buffer that stores the ambient occlusion pre-denoising RTHandle m_AOIntermediateBuffer0 = null; @@ -30,8 +27,6 @@ public HDRaytracingAmbientOcclusion() public void Init(HDRenderPipeline renderPipeline) { // Keep track of the pipeline asset - m_PipelineSettings = renderPipeline.currentPlatformRenderPipelineSettings; - m_PipelineResources = renderPipeline.asset.renderPipelineResources; m_PipelineRayTracingResources = renderPipeline.asset.renderPipelineRayTracingResources; // keep track of the render pipeline @@ -59,97 +54,244 @@ static RTHandle AmbientOcclusionHistoryBufferAllocatorFunction(string viewName, } - public void SetDefaultAmbientOcclusionTexture(CommandBuffer cmd) + static public void SetDefaultAmbientOcclusionTexture(CommandBuffer cmd) { cmd.SetGlobalTexture(HDShaderIDs._AmbientOcclusionTexture, TextureXR.GetBlackTexture()); } - public void RenderAO(HDCamera hdCamera, CommandBuffer cmd, RTHandle outputTexture, ShaderVariablesRaytracing globalCB, ScriptableRenderContext renderContext, int frameCount) + // The set of parameters that are used to trace the ambient occlusion + public struct AmbientOcclusionTraceParameters + { + // Generic attributes + public float rayLength; + public int sampleCount; + + // Camera data + public int actualWidth; + public int actualHeight; + public int viewCount; + + // Shaders + public RayTracingShader aoShaderRT; + + // Constant buffer + public ShaderVariablesRaytracing raytracingCB; + } + + public struct AmbientOcclusionTraceResources + { + // Input Buffer + public RayTracingAccelerationStructure rayTracingAccelerationStructure; + public RTHandle depthStencilBuffer; + public RTHandle normalBuffer; + public BlueNoise.DitheredTextureSet ditheredTextureSet; + + // Debug textures + public RTHandle rayCountTexture; + + // Output Buffer + public RTHandle outputTexture; + } + + AmbientOcclusionTraceParameters PrepareAmbientOcclusionTraceParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) + { + AmbientOcclusionTraceParameters rtAOParameters = new AmbientOcclusionTraceParameters(); + var aoSettings = hdCamera.volumeStack.GetComponent(); + rtAOParameters.rayLength = aoSettings.rayLength; + rtAOParameters.sampleCount = aoSettings.sampleCount; + rtAOParameters.actualWidth = hdCamera.actualWidth; + rtAOParameters.actualHeight = hdCamera.actualHeight; + rtAOParameters.viewCount = hdCamera.viewCount; + rtAOParameters.raytracingCB = raytracingCB; + rtAOParameters.aoShaderRT = m_PipelineRayTracingResources.aoRaytracingRT; + return rtAOParameters; + } + + AmbientOcclusionTraceResources PrepareAmbientOcclusionTraceResources(HDCamera hdCamera, RTHandle outputTexture) + { + AmbientOcclusionTraceResources rtAOResources = new AmbientOcclusionTraceResources(); + rtAOResources.rayTracingAccelerationStructure = m_RenderPipeline.RequestAccelerationStructure(); + rtAOResources.depthStencilBuffer = m_RenderPipeline.sharedRTManager.GetDepthStencilBuffer(); + rtAOResources.normalBuffer = m_RenderPipeline.sharedRTManager.GetNormalBuffer(); + rtAOResources.rayCountTexture = m_RenderPipeline.GetRayCountManager().GetRayCountTexture(); + BlueNoise blueNoise = m_RenderPipeline.GetBlueNoiseManager(); + rtAOResources.ditheredTextureSet = blueNoise.DitheredTextureSet8SPP(); + rtAOResources.outputTexture = outputTexture; + return rtAOResources; + } + + // The set of parameters that are used to trace the ambient occlusion + public struct AmbientOcclusionDenoiseParameters + { + // Generic attributes + public bool denoise; + public float denoiserRadius; + public float historyValidity; + + // Camera data + public int actualWidth; + public int actualHeight; + public int viewCount; + } + + public struct AmbientOcclusionDenoiseResources + { + // Temporary buffers + public RTHandle intermediateBuffer; + + // Output Buffer + public RTHandle ambientOcclusionHistory; + public RTHandle inputTexture; + public RTHandle outputTexture; + } + + AmbientOcclusionDenoiseParameters PrepareAmbientOcclusionDenoiseParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) + { + AmbientOcclusionDenoiseParameters rtAOParameters = new AmbientOcclusionDenoiseParameters(); + var aoSettings = hdCamera.volumeStack.GetComponent(); + rtAOParameters.denoise = aoSettings.denoise; + rtAOParameters.denoiserRadius = aoSettings.denoiserRadius; + rtAOParameters.historyValidity = 1.0f; +#if UNITY_HDRP_DXR_TESTS_DEFINE + if (Application.isPlaying) + rtAOParameters.historyValidity = 0.0f; + else +#endif + // We need to check if something invalidated the history buffers + rtAOParameters.historyValidity = m_RenderPipeline.ValidRayTracingHistory(hdCamera) ? 1.0f : 0.0f; + rtAOParameters.actualWidth = hdCamera.actualWidth; + rtAOParameters.actualHeight = hdCamera.actualHeight; + rtAOParameters.viewCount = hdCamera.viewCount; + return rtAOParameters; + } + + AmbientOcclusionDenoiseResources PrepareAmbientOcclusionDenoiseResources(HDCamera hdCamera, RTHandle inputTexture, RTHandle intermediateTexture, RTHandle outputTexture) + { + AmbientOcclusionDenoiseResources rtAOResources = new AmbientOcclusionDenoiseResources(); + rtAOResources.ambientOcclusionHistory = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion) + ?? hdCamera.AllocHistoryFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion, AmbientOcclusionHistoryBufferAllocatorFunction, 1); + rtAOResources.inputTexture = inputTexture; + rtAOResources.intermediateBuffer = intermediateTexture; + rtAOResources.outputTexture = outputTexture; + return rtAOResources; + } + + // The set of parameters that are used to trace the ambient occlusion + public struct AmbientOcclusionComposeParameters + { + // Generic attributes + public float intensity; + + // Camera data + public int actualWidth; + public int actualHeight; + public int viewCount; + + // Kernels + public int intensityKernel; + + // Shaders + public ComputeShader aoShaderCS; + } + + AmbientOcclusionComposeParameters PrepareAmbientOcclusionComposeParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) + { + AmbientOcclusionComposeParameters aoComposeParameters = new AmbientOcclusionComposeParameters(); + var aoSettings = hdCamera.volumeStack.GetComponent(); + aoComposeParameters.intensity = aoSettings.intensity.value; + aoComposeParameters.actualWidth = hdCamera.actualWidth; + aoComposeParameters.actualHeight = hdCamera.actualHeight; + aoComposeParameters.viewCount = hdCamera.viewCount; + aoComposeParameters.aoShaderCS = m_PipelineRayTracingResources.aoRaytracingCS; + aoComposeParameters.intensityKernel = m_RTAOApplyIntensityKernel; + return aoComposeParameters; + } + + public void RenderRTAO(HDCamera hdCamera, CommandBuffer cmd, RTHandle outputTexture, ShaderVariablesRaytracing globalCB, ScriptableRenderContext renderContext, int frameCount) { - // If any of the previous requirements is missing, the effect is not requested or no acceleration structure, set the default one and leave right away if (!m_RenderPipeline.GetRayTracingState()) { SetDefaultAmbientOcclusionTexture(cmd); return; } + AmbientOcclusionTraceParameters aoTraceParameters = PrepareAmbientOcclusionTraceParameters(hdCamera, globalCB); + AmbientOcclusionTraceResources aoTraceResources = PrepareAmbientOcclusionTraceResources(hdCamera, m_AOIntermediateBuffer0); + // If any of the previous requirements is missing, the effect is not requested or no acceleration structure, set the default one and leave right away + using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingAmbientOcclusion))) + { + TraceAO(cmd, aoTraceParameters, aoTraceResources); + } - RayTracingShader aoShaderRT = m_PipelineRayTracingResources.aoRaytracingRT; - var aoSettings = hdCamera.volumeStack.GetComponent(); - RayCountManager rayCountManager = m_RenderPipeline.GetRayCountManager(); + AmbientOcclusionDenoiseParameters aoDenoiseParameters = PrepareAmbientOcclusionDenoiseParameters(hdCamera, globalCB); + AmbientOcclusionDenoiseResources aoDenoiserResources = PrepareAmbientOcclusionDenoiseResources(hdCamera, m_AOIntermediateBuffer0, m_AOIntermediateBuffer1, outputTexture); + using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingFilterAmbientOcclusion))) + { + DenoiseAO(cmd, hdCamera, aoDenoiseParameters, aoDenoiserResources); + } - using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingAmbientOcclusion))) + AmbientOcclusionComposeParameters aoComposeParameters = PrepareAmbientOcclusionComposeParameters(hdCamera, globalCB); + using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingComposeAmbientOcclusion))) { - // Grab the acceleration structure for the target camera - RayTracingAccelerationStructure accelerationStructure = m_RenderPipeline.RequestAccelerationStructure(); + ComposeAO(cmd, hdCamera, aoComposeParameters, outputTexture); + } + } + + static public void TraceAO(CommandBuffer cmd, AmbientOcclusionTraceParameters aoTraceParameters, AmbientOcclusionTraceResources aoTraceResources) + { + // Define the shader pass to use for the reflection pass + cmd.SetRayTracingShaderPass(aoTraceParameters.aoShaderRT, "VisibilityDXR"); - // Define the shader pass to use for the reflection pass - cmd.SetRayTracingShaderPass(aoShaderRT, "VisibilityDXR"); + // Set the acceleration structure for the pass + cmd.SetRayTracingAccelerationStructure(aoTraceParameters.aoShaderRT, HDShaderIDs._RaytracingAccelerationStructureName, aoTraceResources.rayTracingAccelerationStructure); - // Set the acceleration structure for the pass - cmd.SetRayTracingAccelerationStructure(aoShaderRT, HDShaderIDs._RaytracingAccelerationStructureName, accelerationStructure); + // Inject the ray generation data (be careful of the global constant buffer limitation) + aoTraceParameters.raytracingCB._RaytracingRayMaxLength = aoTraceParameters.rayLength; + aoTraceParameters.raytracingCB._RaytracingNumSamples = aoTraceParameters.sampleCount; + ConstantBuffer.PushGlobal(cmd, aoTraceParameters.raytracingCB, HDShaderIDs._ShaderVariablesRaytracing); - // Inject the ray generation data (be careful of the global constant buffer limitation) - globalCB._RaytracingRayMaxLength = aoSettings.rayLength; - globalCB._RaytracingNumSamples = aoSettings.sampleCount; - ConstantBuffer.PushGlobal(cmd, globalCB, HDShaderIDs._ShaderVariablesRaytracing); + // Set the data for the ray generation + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._DepthTexture, aoTraceResources.depthStencilBuffer); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._NormalBufferTexture, aoTraceResources.normalBuffer); - // Set the data for the ray generation - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._DepthTexture, m_RenderPipeline.sharedRTManager.GetDepthStencilBuffer()); - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._NormalBufferTexture, m_RenderPipeline.sharedRTManager.GetNormalBuffer()); + // Inject the ray-tracing sampling data + BlueNoise.BindDitheredTextureSet(cmd, aoTraceResources.ditheredTextureSet); - // Inject the ray-tracing sampling data - BlueNoise blueNoise = m_RenderPipeline.GetBlueNoiseManager(); - blueNoise.BindDitheredRNGData8SPP(cmd); + // Set the output textures + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._RayCountTexture, aoTraceResources.rayCountTexture); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._AmbientOcclusionTextureRW, aoTraceResources.outputTexture); + // Run the computation + cmd.DispatchRays(aoTraceParameters.aoShaderRT, m_RayGenShaderName, (uint)aoTraceParameters.actualWidth, (uint)aoTraceParameters.actualHeight, (uint)aoTraceParameters.viewCount); + } - // Set the output textures - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._RayCountTexture, rayCountManager.GetRayCountTexture()); - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._AmbientOcclusionTextureRW, m_AOIntermediateBuffer0); + public void DenoiseAO(CommandBuffer cmd, HDCamera hdCamera, AmbientOcclusionDenoiseParameters aoDenoiseParameters, AmbientOcclusionDenoiseResources aoDenoiseResources) + { + if (aoDenoiseParameters.denoise) + { + // Apply the temporal denoiser + HDTemporalFilter temporalFilter = m_RenderPipeline.GetTemporalFilter(); + temporalFilter.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.inputTexture, aoDenoiseResources.ambientOcclusionHistory, aoDenoiseResources.intermediateBuffer, historyValidity: aoDenoiseParameters.historyValidity); - // Run the computation - cmd.DispatchRays(aoShaderRT, m_RayGenShaderName, (uint)hdCamera.actualWidth, (uint)hdCamera.actualHeight, (uint)hdCamera.viewCount); + // Apply the diffuse denoiser + HDDiffuseDenoiser diffuseDenoiser = m_RenderPipeline.GetDiffuseDenoiser(); + diffuseDenoiser.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.intermediateBuffer, aoDenoiseResources.outputTexture, aoDenoiseParameters.denoiserRadius); } - - using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingFilterAmbientOcclusion))) + else { - if(aoSettings.denoise) - { - // Grab the history buffer - RTHandle ambientOcclusionHistory = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion) - ?? hdCamera.AllocHistoryFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion, AmbientOcclusionHistoryBufferAllocatorFunction, 1); - - float historyValidity = 1.0f; - #if UNITY_HDRP_DXR_TESTS_DEFINE - if (Application.isPlaying) - historyValidity = 0.0f; - else - #endif - // We need to check if something invalidated the history buffers - historyValidity = m_RenderPipeline.ValidRayTracingHistory(hdCamera) ? 1.0f : 0.0f; - - // Apply the temporal denoiser - HDTemporalFilter temporalFilter = m_RenderPipeline.GetTemporalFilter(); - temporalFilter.DenoiseBuffer(cmd, hdCamera, m_AOIntermediateBuffer0, ambientOcclusionHistory, m_AOIntermediateBuffer1, historyValidity: historyValidity); - - // Apply the diffuse denoiser - HDDiffuseDenoiser diffuseDenoiser = m_RenderPipeline.GetDiffuseDenoiser(); - diffuseDenoiser.DenoiseBuffer(cmd, hdCamera, m_AOIntermediateBuffer1, outputTexture, aoSettings.denoiserRadius); - } - else - { - HDUtils.BlitCameraTexture(cmd, m_AOIntermediateBuffer0, outputTexture); - } - - ComputeShader aoShaderCS = m_PipelineRayTracingResources.aoRaytracingCS; - cmd.SetComputeFloatParam(aoShaderCS, HDShaderIDs._RaytracingAOIntensity, aoSettings.intensity.value); - cmd.SetComputeTextureParam(aoShaderCS, m_RTAOApplyIntensityKernel, HDShaderIDs._AmbientOcclusionTextureRW, outputTexture); - int texWidth = hdCamera.actualWidth; - int texHeight = hdCamera.actualHeight; - int areaTileSize = 8; - int numTilesXHR = (texWidth + (areaTileSize - 1)) / areaTileSize; - int numTilesYHR = (texHeight + (areaTileSize - 1)) / areaTileSize; - cmd.DispatchCompute(aoShaderCS, m_RTAOApplyIntensityKernel, numTilesXHR, numTilesYHR, hdCamera.viewCount); + HDUtils.BlitCameraTexture(cmd, aoDenoiseResources.inputTexture, aoDenoiseResources.outputTexture); } + } + + static public void ComposeAO(CommandBuffer cmd, HDCamera hdCamera, AmbientOcclusionComposeParameters aoComposeParameters, RTHandle outputTexture) + { + cmd.SetComputeFloatParam(aoComposeParameters.aoShaderCS, HDShaderIDs._RaytracingAOIntensity, aoComposeParameters.intensity); + cmd.SetComputeTextureParam(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, HDShaderIDs._AmbientOcclusionTextureRW, outputTexture); + int texWidth = aoComposeParameters.actualWidth; + int texHeight = aoComposeParameters.actualHeight; + int areaTileSize = 8; + int numTilesXHR = (texWidth + (areaTileSize - 1)) / areaTileSize; + int numTilesYHR = (texHeight + (areaTileSize - 1)) / areaTileSize; + cmd.DispatchCompute(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, numTilesXHR, numTilesYHR, aoComposeParameters.viewCount); // Bind the textures and the params cmd.SetGlobalTexture(HDShaderIDs._AmbientOcclusionTexture, outputTexture); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs index 5567db564fa..d2a3f18450a 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs @@ -106,6 +106,15 @@ static void InitTextures(int size, TextureFormat format, Texture2D[] sourceTextu } } + // Structure that holds all the dithered sampling texture that shall be binded at dispatch time. + public struct DitheredTextureSet + { + public Texture2D owenScrambled256Tex; + public Texture2D scramblingTile; + public Texture2D rankingTile; + public Texture2D scramblingTex; + } + internal void BindDitheredRNGData1SPP(CommandBuffer cmd) { cmd.SetGlobalTexture(HDShaderIDs._OwenScrambledTexture, m_RenderPipelineResources.textures.owenScrambled256Tex); @@ -122,6 +131,17 @@ internal void BindDitheredRNGData8SPP(CommandBuffer cmd) cmd.SetGlobalTexture(HDShaderIDs._ScramblingTexture, m_RenderPipelineResources.textures.scramblingTex); } + internal DitheredTextureSet DitheredTextureSet8SPP() + { + // This is a structure, so the new shouldn't be a problem. + DitheredTextureSet ditheredTextureSet = new DitheredTextureSet(); + ditheredTextureSet.owenScrambled256Tex = m_RenderPipelineResources.textures.owenScrambled256Tex; + ditheredTextureSet.scramblingTile = m_RenderPipelineResources.textures.scramblingTile8SPP; + ditheredTextureSet.rankingTile = m_RenderPipelineResources.textures.rankingTile8SPP; + ditheredTextureSet.scramblingTex = m_RenderPipelineResources.textures.scramblingTex; + return ditheredTextureSet; + } + internal void BindDitheredRNGData256SPP(CommandBuffer cmd) { cmd.SetGlobalTexture(HDShaderIDs._OwenScrambledTexture, m_RenderPipelineResources.textures.owenScrambled256Tex); @@ -129,5 +149,13 @@ internal void BindDitheredRNGData256SPP(CommandBuffer cmd) cmd.SetGlobalTexture(HDShaderIDs._RankingTileXSPP, m_RenderPipelineResources.textures.rankingTile256SPP); cmd.SetGlobalTexture(HDShaderIDs._ScramblingTexture, m_RenderPipelineResources.textures.scramblingTex); } + + internal static void BindDitheredTextureSet(CommandBuffer cmd, DitheredTextureSet ditheredTextureSet) + { + cmd.SetGlobalTexture(HDShaderIDs._OwenScrambledTexture, ditheredTextureSet.owenScrambled256Tex); + cmd.SetGlobalTexture(HDShaderIDs._ScramblingTileXSPP, ditheredTextureSet.scramblingTile); + cmd.SetGlobalTexture(HDShaderIDs._RankingTileXSPP, ditheredTextureSet.rankingTile); + cmd.SetGlobalTexture(HDShaderIDs._ScramblingTexture, ditheredTextureSet.scramblingTex); + } } }