DiffuseShadowSphereDenoiserParameters PrepareDiffuseShadowSphereDenoiserParameters(HDCamera hdCamera, Vector3 lightPosition, float lightRadius, int kernelSize) { DiffuseShadowSphereDenoiserParameters dssdParams = new DiffuseShadowSphereDenoiserParameters(); // Set the camera parameters dssdParams.texWidth = hdCamera.actualWidth; dssdParams.texHeight = hdCamera.actualHeight; dssdParams.viewCount = hdCamera.viewCount; // Evaluation parameters dssdParams.cameraFov = hdCamera.camera.fieldOfView * Mathf.PI / 180.0f; dssdParams.lightPosition = lightPosition; // Make sure the position is in the right space before injecting it if (ShaderConfig.s_CameraRelativeRendering != 0) { dssdParams.lightPosition -= hdCamera.camera.transform.position; } dssdParams.lightRadius = lightRadius; dssdParams.kernelSize = kernelSize; // Kernels dssdParams.bilateralHKernel = m_BilateralFilterHSingleSphereKernel; dssdParams.bilateralVKernel = m_BilateralFilterVSingleSphereKernel; // Other parameters dssdParams.diffuseShadowDenoiserCS = m_ShadowDenoiser; return(dssdParams); }
public void DenoiseBufferSphere(CommandBuffer cmd, HDCamera hdCamera, RTHandle noisyBuffer, RTHandle distanceBuffer, RTHandle outputBuffer, int kernelSize, Vector3 lightPosition, float lightRadius) { // Request the intermediate buffers that we need RTHandle intermediateBuffer = m_RenderPipeline.GetRayTracingBuffer(InternalRayTracingBuffers.RGBA3); DiffuseShadowSphereDenoiserParameters dssdParams = PrepareDiffuseShadowSphereDenoiserParameters(hdCamera, lightPosition, lightRadius, kernelSize); DiffuseShadowSphereDenoiserResources dssdResources = PrepareDiffuseShadowSphereDenoiserResources(distanceBuffer, noisyBuffer, intermediateBuffer, outputBuffer); ExecuteDiffuseShadowSphereDenoiser(cmd, dssdParams, dssdResources); }
static void ExecuteDiffuseShadowSphereDenoiser(CommandBuffer cmd, DiffuseShadowSphereDenoiserParameters dssdParams, DiffuseShadowSphereDenoiserResources dssdResources) { // Evaluate the dispatch parameters int shadowTileSize = 8; int numTilesX = (dssdParams.texWidth + (shadowTileSize - 1)) / shadowTileSize; int numTilesY = (dssdParams.texHeight + (shadowTileSize - 1)) / shadowTileSize; // Bind input uniforms cmd.SetComputeIntParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._DenoiserFilterRadius, dssdParams.kernelSize); cmd.SetComputeVectorParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightPosition, dssdParams.lightPosition); cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightRadius, dssdParams.lightRadius); cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._CameraFOV, dssdParams.cameraFov); // Bind Input Textures cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DepthTexture, dssdResources.depthStencilBuffer); cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._NormalBufferTexture, dssdResources.normalBuffer); cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DenoiseInputTexture, dssdResources.noisyBuffer); cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DistanceTexture, dssdResources.distanceBuffer); // Bind output textures cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DenoiseOutputTextureRW, dssdResources.intermediateBuffer); // Do the Horizontal pass cmd.DispatchCompute(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, numTilesX, numTilesY, dssdParams.viewCount); // Bind input uniforms cmd.SetComputeIntParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._DenoiserFilterRadius, dssdParams.kernelSize); cmd.SetComputeVectorParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightPosition, dssdParams.lightPosition); cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightRadius, dssdParams.lightRadius); cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._CameraFOV, dssdParams.cameraFov); cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DenoiseInputTexture, dssdResources.intermediateBuffer); cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DistanceTexture, dssdResources.distanceBuffer); cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DepthTexture, dssdResources.depthStencilBuffer); cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._NormalBufferTexture, dssdResources.normalBuffer); // Bind output textures cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DenoiseOutputTextureRW, dssdResources.outputBuffer); // Do the Vertical pass cmd.DispatchCompute(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, numTilesX, numTilesY, dssdParams.viewCount); }
DiffuseShadowSphereDenoiserParameters PrepareDiffuseShadowSphereDenoiserParameters(HDCamera hdCamera, Vector3 lightPosition, float lightRadius, int kernelSize) { DiffuseShadowSphereDenoiserParameters dssdParams = new DiffuseShadowSphereDenoiserParameters(); // Set the camera parameters dssdParams.texWidth = hdCamera.actualWidth; dssdParams.texHeight = hdCamera.actualHeight; dssdParams.viewCount = hdCamera.viewCount; // Evaluation parameters dssdParams.cameraFov = hdCamera.camera.fieldOfView * Mathf.PI / 180.0f; dssdParams.lightPosition = lightPosition; dssdParams.lightRadius = lightRadius; dssdParams.kernelSize = kernelSize; // Kernels dssdParams.bilateralHKernel = m_BilateralFilterHSingleSphereKernel; dssdParams.bilateralVKernel = m_BilateralFilterVSingleSphereKernel; // Other parameters dssdParams.diffuseShadowDenoiserCS = m_ShadowDenoiser; return(dssdParams); }