我試圖加載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