向统一着色器添加透明度处理(alpha 集响应)

Add transparency handling (alpha set response) to unity shader

我有一个不响应 alpha 变化的线条渲染器的着色器。查看有意义的代码。 我不能使用默认的 material 和 alpha 处理,因为线渲染器没有正确绘制它(它表现为广告牌并且未正确渲染)。所以我想将 alpha 处理合并到我的着色器中。

着色器最终 returns 行中的颜色:

finalColor = _Color;

但我不知道如何传入 alpha,以便在统一使用此着色器时可以在编辑器中或代码中处理透明度 material。

在下面找到着色器代码:

Shader "CustomShaders/UnlitColorAbove"
{
    Properties
    {
        _Color("Color", Color) = (0,0,0,0)
    }
    
    SubShader
    {
        
        
        Tags { "RenderType"="Opaque" }
        LOD 100

        CGINCLUDE
        #pragma target 3.0
        ENDCG
        Blend Off
        Cull Back
        ColorMask RGBA
        ZWrite On
        ZTest Always
        
        
        
        Pass
        {
            Name "Unlit"
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"            

            struct appdata
            {
                float4 vertex : POSITION;
                float4 color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                
            };
            
            struct v2f
            {
                float4 vertex : SV_POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                UNITY_VERTEX_OUTPUT_STEREO
                
            };

            uniform float4 _Color;
            
            v2f vert ( appdata v )
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                UNITY_TRANSFER_INSTANCE_ID(v, o);

                
                float4 vertexValue =  float3(0,0,0,0) ;
                #if ASE_ABSOLUTE_VERTEX_POS
                v.vertex.xyzw = vertexValue;
                #else
                v.vertex.xyzw += vertexValue;
                #endif
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }
            
            fixed4 frag (v2f i ) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i);
                fixed4 finalColor;
                
                
                finalColor = _Color;
                return finalColor;
            }
            ENDCG
        }
    }
    CustomEditor "ASEMaterialInspector"
}

还有一些我尝试将 alpha 处理合并到着色器中的东西:

https://answers.unity.com/questions/676989/how-can-i-add-transparency-to-this.html

https://forum.unity.com/threads/how-add-support-to-alpha-on-this-shader.494460/

但是没有成功,因为我不熟悉shader编程,shader不工作或者编译不上

您提供的 * 显示了您的着色器实际上缺少什么来支持 alpha 透明度。

您需要将 alpha 混合添加到您的着色器中,而不是:

Blend Off

应该是,例如**:

Blend SrcAlpha OneMinusSrcAlpha

大致就是这样***


我还注意到您正在使用 Amplify Shader Editor(因为您的代码底部有注释 CustomEditor "ASEMaterialInspector"

您要找的设置在这里:


.* 您链接的前两个线程讨论了向表面着色器添加 alpha 透明度,而您提供的着色器是顶点片段着色器。

.** 有关混合类型的更多信息 see unity docs). Also I could recommend this cool talk about VFX in Diablo,其中显示了选择适当的混合对着色器的重要性。

.*** 你在行 float4 vertexValue = float3(0,0,0,0) ; 中有一个错字,它应该是 float4(0,0,0,0),你也应该考虑将 Tags { "RenderType"="Opaque" } 更改为 Tags { "Queue"="Transparent" } 你可以阅读更多关于 SubShader 标签 here