2010-08-29 155 views
1

我試圖得到一個相當簡單的效果;我希望我的精靈能夠使用GL所使用的Alpha通道(即,透過圖像的一部分,但不是全部)以及整個精靈具有「不透明度」級別,這會影響整個精靈。OpenGL - 使用紋理的alpha通道和「全局」不透明度

我有後面的部分,這是一個簡單的使用GL_MODULATE和傳遞color4d(不透明度,不透明度,不透明度,不透明度)的問題。像夢一樣工作。

但問題出在第一部分;部分半透明的圖像。我想我可以扔掉一個glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);並啓用混合,但不幸的是它沒有這樣做。它所做的似乎是「美白」所述圖像的顏色,而不是使其變得半透明。任何通過它的其他精靈都表現得好像是一塊堅實的顏色塊,並直接切斷。

僅供參考,我禁用了照明,z緩衝區,顏色材質和alpha測試。以防萬一陰影模型。但除此之外,我使用默認的鄰接設置。我使用teximage2d來處理有問題的紋理,我確定格式和GL_RGBA都設置正確。

如何在混合過程中讓GL考慮紋理的Alpha通道?

+0

你是否啓用與glEnable混合?此外,要設置精靈的不透明度,您不需要GL_MODULATE,只需使用color4d(1,1,1,alpha); – 2010-08-29 10:15:53

+0

我同意@Bahbar。你所描述的應該工作(並且對我來說)。我想如果你發佈了一些你的代碼,它會有幫助。一個小點:我認爲你應該使用color4d(1,1,1,不透明度)。你使用的顏色意味着精靈會變得更加透明,同時會變暗。 – Rich 2011-05-12 14:44:13

回答

1

最簡單和最快的解決方案是有一個片段着色器。

uniform float alpha; 
uniform sampler2D texture; 
main(){ 
    gl_FragColor = texture2d(texture, gl_TexCoords); 
    gl_FragColor.a *= alpha; 
} 
1
  • GL_MODULATE是告訴GL使用紋理阿爾法片段的最後阿爾法(這也是默認值)的方式。
  • 您的混合對於如何在混合階段使用生成的alpha也是正確的。

所以問題出現在其他地方......你的描述聽起來像你實際上並沒有禁用Z-test,而且你也不會讓你的精靈回到前面。 GL中的阿爾法混合只會做你想要的,如果你畫你的精靈回到前面。否則,精靈按照錯誤的順序混合,並且不會產生正確的輸出。

用一張你所觀察到的照片來證實這一點會容易一些。

+0

我試着着色器,沒有成功。 – Knetic491 2010-09-11 09:16:41

+0

我嘗試着色器,沒有成功。 - 我也非常肯定的是,由於Z緩衝區已被禁用,所以精靈將被反向渲染。如果不是這樣,絕對沒有任何形式的alpha可以正常工作(目前只有'per-sprite'opacity起作用)。我應該在這個筆記上重複一遍,那個alpha似乎是二元的。如果圖像的阿爾法完全遮蔽了圖像的任何部分。它本質上像一個二進制alpha通道功能,但我知道這是一個事實,圖像是在32位argb(這當然交換到rgba正確)。 – Knetic491 2010-09-11 09:22:20

+0

糾正我,如果我錯了,但GL_MODULATE會導致紋理的alpha和底層多邊形相乘(這當然是原始問題要求)。 – Rich 2011-05-12 14:52:56