using System; namespace UnityEngine.Rendering.Universal.Internal { public class SetHiZ0GlobalPass : ScriptableRenderPass { private RenderTargetIdentifier source { get; set; } private int prevHiZ0TextureID; public SetHiZ0GlobalPass(RenderPassEvent evt) { renderPassEvent = evt; } public void Setup(RenderTargetIdentifier source, int prevHiZ0ID) { this.source = source; prevHiZ0TextureID = prevHiZ0ID; } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get(); cmd.SetGlobalTexture(prevHiZ0TextureID, source); context.ExecuteCommandBuffer(cmd); cmd.Release(); } } /// /// Copy the given color buffer to the given destination color buffer. /// /// You can use this pass to copy a color buffer to the destination, /// so you can use it later in rendering. For example, you can copy /// the opaque texture to use it for distortion effects. /// public class CopyHiZ0Pass : ScriptableRenderPass { //const int mipTruncation = 3; //static int sizeID = Shader.PropertyToID("_Size"); static int sourceID = Shader.PropertyToID("_Source"); static int destinationID = Shader.PropertyToID("_Destination"); static int opaqueTextureDimID = Shader.PropertyToID("_CameraOpaqueTexture_Dim"); int m_SampleOffsetShaderHandle; Material m_SamplingMaterial; Downsampling m_DownsamplingMethod; Material m_CopyColorMaterial; ComputeShader m_ColorPyramidCompute; public bool m_RequiresMips; private int m_MipLevels; private int[] m_Size; private int downsampleKernelID; private int gaussianKernelID; private RenderTargetIdentifier source { get; set; } private RTPermanentHandle destination { get; set; } private RenderTargetHandle tempBuffer { get; set; } private RenderTextureDescriptor tempDescriptor; /// /// Create the CopyColorPass /// public CopyHiZ0Pass(RenderPassEvent evt, Material samplingMaterial, Material copyColorMaterial = null) { base.profilingSampler = new ProfilingSampler(nameof(CopyColorPass)); m_SamplingMaterial = samplingMaterial; m_CopyColorMaterial = copyColorMaterial; renderPassEvent = evt; m_DownsamplingMethod = Downsampling.None; m_MipLevels = 1; base.useNativeRenderPass = false; } /// /// Configure the pass with the source and destination to execute on. /// /// Source Render Target /// Destination Render Target public void Setup(RenderTargetIdentifier source, RTPermanentHandle destination) { this.source = source; this.destination = destination; //m_DownsamplingMethod = downsampling; //m_RequiresMips = RequiresMips; } public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { bool requiresMinMax = renderingData.cameraData.requiresMinMaxDepthPyr; var descriptor = renderingData.cameraData.cameraTargetDescriptor; descriptor.colorFormat = requiresMinMax ? RenderTextureFormat.RGHalf : RenderTextureFormat.RHalf; descriptor.width /= 2; descriptor.height /= 2; descriptor.depthBufferBits = 0; descriptor.msaaSamples = 1; descriptor.useMipMap = false; descriptor.autoGenerateMips = false; descriptor.sRGB = false; descriptor.enableRandomWrite = false; destination.GetRenderTexture(descriptor, renderingData.cameraData.camera.name, "PrevHiZ"); //cmd.GetTemporaryRT(destination.id, descriptor, FilterMode.Point); } /// public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { if (m_SamplingMaterial == null) { Debug.LogErrorFormat("Missing {0}. {1} render pass will not execute. Check for missing reference in the renderer resources.", m_SamplingMaterial, GetType().Name); return; } CommandBuffer cmd = CommandBufferPool.Get(); using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.StoreHiZ0))) { //RenderTargetIdentifier oldHiZRT = destination.Identifier(); ScriptableRenderer.SetRenderTarget(cmd, destination.renderTexture, BuiltinRenderTextureType.CameraTarget, clearFlag, clearColor); bool useDrawProceduleBlit = renderingData.cameraData.xr.enabled; RenderingUtils.Blit(cmd, source, destination.renderTexture, m_CopyColorMaterial, 0, useDrawProceduleBlit); } // In shader, we need to know how many mip levels to 1x1 and not actually how many mips there are, so re-add mipTruncation to the true number of mips context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } /// public override void OnCameraCleanup(CommandBuffer cmd) { if (cmd == null) throw new ArgumentNullException("cmd"); //if (destination != RenderTargetHandle.CameraTarget) //{ // cmd.ReleaseTemporaryRT(destination.id); // destination = RenderTargetHandle.CameraTarget; //} } } }