为什么我的OpenGL纹理透明?

时间:2014-02-01 12:32:53

标签: c++ opengl textures glsl texture-mapping

我在OpenGL中有一个地形,我使用GLSL mix()函数组合了两个纹理。 这是我正在使用的纹理。 enter image description here

现在我能够组合和混合这两个纹理,但出于某种原因,当我在地形上渲染纹理时,地形变得透明。 我先渲染LHS纹理,然后用alpha通道渲染RHS纹理,我不明白为什么它是透明的。

enter image description here 这是一个有趣的事实,在截图中,你可以看到在Nvidia GPU上渲染时的地形结果,当我在interl HD 3k上渲染相同的东西时,我得到了不同的结果。 这个结果是它应该如何,在下面的截图中没有任何透明。

enter image description here

这是我的片段着色器代码..

void main() 
{
vec4 dryTex   = texture( u_dryTex, vs_texCoord *1 );
vec4 grassTex = texture( u_grassTex, vs_texCoord *1 );
vec4 texColor1= mix(dryTex, grassTex , grassTex.a);   
out_fragColor = texColor1;
}

1 个答案:

答案 0 :(得分:6)

看起来你也在插入alpha通道。在组件方面,混合确实:

texColor1.r = dryTex.r*(1-grassTex.a) + grassTex.r*grassTex.a
texColor1.g = dryTex.g*(1-grassTex.a) + grassTex.g*grassTex.a
texColor1.b = dryTex.b*(1-grassTex.a) + grassTex.b*grassTex.a
texColor1.a = dryTex.a*(1-grassTex.a) + grassTex.a*grassTex.a

因此,不透明dryTex的alpha通道将是

grassTex.a^2

大部分时间都是透明的。

编辑: 修复将是:

void main() 
{
    vec4 dryTex   = texture( u_dryTex, vs_texCoord *1 );
    vec4 grassTex = texture( u_grassTex, vs_texCoord *1 );
    vec4 texColor1= vec4(mix(dryTex.rgb, grassTex.rgb, grassTex.a), 1);   
    out_fragColor = texColor1;
}