Unity 6 URP中_CameraDepthTexture变黑无法获取的问题求助
以下是针对你遇到问题的具体解决方向,都是针对Unity 6 SRP(URP/HDRP)的适配调整:
调整纹理获取时机与方式
Unity 6的SRP渲染流程对全局纹理的同步逻辑做了修改,Shader.GetGlobalTexture("_CameraDepthTexture")可能在相机渲染完成前拿到的是默认占位纹理(就是你看到的4x4黑图)。你需要:- 改用相机的
GetDepthTexture()方法直接获取,替代全局纹理查找:var depthTex = _cam.GetDepthTexture(); computeShader.SetTexture(kernelIndex, "_DepthTex", depthTex); - 在相机渲染完成后执行赋值操作,比如绑定
RenderPipelineManager.endCameraRendering事件(SRP专用):void OnEnable() { RenderPipelineManager.endCameraRendering += OnCameraRendered; } void OnCameraRendered(ScriptableRenderContext context, Camera cam) { if (cam == _cam) { var depthTex = cam.GetDepthTexture(); computeShader.SetTexture(0, "_DepthTex", depthTex); // 调度Compute Shader computeShader.Dispatch(0, ...); } } void OnDisable() { RenderPipelineManager.endCameraRendering -= OnCameraRendered; }
- 改用相机的
检查Compute Shader的纹理声明
确保深度纹理的格式与Compute Shader中的声明匹配:// 正确声明单通道深度纹理,避免格式不兼容 Texture2D<float> _DepthTex; SamplerState sampler_DepthTex; [numthreads(8,8,1)] void CSMain (uint3 id : SV_DispatchThreadID) { float depth = _DepthTex.Sample(sampler_DepthTex, float2(id.xy) / _DepthTex.xy); // 后续处理逻辑 }注意:如果深度纹理是浮点格式,不要用
Texture2D<int>这类整数类型声明,否则采样结果会异常。验证SRP的深度纹理配置细节
打开你的Render Pipeline Asset(比如URP Asset),确认Depth Texture不仅开启,还要检查:- 对于URP,是否勾选了“Depth Texture”下的“Enable Depth Texture”,并且“Depth Texture Format”设置为与你的Compute Shader兼容的格式(比如
R32_SFloat) - 若使用HDRP,确认“Depth Buffer Format”是支持浮点采样的格式,同时开启“Generate Depth Texture”
- 对于URP,是否勾选了“Depth Texture”下的“Enable Depth Texture”,并且“Depth Texture Format”设置为与你的Compute Shader兼容的格式(比如
排查脚本执行顺序
进入Edit > Project Settings > Script Execution Order,把你的Compute Shader控制脚本的执行顺序调到Camera相关系统脚本之后(比如URP的CameraRenderer),避免在深度纹理生成前就执行赋值操作。确认Compute Shader的纹理绑定名称
不要依赖旧的全局变量名_CameraDepthTexture,在Compute Shader里自定义纹理变量(比如上面的_DepthTex),然后通过computeShader.SetTexture()明确绑定,避免全局变量在SRP中的命名冲突或同步问题。
内容的提问来源于stack exchange,提问作者Buttermilch

