2012-03-10 45 views
1

標題必須似乎有些神祕,但我真的無法解釋有什麼我想做的事情,所以我畫了一幅畫想象我的問題:我可以使用OpenGL-ES glBlendFunc來影響混合來考慮目標嗎?

enter image description here

的黑色部分是透明的(又名阿爾法= 0 )。我在framebuffer中有藍色對象(左邊),並且想要將白色位圖(中間)渲染到它上面,以便它看起來像合併的位圖(右側)。

問題是,如果我使用標準glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);白色物體的整個部分正在顯示。我不希望它完全覆蓋framebuffer中的東西(藍色),但只能在alpha值> 0(可見)的部分顯示。然後它也應該考慮自己的alpha值(注意白色物體的孔)。

是這樣的可能與glBlendFunc或我必須爲此編寫着色器?

PS:我看了glBlendFunc的文檔,在http://www.khronos.org/opengles/documentation/opengles1_0/html/glBlendFunc.html,但我真的沒有得到它的任何地方。

PPS:我在C++上使用Android上的OpenGL-ES 2.0,但我認爲語言/平臺並不重要。

回答

1

我不認爲這是可能的純粹與混合功能。您希望源像素與源和目標alpha都相乘,而blendfunc只允許一個或另一個。

然而,你想要的結果可能有一些使用模板緩衝區。我不是這方面的專家,但我認爲你可以在繪製背景圖像時將模板設置爲增量,然後在繪製位圖時將模板測試設置爲拒絕模板== 0的位置(混合仍然啓用以獲取位圖的透明區域正確)。您必須查看glStencilOpglStencilFunc的API以找出使用的確切正確參數。

glBlendFunc和glAlphaFunc的組合也可以,但它取決於它們被評估的順序,所以我不積極。

+0

嗨,謝謝你的回覆,我認爲你是對的。我試過用glBlendFunc和glAlphaFunc,但經過思考,我不認爲它可能是這樣的。我不能使用Stencil來做我想做的事情,因爲這會過度殺傷,但我只是寫了一個新的着色器,並創建了第二個幀緩衝區,現在它就可以工作。謝謝你的建議。 – HardCoder 2012-03-11 16:46:47

相關問題