[英]GLPaint based OpenGL ES Blending Issue
我正在開發基於Apple的GLPaint示例代碼的應用程序。 我已經將透明顏色更改為透明黑色,並添加了不透明度滑塊,但是當我將顏色混合在一起時,低透明度設置它們不會混合我期望的方式。 它們似乎混合了光混合的方式,而不是混合塗料的方式。 這是我的意思的一個例子:
通過使用glReadPixels分別渲染每種顏色並將其與先前渲染的圖像合並(即使用蘋果的默認混合)來獲得“期望結果”。
但是,將每個幀與之前的幀混合在一起動作太費時間,如何讓OpenGL正確混合顏色? 我已經在網上研究了很長一段時間,還沒有找到適合我的解決方案,如果您需要任何其他信息,請告訴我們!
從它的外觀來看,使用您當前的設置,沒有簡單的解決方案。 對於您要執行的操作,您需要自定義着色器。 僅使用GLKit是不可能的。
幸運的是,你可以混合使用GLKit和OpenGL ES。
我的建議是:
一個很好的起點是加載Xcode附帶的OpenGl模板。 並開始修改它。 請注意:如果你不理解着色器,那么這里的代碼就沒有意義了。 它繪制了2個立方體,一個使用GLKit,一個沒有 - 使用自定義着色器。
參考開始學習:
最后,如果您真的非常認真地使用OpenGL ES來充分發揮它的潛力,那么您真的應該花時間閱讀OpenGL ES 2.0編程指南 。 即使它已經有6年了,它仍然是相關的,我發現的唯一一本正確解釋所有概念的書。
您的“當前結果”是加色,這是OpenGL的工作方式。 像混合塗料一樣工作會變色。 您無法使用OpenGL ES 1.1控制它,但您可以為OpenGL ES 2.0編寫一個自定義片段着色器,它將使顏色變淺。 如果要混合來自iOS的紋理圖像,則需要知道圖像數據是否已經被alpha預乘,以便進行混合。 OpenGL ES需要非預乘格式。
您需要在顏色更改調用的函數中編寫該代碼。 每次你需要設置BlendFunc。
CGFloat red , green, blue;
// set red, green ,blue with desire color combination
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(red* kBrushOpacity,
green * kBrushOpacity,
blue* kBrushOpacity,
kBrushOpacity);
要使用BlendFunc執行更多操作,請使用此鏈接
請說明它是否有效。 它對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.