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

Unity URP自定义Shader导致编辑器网格线显示在物体上方的问题

解决Unity URP编辑器网格线显示在自定义Shader物体上方的问题

问题原因

你的自定义Shader仅实现了UniversalForward渲染Pass,缺少URP不透明物体所需的DepthOnly Pass。编辑器场景网格线的渲染逻辑依赖深度缓冲的提前写入,而你的Shader仅在Forward Pass中写入深度,导致编辑器渲染网格线时,物体的深度信息还未被写入到缓冲中,因此网格线会显示在物体上方。游戏运行时因渲染流程差异,该问题不会出现。

修复后的Shader代码

Shader "Custom/SurfaceShaderExample2"
{
    Properties
    {
        [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags {"RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline" "Queue"="Geometry"}

        // 添加DepthOnly Pass,用于提前写入深度缓冲
        Pass {
            Name "DepthOnly"
            Tags { "LightMode" = "DepthOnly" }

            ZTest LEqual
            ZWrite On
            ColorMask 0

            HLSLPROGRAM
            #pragma vertex DepthOnlyVertex
            #pragma fragment DepthOnlyFragment

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct VertexInput {
                float3 positionOS : POSITION;
            };

            struct Varyings {
                float4 positionHCS : SV_POSITION;
            };

            Varyings DepthOnlyVertex(VertexInput IN) {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS);
                return OUT;
            }

            half4 DepthOnlyFragment(Varyings IN) : SV_TARGET {
                return 0;
            }
            ENDHLSL
        }

        Pass {
            Name "ForwardLit"
            Tags { "LightMode" = "UniversalForward" }

            Cull Back
            Blend One Zero
            ZTest LEqual
            ZWrite On

            HLSLPROGRAM
            
            #pragma vertex Vertex
            #pragma fragment Fragment

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct VertexInput {
                float3 positionOS : POSITION;
            };

            struct Varyings {
                float4 positionHCS : SV_POSITION;
            };

            CBUFFER_START(UnityPerMaterial)
                half4 _BaseColor;
            CBUFFER_END

            Varyings Vertex(VertexInput IN) {
                Varyings OUT;

                OUT.positionHCS = TransformObjectToHClip(IN.positionOS);

                return OUT;
            }

            float4 Fragment(Varyings IN) : SV_TARGET {
                return _BaseColor;
            }

            ENDHLSL
        }
    }
}

说明

添加的DepthOnly Pass会专门负责写入深度缓冲,URP编辑器的渲染管线会优先调用这个Pass来生成场景的深度信息,确保网格线等编辑器辅助元素能正确进行深度测试,从而显示在物体后方。这个Pass不会输出颜色(ColorMask 0),仅处理深度,性能开销极低。

内容的提问来源于stack exchange,提问作者Joni Helén

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:22:41