Alpha使用GLSL在两个不同的通道上混合纹理

时间:2012-11-28 05:04:23

标签: opengl glsl textures alphablending

我所拥有的是在3x3网格中的一组9个正方形,用于测试此混合函数。这是想法。

传球1:

  • 绑定texture1(污垢)
  • 使用tex1 = Dirt
  • 渲染方块

传球2:

  • 绑定texture2(字母)
  • 使用tex2 = Letter W
  • 渲染相同的正方形

这适用于游戏编辑器。我们希望能够在键入文本图集时更改字母的颜色。着色器应该检查纹理中片段的alpha值。任何不等于0(即可见)的东西都应该改变为作为属性传递到着色器的所需颜色。

//Draw all Squares

glBindTexture(GL_TEXTURE_2D, textureID1);   //Dirt Texture

for (int Index = 0; Index < 9; Index++)
{
//Pass in Vertex Positions...
//Pass in UV's...
glDrawArrays(GL_TRIANGLES, 0, 6); // From index 0 to 6 -> 2 triangle
}

//Redraw Squares with letter texture bound.

glBindTexture(GL_TEXTURE_2D, textureID2);  //Letter Texture

glVertexAttrib3f(2,255,0,0);  //Desired Color of letter, passed to shaders.

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.05f);  //Anything with alpha < 0.05 is discarded.

//Draw all Squares
for (int Index = 0; Index < 9; Index++)
{
   //Pass in Vertex Positions...
   //Pass in UV's...
glDrawArrays(GL_TRIANGLES, 0, 6); // From index 0 to 6 -> 2 triangle
}

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisable(GL_ALPHA_TEST);

//Draw blue vertex dots...etc...

这是一张显示源图像的图片,以及2个略有不同的片段着色器的输出。随着期望的结果。

Image Sources, with Frag Shaders and Desired Result

加载纹理,都有alpha通道(GL_BGRA,Targas)。我正在使用GL_NEAREST作为MIN / MAG FILTERS。

奇怪的是,如果我在LETTER TEXTURE的alpha通道中使用99%白色(即254)并且在使用全白(即255)时失败,则此着色器适用于我。

我已尝试启用GL_BLEND并使用各种BlendFunc,但它们似乎无法正常工作。

我猜问题是。如果不使用多重纹理着色器,并且没有渲染到FBO,这是进行这种混合的正确方法吗?

1 个答案:

答案 0 :(得分:0)

事实证明,这是着色器表现得像我预期的那样,但我误解了这意味着什么。

在这种情况下,我使用相同的着色器来渲染初始背景纹理和重叠文本纹理。因为背景纹理上的alpha通道是一个实心的1.0(白色),所以它一直穿过它将污垢纹理渲染为纯红色。然后在第二遍,它会正确地渲染文本,但我看不到它,因为它也被渲染为红色。

我在这种情况下解决了我的问题,而是在字母纹理的alpha通道中用黑色(即透明)绘制字母,然后在着色器中进行alpha测试并在必要时进行反转。使用此方法的是在呈现字母之前启用混合,并在之后禁用它。

最后,着色器的工作方式与此类似。

  • 如果片段α&lt; 1
    然后,Color = vec4(in_color,(tex_color.a =(tex.color.a)?(1.0 - tex_color.a):1.0));

  • 否则,(Alpha = 1)反转alpha通道
    tex_color.a = 0;
    Color = tex_color;

这使得在启用混合的情况下,在alpha通道中以黑色绘制的任何内容将变为彩色而非透明。

最后,多纹理可能是要走的路,但在我的情况下,我想尝试一次只启用1个纹理。