我在 Unity URP 2022.2 中编写了一个自定义着色器,否则它工作正常,但编辑器网格线被绘制在编辑器窗口中的对象顶部。
我用的着色器代码是这样的:
Shader "Custom/SurfaceShaderExample2"
{
Properties
{
[MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags {"RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline" "Queue"="Geometry"}
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
}
}
}
行为看起来对象没有写入深度,但它与其他对象一起工作正常。唯一的问题是编辑器网格。
问题似乎是我没有在着色器中包含深度通道。当我添加深度通道时,它甚至可以在编辑器窗口中工作。
Pass {
Name "Depth"
Tags { "LightMode" = "DepthOnly" }
Cull Back
ZTest LEqual
ZWrite On
ColorMask R
HLSLPROGRAM
#pragma vertex Vertex
#pragma fragment Fragment
#include "../Common/SurfaceShaderExampleDepthProgram.hlsl"
ENDHLSL
}
pass 只是输出裁剪空间的 z 坐标。
您的自定义着色器可能无法正确处理深度测试,并导致编辑器线条绘制在您的对象之上。
深度测试被图形管线用来决定哪些像素应该画在前面,哪些像素应该画在后面。在绘制具有透明度或复杂材质的对象时,绘制对象的顺序变得很重要。
为了确保对象以正确的顺序绘制,您需要在着色器中正确设置深度测试。您可以通过将 ZTest 属性设置为执行深度测试的值来执行此操作。
这是一个如何在着色器中设置深度测试的示例: