2010-06-23 103 views
3

加載圖像後,我將每個通道的單個字節加載到無符號字符數組中。它傳遞給一個將它作爲紋理投影到四邊形上的函數。一切似乎正常工作,除了alpha通道,它顯示爲背景顏色。我使用OpenGL繪製圖像。我會通過添加分層機制獲益嗎?另外,我怎樣才能達到我想要的透明效果?在OpenGl中正確繪製alpha通道

注:這是我有一種感覺,需要改變的代碼:

void SetUpView() 
{ 
    // Set color and depth clear value 
    glClearDepth(1.f); 
    glClearColor(1.f, 0.f, 0.f, 0.f); 

    // Enable Z-buffer read and write 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glDepthMask(GL_TRUE); 

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

    // Setup a perspective projection 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(90.f, 1.f, 1.f, 500.f); 
}; 

而且,這裏呈現四碼。

void DrawTexturedRect(RectBounds *Verts, Image *Texture) 
{ 
    glBindTexture(GL_TEXTURE_2D, GetTextureID(Texture)); 

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glPixelZoom(1, -1); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 1.0); 
    glVertex3f(Verts->corners[0].x, Verts->corners[0].y, Verts->corners[0].z); 

    glTexCoord2f(1.0, 1.0); 
    glVertex3f(Verts->corners[1].x, Verts->corners[1].y, Verts->corners[1].z); 

    glTexCoord2f(1.0, 0.0); 
    glVertex3f(Verts->corners[2].x, Verts->corners[2].y, Verts->corners[2].z); 

    glTexCoord2f(0.0, 0.0); 
    glVertex3f(Verts->corners[3].x, Verts->corners[3].y, Verts->corners[3].z); 
    glEnd(); 
}; 

Image類包含使用OpenIL獲取的無符號字符數組。

相關的代碼:

loaded = ilLoadImage(filename.c_str()); 
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); 

unsigned char *bytes = ilGetData(); 

//NewImage is an instance of an Image. This is returned and passed to the above function. 
NewImage->data = bytes; 

Problem http://img375.imageshack.us/img375/9585/j120192.png

由於

+1

沒有足夠的數據。您沒有顯示紋理加載例程,也沒有顯示實際的渲染例程。 – SigTerm 2010-06-23 21:45:05

+0

好的,我試着清理渲染循環中發生的事情。 – Jeff 2010-06-23 22:07:54

+0

另外,你如何設置OpenGL?你確定你一直在請求alpha通道嗎(例如,如果使用過剩,則使用像素格式,如果使用glut,則使用GLUT_RGBA)? – sbk 2010-06-23 22:47:46

回答

0

glClearColor(1.F,0.f,0.f,0.f);

我假設這是在RGBA默認情況下,你將紅色設置爲1.0。

如何更好地解釋你想要完成什麼?

+1

看光標周圍的紅色框?在Paint.Net中,沒有任何東西。它應該是alpha通道。 – Jeff 2010-06-23 21:35:56

0

嘗試:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

編輯:我知道那是什麼樣子。看起來您正在繪製藍色方塊(其具有將光標放在光標後面的Z順序位置)。您必須在Alpha混合時以正確的,背對背的Z順序繪製事物,否則您會看到像您所看到的錯誤。

+0

謝謝,但我仍然得到相同的效果。應該調用一次還是每一幀? – Jeff 2010-06-23 21:37:29

2

之前繪製任何透明的,你應該叫:

glDepthMask(false); 

然後算賬:

glDepthMask(true); 

而且,全透明的對象必須全部不透明的人憔悴。

+0

我有同樣的問題,這解決了我的問題。 – Balk 2013-10-06 23:27:04

相關問題