2014-02-07 41 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

这不适合我,对不起。我尝试在颜色变化以及绘制之前设置混合功能,但没有成功。 –