我正在尝试使用 RGBA 值加载纹理,但 alpha 值似乎只是使纹理更白,而不是调整透明度。我听说过 3D 场景存在这个问题,但我只是将 OpenGL 用于 2D。无论如何我可以解决这个问题吗?
我正在初始化 OpenGL
glViewport(0, 0, winWidth, winHeight);
glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, winWidth, 0, winHeight); // set origin to bottom left corner
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 1, 1);
屏幕截图: 那个褪色的点状图像应该是半透明的。黑色位应该是完全透明的。如您所见,它背后有一个图像没有显示出来。
生成该纹理的代码相当长,所以我将描述我所做的。它是一个 40*30*4 类型的 unsigned char 数组。每 4 个字符设置为 128(应该是 50% 透明,对吧?)。
然后我将它传递给这个函数,将数据加载到纹理中:
void Texture::Load(unsigned char* data, GLenum format) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _texID);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, format, GL_UNSIGNED_BYTE, data);
glDisable(GL_TEXTURE_2D);
}
而且...我想我刚刚发现了问题。正在使用以下代码初始化全尺寸纹理:
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _texID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glDisable(GL_TEXTURE_2D);
但我猜 glTexImage2D 也需要是 GL_RGBA 吗?我不能使用两种不同的内部格式?或者至少不是不同大小的(3字节对4字节)?GL_BGR 即使像这样初始化也能正常工作......