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
相关产品推荐
相关产品推荐

