-2

我希望从纹理中读取每个像素的 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);

它仅证明我的矩形的每个 ,,fragment'' 的 alpha 为 0.5。

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

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

我需要自己的着色器来做到这一点吗?几周前我才第一次接触 OpenGL 和 C++,但我还没有接触到它们,所以如果这是解决方案,我将不胜感激一个处理 alpha 和 GLSL 的教程的链接。

谢谢 :)

4

1 回答 1

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 行来设置纹理环境和注册组合器。

于 2013-09-08T19:17:18.013 回答