簡體   English   中英

基於GLPaint的OpenGL ES混合問題

[英]GLPaint based OpenGL ES Blending Issue

我正在開發基於Apple的GLPaint示例代碼的應用程序。 我已經將透明顏色更改為透明黑色,並添加了不透明度滑塊,但是當我將顏色混合在一起時,低透明度設置它們不會混合我期望的方式。 它們似乎混合了光混合的方式,而不是混合塗料的方式。 這是我的意思的一個例子:

在此輸入圖像描述

通過使用glReadPixels分別渲染每種顏色並將其與先前渲染的圖像合並(即使用蘋果的默認混合)來獲得“期望結果”。

但是,將每個幀與之前的幀混合在一起動作太費時間,如何讓OpenGL正確混合顏色? 我已經在網上研究了很長一段時間,還沒有找到適合我的解決方案,如果您需要任何其他信息,請告訴我們!

從它的外觀來看,使用您當前的設置,沒有簡單的解決方案。 對於您要執行的操作,您需要自定義着色器。 僅使用GLKit是不可能的。

幸運的是,你可以混合使用GLKit和OpenGL ES。

我的建議是:

  1. 除了使用GLKView設置渲染表面之外,不要再使用GLKit(這在沒有GLKit的情況下很乏味)。
  2. 使用帶有自定義着色器的OpenGl程序繪制到支持FBO的紋理。
  3. 使用具有自定義着色器的第二個程序進行后期處理(在將紋理上方繪制到四邊形之后,然后渲染到屏幕)。

一個很好的起點是加載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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM