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

Unity Shader采样_CameraDepthTexture深度纹理返回固定灰色问题求助

问题成因与解决方案
    1. 摄像机未开启深度纹理生成
      Unity默认不会自动生成_CameraDepthTexture,需要手动开启:
      选中你使用的摄像机,在Inspector面板中将Depth Texture Mode属性设置为Depth;也可以通过挂在摄像机上的脚本开启,代码如下:
    void Start()
    {
        GetComponent<Camera>().depthTextureMode = DepthTextureMode.Depth;
    }
    
    1. 未对深度纹理采样结果做线性解码
      你当前直接将_CameraDepthTexture的采样结果输出,该纹理存储的是非线性编码的深度值,范围被压缩在很窄的区间内,直接输出大概率会呈现统一的灰色,并非采样返回固定0.5。你需要用Unity内置函数对采样结果解码,修改片元着色器代码如下:
    fixed4 frag (v2f i) : SV_Target
    {
        float2 ScreenspaceUV = i.ScreenPos.xy/ i.ScreenPos.w;
        // 跨平台正确采样深度纹理
        fixed rawDepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, ScreenspaceUV);
        // Linear01Depth会将深度转为[0,1]区间的线性值,0对应近平面,1对应远平面
        float linearDepth = Linear01Depth(rawDepth);
        fixed4 col = fixed4(linearDepth, linearDepth, linearDepth, 1);
        return col;
    }
    
    如果解码后整体偏暗/偏亮,可以调整你定义的_Scale参数缩放线性深度值,获得更清晰的深度可视化效果。
    1. 渲染管线适配问题
      如果你使用的是URP/HDRP渲染管线而非内置渲染管线,需要额外在管线设置面板中开启深度纹理选项,内置管线不需要这一步。
    1. 挂载物体的适配问题
      你当前的Shader关闭了深度写入和测试,如果挂载到非全屏的普通物体上,采样到的是物体覆盖区域对应的屏幕深度,属于正常表现;如果需要做全屏后处理雾效,建议将该Shader作为后处理材质,通过OnRenderImage接口调用,不要挂载到普通3D物体上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:45:08