2012-07-22 84 views
1

我試圖在OpenGL上放置一個紋理(帶有alpha)的另一個紋理。我這樣做沒有任何問題,但它不是我想要的:我的最近的圖片的顏色深受背景圖片(最好的紋理)導致呈現橙色,儘管紅色。保持原來的顏色

任何人都知道一種混合(或擺脫阿爾法),將解決這個問題的方式?

融合初始化:

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

繪製場景:

glClear(GL_COLOR_BUFFER_BIT); 
glLoadIdentity(); 

//furthest image (background) 
glBindTexture(GL_TEXTURE_2D, texture[1]); 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); glVertex2f(0, 0); 
    glTexCoord2f(1, 0); glVertex2f(500, 0); 
    glTexCoord2f(1, 1); glVertex2f(500, 500); 
    glTexCoord2f(0, 1); glVertex2f(0, 500); 
glEnd(); 

//nearest image (appears orange, should be red) 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); glVertex2f(100, 100); 
    glTexCoord2f(1, 0); glVertex2f(300, 100); 
    glTexCoord2f(1, 1); glVertex2f(300, 300); 
    glTexCoord2f(0, 1); glVertex2f(100, 300); 
glEnd(); 

glutSwapBuffers(); 

編輯。 這裏有一個形象描繪它的外觀: issue

下面是怎樣看的圖像: target

+0

我看不到你在混合什麼顏色,你想要達到什麼以及你實際達到了什麼。如果最近的圖像是透明的,爲什麼它不會受其背景影響?橙色有什麼問題? – Kos 2012-07-22 15:38:54

+0

@Kos嗯,我有一個綠色的背景,我有一個紅色的紋理,其中使用alpha的地方。在那些地方我想提到背景(草)。這就像2D遊戲,玩家在表面上行走。相反,我的背景顏色影響「玩家」,因此我的紅色紋理變成橙色(紅色+綠色)。 – Robin92 2012-07-22 15:49:13

回答

2

我相信你想要的是「alpha測試」,而不是融合。見

glEnable(GL_ALPHA_TEST) 
glAlphaFunc() 

如果你想離開勾兌啓用,您應該使用

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

這將只使用地源顏色在源alpha爲1.目前你的函數添加源顏色背景顏色。

如果你不想混合任何顏色,那麼使用alpha測試是更好的方法,因爲它使用較少的資源,然後混合。

+0

這也行不通。它圍繞我的紋理創建黑色表面(圍繞該R字母)。 – Robin92 2012-07-22 16:04:27

+0

聽起來像你的圖像的alpha通道缺失或損壞。 @ Robin92 – Tim 2012-07-22 16:16:10

+0

你說得對!將我的紋理作爲PNG(BMP)解決了問題。謝謝:) @Tim – Robin92 2012-07-22 16:23:40

2

這種混合FUNC

glBlendFunc(GL_SRC_ALPHA, GL_ONE); 

是你的問題的原因。目的地的GL_ONE意味着,幀緩衝區中已存在的任何內容都將被添加到alpha值的輸入顏色對角線上。

在你的情況下,你的紅色紋理被添加了綠色的背景。而且由於紅色+綠色=橙色這就是你得到的。

你想要的是掩蓋了目標幀緩衝區以前的內容與你的alpha通道,這是使用

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

還記得OpenGL的狀態,就是要建立和按需重置,所以繪畫時完成其他紋理,然後你可能需要其他設置混合和混合功能。

0

隨着大家的幫助,我設法解決的問題:

  • 重新保存我的紋理PNG(儘管BMP的)
  • 改變混合功能glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

謝謝到所有捐獻者:)

相關問題