You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 6 URP中_CameraDepthTexture变黑无法获取的问题求助

Unity 6中Compute Shader采样相机深度纹理失效的排查方案

以下是针对你遇到问题的具体解决方向,都是针对Unity 6 SRP(URP/HDRP)的适配调整:

  • 调整纹理获取时机与方式
    Unity 6的SRP渲染流程对全局纹理的同步逻辑做了修改,Shader.GetGlobalTexture("_CameraDepthTexture")可能在相机渲染完成前拿到的是默认占位纹理(就是你看到的4x4黑图)。你需要:

    1. 改用相机的GetDepthTexture()方法直接获取,替代全局纹理查找:
      var depthTex = _cam.GetDepthTexture();
      computeShader.SetTexture(kernelIndex, "_DepthTex", depthTex);
      
    2. 在相机渲染完成后执行赋值操作,比如绑定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”
  • 排查脚本执行顺序
    进入Edit > Project Settings > Script Execution Order,把你的Compute Shader控制脚本的执行顺序调到Camera相关系统脚本之后(比如URP的CameraRenderer),避免在深度纹理生成前就执行赋值操作。

  • 确认Compute Shader的纹理绑定名称
    不要依赖旧的全局变量名_CameraDepthTexture,在Compute Shader里自定义纹理变量(比如上面的_DepthTex),然后通过computeShader.SetTexture()明确绑定,避免全局变量在SRP中的命名冲突或同步问题。

内容的提问来源于stack exchange,提问作者Buttermilch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:04:51