Opengl 对最低alpha值进行优先级排序的着色器

Opengl 对最低alpha值进行优先级排序的着色器,opengl,unity3d,glsl,transparency,shader,Opengl,Unity3d,Glsl,Transparency,Shader,我正在创建一个2D战争之雾效果,我正在使用深度遮罩切割一个黑暗的覆盖层。这就是效果 它工作得很好,在深度遮罩的顶部添加一个透明纹理可以创建一个更自然的“雾边界”效果 以下是执行此操作的当前着色器代码: Shader "Mobile/Unlit/Transparent Blend" { Properties { _Color ("Main Color (A=Opacity)", Color) = (1,1,1,1) _MainTex ("Base (A=Opacity)",

我正在创建一个2D战争之雾效果,我正在使用深度遮罩切割一个黑暗的覆盖层。这就是效果

它工作得很好,在深度遮罩的顶部添加一个透明纹理可以创建一个更自然的“雾边界”效果

以下是执行此操作的当前着色器代码:

Shader "Mobile/Unlit/Transparent Blend" {

Properties {
    _Color ("Main Color (A=Opacity)", Color) = (1,1,1,1)
    _MainTex ("Base (A=Opacity)", 2D) = ""
}

Category {
    Tags {"Queue"="Transparent" "IgnoreProjector"="True"}
    Blend SrcAlpha OneMinusSrcAlpha

    SubShader {Pass {
        GLSLPROGRAM
        varying mediump vec2 uv;

        #ifdef VERTEX
        uniform mediump vec4 _MainTex_ST;
        void main() {
            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
            uv = gl_MultiTexCoord0.xy * _MainTex_ST.xy + _MainTex_ST.zw;    
        }
        #endif

        #ifdef FRAGMENT
        uniform lowp sampler2D _MainTex;
        uniform lowp vec4 _Color;
        void main() {   
            gl_FragColor = texture2D(_MainTex, uv) * _Color;    
        }
        #endif      
        ENDGLSL 
    }}

    SubShader {Pass {
        SetTexture[_MainTex] {Combine texture * constant ConstantColor[_Color]}
    }}
}
}

但是,当我尝试将多个雾孔组合在一起创建一条路线时,会出现一个问题。深度遮罩效果很好,但顶部的透明“雾边界”纹理相互重叠

我想我需要做的是让着色器将alpha值最低的像素放入深度缓冲区,忽略任何其他内容。例如:

if ( newPixel.alpha < currentPixelInDepthBuffer.alpha )
currentPixelInDepthBuffer = newPixel;
if(newPixel.alpha

但我不知道从哪里开始。我仍在学习着色器编程的所有细节,因此我不确定这是否是一种混合类型、混合操作、是否需要深度测试,或者是否可能。有人能帮忙吗?

你能不能丢弃阿尔法值最高的碎片?我当然可以试试这种方法。我知道如何检查着色器附加到的纹理的alpha值,但我不知道如何从它下面的任何可能的纹理访问像素信息。如何比较信息?glEnable(GL_ALPHA_测试);这将在着色器外部进行测试。我认为在处理着色器后会对其进行测试,但我不完全确定,您必须对其进行测试。您也可以写入纹理而不是后台缓冲区,并使用该纹理作为采样器来查询alpha值,但我真的认为这太过分了。再次感谢Jean Simon的回复。我以前写过一个纹理,但你说得对,写得有点慢。我想我能做的是添加行
AlphaTest-Less-DstAlpha
,但我相信DstAlpha是
Blend
所独有的属性,我不知道如何从
DstAlpha
命令之外的帧缓冲区读取此信息。