2013-01-10 57 views
0

當我嘗試在對象上顯示紋理時,它可以正常工作,但僅禁用GL_BLEND。當我啓用混合時:OpenGL - 紋理在啓用混合時不可見

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

紋理不再可見。黑屏。 我真的不知道發生了什麼事。其相同的JPG和PNG與alpha通道。

EDIT(詳細信息):

那麼,它很難粘貼代碼(對象,對象eveywhere和巨大的),但它是這樣的:

//初始化 - 我評論一切

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

//製備紋理

glEnable(GL_TEXTURE_2D); 
glGenTextures(1, &texture_id); 
glBindTexture(GL_TEXTURE_2D, texture_id); 

int Mode = GL_BGR; 

int nOfColors = image->format->BytesPerPixel; 
if (nOfColors == 4) { 
    if (image->format->Rmask == 0x000000ff) 
     Mode = GL_RGBA; 
    else 
     Mode = GL_BGRA; 
} else if (nOfColors == 3) { 
    if (image->format->Rmask == 0x000000ff) 
     Mode = GL_RGB; 
    else 
     Mode = GL_BGR; 
} 

// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 

glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, image->w, image->h, 0, Mode, GL_UNSIGNED_BYTE, image->pixels); 
glDisable(GL_TEXTURE_2D); 

//繪製

glColor4f(1.0f,1.0f,1.0f,1.0f); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, _i); 

glBegin(GL_QUADS); 
glTexCoord2f(0, 0); 
glVertex2f(x, y); 
glTexCoord2f(1, 0); 
glVertex2f(x + width, y); 
glTexCoord2f(1, 1); 
glVertex2f(x + width, y + height); 
glTexCoord2f(0, 1); 
glVertex2f(x, y + height); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D, NULL); 
glDisable(GL_TEXTURE_2D); 

EDIT2

「黑屏」可能是有點混亂 - 我的意思是不顯示任何內容(我的背景是黑色的,但它不事關) - 如果我把混合過我在屏幕上得到質地不錯的 - 只與背景顏色混合

+0

如果你'glBlendFunc(GL_SRC_ALPHA,GL_ONE)會發生什麼;'?你有任何GL_DST_ALPHA設置? – sqreept

+0

這需要更多的信息。你還在畫什麼?這個紋理對象是場景中唯一的東西,還是當你繪製時,所有的東西都會消失?什麼是你的紋理的alpha? – Tim

+1

嘗試在渲染紋理之前調用'glColor4f(1.0,1.0,1.0,1.0);'。 –

回答

0

所以它終於開始工作後,我改變我的圖像加載庫到Devil。以前有似乎alpha通道的問題。

感謝所有您的幫助

0

看起來好像你的alpha通道全是0 - 你肯定你正在閱讀你的紋理(與alpha通道)?嘗試用手填充它,或者檢查它是否真的被您用來將文件讀入像素的軟件填充。

0

您是否嘗試調用glTexEnvf?

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

這裏是例子:http://unick-soft.ru/art/files/basicBlend.zip

對於你的情況,你需要看看這段代碼:

//draw texture 
glPushMatrix(); 
glColor4f(1.0, 1.0, 0.0, 1.0); 
texture.switchOffTexture(); 
Sphere.drawObject(); 
glTranslatef(0.0, 0.0, 7.0); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
texture.bindTexture(); 
glBegin(GL_POLYGON); 
    glTexCoord2f(0.0, 0.0); 
    glVertex3f(-1.0, -1.0, 0.0); 
    glTexCoord2f(1.0, 0.0); 
    glVertex3f(1.0, -1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); 
    glVertex3f(1.0, 1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); 
    glVertex3f(-1.0, 1.0, 0.0); 
glEnd(); 
glPopMatrix(); 

如果你有編譯問題,你可以發表評論包括:#包括< GL \ glaux.h>

按1,2,3按鈕選擇混合類型。在情況3你會看到這個結果http://unick-soft.ru/art/img/blend/text_blend.png