我希望从纹理中读取每个像素的 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 的教程的链接。
谢谢 :)