我正在创建一个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值的像素放入深度缓冲区并忽略其他任何内容。 E.g:
if ( newPixel.alpha < currentPixelInDepthBuffer.alpha )
currentPixelInDepthBuffer = newPixel;
但我不知道从哪里开始。我还在学习着色器编程的所有细节,所以我不确定这是混合类型,混合操作,需要深度测试,还是甚至可能。有人可以帮忙吗?