// Generates an in-place depth pyramid // TODO: Mip-mapping depth is problematic for precision at lower mips, generate a packed atlas instead public void RenderMinDepthPyramid(CommandBuffer cmd, RenderTexture texture, HDUtils.PackedMipChainInfo info) { HDUtils.CheckRTCreated(texture); var cs = m_DepthPyramidCS; int kernel = m_DepthDownsampleKernel; // TODO: Do it 1x MIP at a time for now. In the future, do 4x MIPs per pass, or even use a single pass. // Note: Gather() doesn't take a LOD parameter and we cannot bind an SRV of a MIP level, // and we don't support Min samplers either. So we are forced to perform 4x loads. for (int i = 1; i < info.mipLevelCount; i++) { Vector2Int dstSize = info.mipLevelSizes[i]; Vector2Int dstOffset = info.mipLevelOffsets[i]; Vector2Int srcSize = info.mipLevelSizes[i - 1]; Vector2Int srcOffset = info.mipLevelOffsets[i - 1]; Vector2Int srcLimit = srcOffset + srcSize - Vector2Int.one; m_SrcOffset[0] = srcOffset.x; m_SrcOffset[1] = srcOffset.y; m_SrcOffset[2] = srcLimit.x; m_SrcOffset[3] = srcLimit.y; m_DstOffset[0] = dstOffset.x; m_DstOffset[1] = dstOffset.y; m_DstOffset[2] = 0; m_DstOffset[3] = 0; cmd.SetComputeIntParams(cs, HDShaderIDs._SrcOffsetAndLimit, m_SrcOffset); cmd.SetComputeIntParams(cs, HDShaderIDs._DstOffset, m_DstOffset); cmd.SetComputeTextureParam(cs, kernel, HDShaderIDs._DepthMipChain, texture); cmd.DispatchCompute(cs, kernel, HDUtils.DivRoundUp(dstSize.x, 8), HDUtils.DivRoundUp(dstSize.y, 8), 1); } }