基于GLPaint的OpenGL ES混合问题

时间:2014-02-07 04:58:53

标签: ios opengl-es blending alphablending

我正在开发一款基于Apple的GLPaint示例代码的应用程序。我已经将透明颜色更改为透明黑色,并添加了不透明度滑块,但是当我将颜色混合在一起时,低透明度设置它们不会混合我期望的方式。它们似乎混合了光混合的方式,而不是混合涂料的方式。这是我的意思的一个例子:

enter image description here

通过使用glReadPixels分别渲染每种颜色并将其与之前渲染的图像合并(即使用苹果的默认混合)获得“所需结果”。

但是,将每个帧与之前的帧混合在一起动作太费时间,如何让OpenGL正确混合颜色?我已经在网上研究了很长一段时间,还没有找到适合我的解决方案,如果您需要任何其他信息可以帮助我,请告诉我们。

3 个答案:

答案 0 :(得分:3)

从它的外观来看,使用您当前的设置,没有简单的解决方案。对于您要执行的操作,您需要自定义着色器。仅使用GLKit是不可能的。

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

我的建议是:

  1. 除了设置渲染外,停止使用GLKit 使用GLKView表面(没有GLKit,这很乏味)。
  2. 使用带有自定义着色器的OpenGl程序绘制到支持FBO的纹理。
  3. 使用带有自定义着色器的第二个程序进行后期处理(在将纹理绘制到四边形之后,然后渲染到屏幕上)。
  4. 一个好的起点是加载Xcode附带的OpenGl模板。并开始修改它。请注意:如果你不了解着色器,那么这里的代码就没有意义了。它绘制了2个立方体,一个使用GLKit,一个没有 - 使用自定义着色器。

    开始学习的参考资料:

    最后,如果你非常认真地使用OpenGL ES来充分发挥其潜力,那么你真的应该花时间阅读OpenGL ES 2.0 programming guide。即使它已经有6年了,它仍然具有相关性,而且我发现的唯一一本正确解释所有概念的书。

答案 1 :(得分:0)

您的“当前结果”是加色,这是OpenGL的工作方式。像混合涂料一样工作会变色。您无法使用OpenGL ES 1.1控制它,但您可以为OpenGL ES 2.0编写一个自定义片段着色器,它将使颜色变浅。如果要混合来自iOS的纹理图像,则需要知道图像数据是否已经被alpha预乘,以便进行混合。 OpenGL ES需要非预乘格式。

答案 2 :(得分: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

做更多事情

请说明是否有效。它适合我。