2014-02-07 126 views
3

我正在研究基於Apple的GLPaint示例代碼的應用程序。我已將透明顏色更改爲透明黑色,並添加了不透明度滑塊,但是,當我將顏色混合在一起並使用低透明度設置時,它們不會按照我期望的方式混合。他們似乎混合了光線混合的方式,而不是油漆混合的方式。這裏是我的意思的例子:基於GLPaint的OpenGL ES混合問題

enter image description here

的「期望的結果」是通過使用glReadPixels分別呈現每個顏色(即使用蘋果的默認混合)與先前渲染的圖像進行合併而獲得。

但是,將每個幀與前一幀混合在一起,耗時過長,我怎麼才能使OpenGL正確混合顏色?我一直在網上搜索了很長時間,還沒有找到適合我的解決方案,請讓我知道如果您需要任何其他信息來幫助!

+0

請分享您使用的鏈接作爲示例代碼/任何此類鏈接..這將更好地瞭解您的問題。因爲在openGL中我們需要設置幾個Blending選項和混合函數。 –

+0

我的代碼基於蘋果的GLPaint代碼,可以在這裏找到:https://developer.apple.com/library/ios/samplecode/GLPaint/Introduction/Intro.html –

回答

3

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

幸運的是,您可以混用GLKit和OpenGL ES。

我的建議是:利用一切GLKit除了設置了GLKView您呈現 表面(這是乏味沒有GLKit)

  1. 停止。
  2. 使用帶有自定義着色器的OpenGl程序繪製到支持FBO的紋理。
  3. 使用第二個程序和自定義着色器進行後期處理(將上面的紋理繪製到四邊形然後渲染到屏幕上)。

一個好的起點是加載Xcode附帶的OpenGl模板。並開始修改它。被警告:如果你不明白着色器,這裏的代碼將毫無意義。它繪製2個立方體,一個使用GLKit,另一個沒有 - 使用自定義着色器。

引用開始學習:

最後,如果你對使用OpenGL ES把它的全部潛力,你真的應該花時間閱讀認認真真的(有點過時了。)通過OpenGL ES 2.0 programming guide。即使它已經6歲了,它仍然是相關的,我發現的唯一一本書可以正確解釋所有的概念。

+0

這是一個非常「完整」的答案,謝謝。我的設置確實使用了自定義着色器,但我的知識不夠,無法設置解決方案#2,但我會繼續研究,我相信我會最終弄清楚,你已經鏈接了一些優秀的資源,並且作爲我認爲你應得的賞金的最佳答案。謝謝。 –

+0

謝謝帕特里克。 –

0

您的「當前結果」是可加顏色,OpenGL應該如何工作。像混合油漆一樣工作將會減少顏色。您無法通過OpenGL ES 1.1控制這一點,但是您可以爲OpenGL ES 2.0編寫自定義片段着色器,該着色器可以實現減色。如果您要混合來自iOS的紋理圖像,則需要知道圖像數據是否已預先乘以alpha,以便進行混合。 OpenGL ES預計非預乘的格式。

+0

我使用的是OpenGL ES 2.0,你能指點我嗎在正確的方向尋找關於着色器編寫的技巧,我不熟悉GLSL。 –

+0

你真的需要一個很好的教程SDK,這是最好的:http://www.imgtec.com/powervr/insider/sdkdownloads/index.asp另外,結帳我的博客在http://montgomery1.com/opengl/ – ClayMontgomery

+0

我在某處看到自定義着色器不起作用,因爲您無法從着色器中訪問目標像素顏色,要求我依賴可用的有限混合函數? –

0

您需要在調用顏色變化的函數中編寫該代碼。 和每次你需要設置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 use this link

請註明是否有用,或者沒有做更多的事情。它適合我。

+0

這不適合我,對不起。我嘗試在顏色變化以及繪製之前設置混合功能,但沒有成功。 –