为什么我的自定义着色器在对象顶部绘制编辑器线条?

问题描述 投票:0回答:2

我在 Unity URP 2022.2 中编写了一个自定义着色器,否则它工作正常,但编辑器网格线被绘制在编辑器窗口中的对象顶部。

Lines on top of the white circle

我用的着色器代码是这样的:

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
        }
    }
}

行为看起来对象没有写入深度,但它与其他对象一起工作正常。唯一的问题是编辑器网格。

unity3d shader hlsl
2个回答
0
投票

问题似乎是我没有在着色器中包含深度通道。当我添加深度通道时,它甚至可以在编辑器窗口中工作。

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 坐标。


0
投票

您的自定义着色器可能无法正确处理深度测试,并导致编辑器线条绘制在您的对象之上。

深度测试被图形管线用来决定哪些像素应该画在前面,哪些像素应该画在后面。在绘制具有透明度或复杂材质的对象时,绘制对象的顺序变得很重要。

为了确保对象以正确的顺序绘制,您需要在着色器中正确设置深度测试。您可以通过将 ZTest 属性设置为执行深度测试的值来执行此操作。

这是一个如何在着色器中设置深度测试的示例:

© www.soinside.com 2019 - 2024. All rights reserved.