2009-04-17 174 views
4

我試圖加載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即使在初始化時也能正常工作...

+0

對於包含截圖的+1,在OpenGL問題中應該是必須的。 :) – unwind 2009-04-17 08:05:02

+0

是的,它現在變得更容易回答。 (我編輯了我的帖子,順便說一句) – aib 2009-04-17 13:48:54

回答

4

爲了他人的利益,我在這裏發佈我的解決方案。

的問題是,雖然我的裝載功能是正確的,

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, GL_RGBA, GL_UNSIGNED_BYTE, data); 

我經過GL_RGB這個功能

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); 

其中需要指定正確的字節數(4 )。從我的理解你不能使用不同的字節數的SubImage,雖然我認爲你可以使用不同的格式,如果它確實有相同數量的字節(即混合GL_RGBGL_BGA是好的,但不是GL_RGBGL_RGBA)。

1

在場景中是否有重疊的基元?

您知道您正在調用glColor的3參數版本,它將alpha設置爲1.0,對嗎?

如果您可以張貼屏幕截圖或以其他方式描述發生了什麼,比如說繪製具有相同顏色和不同字母的兩個圖元時可能會有所幫助。事實上,任何代碼都可以幫助解決問題。

編輯:

我想像,使用TexImage與GL_RGB(用於internalformat,第三個參數)創建了一個3分量的質感與隱式初始化到1沒有alpha或α值,不管是什麼樣的您提供的像素數據。

GL_BGR對於這個參數不是一個有效的值,它可能是欺騙你的實現使用一個完整的4字節內部格式? (或按照GL_LUMINANCE_ALPHA的2字節)或者你的意思是通過GL_BGR你的Texture :: Load()函數,這應該不是真的不同於傳遞GL_RGB

0

我認爲這應該有效,但它假定圖像有一個alpha通道。如果你嘗試加載一個沒有Alpha通道的圖像,你會得到一個異常,或者你的應用程序可能會崩潰。對於非alpha通道圖像,在設置GL_UNSIGNED_BYTE之前,使用GL_RGB而不是GL_RGBA作爲第二個參數。

void Texture::Load(unsigned char* data) { 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, _texID); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 
    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); 
}