2012-06-25 168 views
3

我正在使用精靈動畫(OpenGL + C++)。 我在混合過程中遇到了一些麻煩。黑色背景的OpenGL透明度

我試圖與黑色背景加載圖像並繪製了另一個紋理沒有出現在圖像周圍的黑塊。圖像具有Alpha通道並啓用混合。

我試着用不同的混合功能的發揮。我要麼結束了一個塊狀圖像或半透明的圖像。

我知道我能做到這一點,如果我有一個透明的顏色,而不是使用圖像編輯軟件,代替黑的背景,但我想獲得這個工作沒有這一點,不使用圖像掩碼。

一個例子,以更好地理解我的處境。

圖像0​​圖像在紋理正確完成:

enter image description here

我想這是方式:

enter image description here

這裏是一個代碼位,我使用。我挑選了一些看起來最相關的東西,因爲很多代碼都分佈在幾個類中。

glEnable(GL_DEPTH_TEST); 
    .... 
    .... 
    glEnable(GL_TEXTURE_2D); 
    /*Drawing the image with black background first*/ 
    glBindTexture(GL_TEXTURE_2D, blockImage); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
     //drawing code 
     ... 
    ... 
    ... 
    /*background texture is drawn last*/ 
    glBindTexture(GL_TEXTURE_2D, bgImage); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glBlendFunc(GL_ONE, GL_DST_ALPHA); 
    //drawing code 
     ... 
    glDisable(GL_BLEND); 
    glDisable(GL_TEXTURE_2D); 

我真的不需要真正的代碼來做到這一點。對邏輯的小解釋就足夠了(繪圖和混合的順序)。

+2

圖像的alpha通道的表示會很有幫助。 – Luca

+0

也是您當前的一組代碼!我的代碼完全符合您要求的功能,在iPhone/iPad應用上使用OpenGL ES完成。我只需要看看你已經有了什麼! – trumpetlicks

+1

*「我知道我可以做到這一點,如果我用透明顏色替換黑色背景,而不是使用圖像編輯軟件,但我希望在沒有這個的情況下使用它。」*您是否想說黑色背景不是100源圖像中透明度爲%?如果這就是你想要做的,OpenGL不支持顏色鍵控。 – Tim

回答

1

的OpenGL固定功能管線有顏色鍵控沒有內置支持。如果你想這樣做,你可以寫一個着色器來測試片段的顏色,並使用discard操作。

如果你想這樣做,在固定功能,你必須正確地使用alpha通道(使所有的黑色區域的α= 0的預處理)。

+0

謝謝。在讀取數據後立即轉換爲OpenGL紋理之前更改Alpha通道運行良好。 –