我试图加载RGBA值的纹理,但阿尔法值似乎使纹理更白,不调整透明度。我已经听说过关于3D场景的这个问题,但我只是使用OpenGL for 2D。无论如何,我可以解决这个问题吗?OpenGL Alpha值使纹理更白?
我初始化的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);
截图: 那洗出疯疯癫癫的形象应该是半透明的。黑色的位应该是完全透明的。正如你所看到的那样,背后有一张未透露的图像。
生成该纹理的代码相当长,所以我将描述我所做的。它是一个类型为unsigned char的40 * 30 * 4数组。每第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字节vs 4字节)? GL_BGR即使在初始化时也能正常工作...
对于包含截图的+1,在OpenGL问题中应该是必须的。 :) – unwind 2009-04-17 08:05:02
是的,它现在变得更容易回答。 (我编辑了我的帖子,顺便说一句) – aib 2009-04-17 13:48:54