OpenGL - 如何从纹理中读取Alpha

时间:2013-09-08 19:01:10

标签: opengl textures alpha-transparency

我希望从纹理中为每个像素读取alpha值,以便某些像素完全消失。纹理文件(targa格式)确实包含正确的alpha通道。

屏幕截图:http://i43.tinypic.com/2i79s1x.png

以下是我使用的选项:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGR,  //changing GL_BGR to anything else doesn't do a thing :? also tried GL_BGRA.
GL_UNSIGNED_BYTE, targaImage);

我还尝试了glBlendFunc的大多数参数组合,但是没有一个能达到效果,尽管我可能已经跳过了它。这是正确混合完成的(基于glColor的alpha):

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

矩形绘图:

    glColor4f(1,1,1,0.5);
    mRect->Render();

如果我将alpha设置为1则完全不透明,但右下角仍有白色,这意味着从纹理中读取alpha,但其下方的白色多边形是可见的。所以我需要让多边形以某种方式消失,但纹理仍然可见。

这就是我在图片中实现这一目标的方式。我也试过这个:

glAlphaFunc(GL_GREATER, 0.49);
glEnable(GL_ALPHA_TEST);

它只能证明我矩形的每个片段'的alpha是0.5。

此纹理文件的渐变在中间的蓝色圆圈周围有一个完整的红色,但是从左上角的0到左下角的完整红色(不是红色渐变为白色)。

我会提供整个代码,但它有超过2k行,我已将所有内容拆分为类,所以我只是拉出我认为重要的部分。

我需要自己的着色器吗?几周前我只是第一次接触OpenGL和C ++而我还没有进入它们,所以如果这是解决方案,我会很感激链接到一个处理alpha和GLSL的教程。

谢谢:)

1 个答案:

答案 0 :(得分:0)

看起来你正在使用旧的固定功能管道。有了它,你必须正确配置纹理环境。具体来说,您希望纹理调制替换基色。要么很好,但我认为替换模式更适合你。

绑定纹理后,使用glTexEnvi设置模式,具体为

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

另外,我想提醒您,您实际上必须启用混合(glEnable(GL_BLEND);

如果你看一下 glTexEnv 的参考页面,我想你很容易理解固定功能纹理环境管道的状态空间变得多么复杂。我强烈建议你不要理会它并直接使用可编程管道,即片段着色器。是的,他们的学习曲线非常陡峭,但使用着色器,您实际上可以编写清晰易读的内容,如

#version 330
uniform sampler3D sampler_albedo;
uniform sampler2D sampler_diffuse;
out vec4 outcolor;

main()
{
    float albedo = texture(sampler_albedo, texcood);
    vec4 diffuse = texture(sampler_diffuse, texcoord);
    outcolor = mix(basecolor, diffuse.rgb, diffuse.a) * albedo;
}

而不是花费超过15行来设置纹理环境并注册组合器。