着色器优先考虑最低的alpha值

时间:2014-03-13 15:37:14

标签: opengl unity3d glsl transparency shader

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

enter image description here

效果很好,在深度遮罩上添加透明纹理可以创造更自然的“雾边”效果......

enter image description here

这是当前着色器代码:

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

}

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

enter image description here

我认为我需要做的是以某种方式让着色器将具有最低alpha值的像素放入深度缓冲区并忽略其他任何内容。 E.g:

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

但我不知道从哪里开始。我还在学习着色器编程的所有细节,所以我不确定这是混合类型,混合操作,需要深度测试,还是甚至可能。有人可以帮忙吗?

0 个答案:

没有答案