我试图绘制贴花和背景的两种纹理,但是只有贴花的Alpha部分变为白色。
我只是尝试了以下方法。
#version 330 core
in vec2 UV;
out vec3 color;
uniform sampler2D background;
in vec3 decalCoord;
uniform sampler2D decal;
void main(){
vec3 BGTex = texture( background, UV ).rgb;
vec3 DecalTex = texture(decal, decalCoord.xy).rgba;
color =
vec4(BGTex,1.0) + // Background texture is DDS DXT1 (I wonder if DXT1 is the cause?)
vec4(DecalTex,0.0); // Decal texture is DDS DXT3 for alpha
}
// Set below...
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
我能够正常绘制,但是存在以下问题。 -贴花的Alpha部分无法设为透明。
这是可以在fragmenthader中解决的问题吗? 在那种情况下,我应该如何重写代码?
纹理是DDS,其中一种是DXT1类型(背景。因为该纹理不需要alpha),而另一种是DXT3类型(贴花)。这也是原因吗?(都需要是DXT3类型吗?)
另外,我是否应该寻找另一种贴花的方法?
答案 0 :(得分:2)
DecalTex
应该是vec4
,而不是vec3
。否则alpha
值将不会存储。
您还必须将最后一行更改为:color =
vec4(BGTex, 1.0) + DecalTex * DecalTex.a
当前,它设置了alpha分量
到0。
答案 1 :(得分:2)
DecalTex
有一个Alpha通道。 Alpha通道为“权重”,表示DecalTex
的强度。如果Alpha通道为1,则必须使用DecalTex
的颜色,如果Alpha通道为0,则必须使用BGTex
的颜色。
使用mix
来混合BGTex
和DecalTex
的颜色,具体取决于DecalTex
的alpha通道。当然,DecalTex
的类型必须为vec4
:
vec3 BGTex = texture( background, UV ).rgb;
vec4 DecalTex = texture(decal, decalCoord.xy).rgba;
color = vec4(mix(BGTex.rgb, DecalTex.rgb, DecalTex.a), 1.0);
请注意,mix
线性插值在两个值之间:
mix(x, y, a) = x * (1−a) + y * a
这类似于由混合函数和方程式执行的操作:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD);
但是Blending应用于片段着色器的输出以及帧缓冲区中的当前值。
您根本不需要任何混合,因为纹理在片段着色器中被“混合”,并且结果被放入帧缓冲区。由于片段着色器输出的Alpha通道> = 1.0,因此输出完全“不透明”。