2011-01-05 71 views
0

我試圖在彩色四邊形上方繪製部分透明的紋理,以便顏色透過透明部分,製作輪廓。這是代碼:OpenGL中的透明紋理不能代替四角alpha

// Setup 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 

// (...) 
// Get image bits in object 't' 
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
// (...) 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

// Underlying coloured quad 
glColor4d(0.0, 1.0, 0.0, 1.0);  
glBindTexture(GL_TEXTURE_2D, 0); 
glBegin(GL_QUADS); 
    glVertex3d(coords11.first, coords11.second, -0.001); 
    glVertex3d(coords12.first, coords12.second, -0.001); 
    glVertex3d(coords21.first, coords21.second, -0.001); 
    glVertex3d(coords22.first, coords22.second, -0.001); 
glEnd(); 

// Textured quad  
glColor4d(1.0, 1.0, 1.0, 0.5); 
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]); 
glBegin(GL_QUADS); 
    glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0); 
    glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0); 
    glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0); 
    glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0); 
glEnd(); 

紋理是黑色的,除非它具有城堡的輪廓;該部分是透明的(和白色)。因此,預期的行爲是一個帶有綠色輪廓的黑色矩形。我得到的卻是一個綠色的矩形白色輪廓:

Screenshot

與對紋理四爲0.5 Alpha的。如果我把它設置爲1.0,我會回覆沒有透明度的紋理,就像(哦,不能將第二個截圖作爲鏈接發佈;它在s330.photobucket.com/albums/l412/TWBWar/?action =查看& current = replace10.png)。隨着alpha爲0,我得到一個綠色的矩形。因此,在我看來,紋理四邊形正在使用glColor4d設置的alpha值進行混合,而不是來自紋理的值,這是我對GL_REPLACE的期望。 (我也嘗試過使用GL_DECAL和GL_MODULATE,但我無法獲得我想要的行爲。)任何人都可以告訴我如何讓OpenGL使用紋理而不是四邊形進行混合?

回答

9

準備好去一趟內存通道。

glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...); 

3那裏是你的問題。參數(RGBA + UNSIGNED_BYTE)的右側部分提到了您的源數據類型。 目的地數據類型是第三個參數(即GL將存儲您的紋理作爲)。

碰巧,創建GL 1.0時,紋理更簡單一些。因此,參數只被要求指定你想爲你的最終紋理通道的數量,與映射

1=GL_LUMINANCE 
2=GL_LUMINANCE_ALPHA 
3=GL_RGB 
4=GL_RGBA 

我相信這不鼓勵使用,但你可以看到,仍然有效。

所以......你的紋理被存儲爲GL_RGB,沒有alpha。

其餘的是簡單的應用規範。用RGB內部格式替換紋理的部分是final_color=texture_colorfinal_alpha=fragment_alpha(也就是glColor的源代碼)。有關基於內部格式的紋理環境的完整表格,請參見this man page

+0

謝謝,那就是問題所在。 – 2011-01-06 03:31:05