我正在开发一款基于Apple的GLPaint示例代码的应用程序。我已经将透明颜色更改为透明黑色,并添加了不透明度滑块,但是当我将颜色混合在一起时,低透明度设置它们不会混合我期望的方式。它们似乎混合了光混合的方式,而不是混合涂料的方式。这是我的意思的一个例子:
通过使用glReadPixels分别渲染每种颜色并将其与之前渲染的图像合并(即使用苹果的默认混合)获得“所需结果”。
但是,将每个帧与之前的帧混合在一起动作太费时间,如何让OpenGL正确混合颜色?我已经在网上研究了很长一段时间,还没有找到适合我的解决方案,如果您需要任何其他信息可以帮助我,请告诉我们。
答案 0 :(得分:3)
从它的外观来看,使用您当前的设置,没有简单的解决方案。对于您要执行的操作,您需要自定义着色器。仅使用GLKit是不可能的。
幸运的是,你可以混合使用GLKit和OpenGL ES。
我的建议是:
一个好的起点是加载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
做更多事情请说明是否有效。它适合我。