使用GLKit在OpenGL中使用glBlendFunc透明度

时间:2013-05-28 09:42:37

标签: ios objective-c opengl-es opengl-es-2.0 glkit

我正在将GLKit用于iPad应用。使用此代码我设置混合:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

它运行正常,但是当我尝试获取屏幕截图时,混合模式似乎是错误的。如果我使用GLKit的快照或glReadPixels则无关紧要。

这是我在使用应用时获得的: enter image description here

这是截图: enter image description here

在制作屏幕截图之前,我是否需要更改混合模式?如果是这样,到底是什么?

1 个答案:

答案 0 :(得分:4)

您遇到的问题很可能在于如何从RGBA数据生成图像。要解决此问题,您需要在使用CGImage创建kCGImageAlphaNoneSkipLast时跳过Alpha通道,或者首先在缓冲区中使用正确的Alpha值。

解释发生了什么。您的GL缓冲区由RGBA值组成,但只有RGB部分用于显示它,但是当您创建图像时,您也使用Alpha通道,因此存在差异。它是如何实现的非常简单,让我们在屏幕中间的某个位置拍摄一个像素并完成其事件:

  1. 您将像素清除为您想要的任何颜色
  2. 使用从纹理接收的纯色覆盖像素(所有4个通道RGBA),例如(.8,.8,.8,1.0)
  3. 您使用较小的Alpha值在该像素上绘制颜色,并尝试将其混合,例如(.4, .4, .4, .25)。您的混合函数表示将源颜色与源alpha相乘,目标与1 - 源alpha相乘。这导致(.4, .4, .4, .25)*.25 + (.8, .8, .8, 1.0)*.75 = (.7, .7, .7, .76)
  4. 现在结果(.7, .7, .7, .76)很好地显示,因为你的缓冲区只显示RGB部分,导致看到(.7, .7, .7, 1.0)但是当你使用所有4个组件来创建图像时,你也使用.76 alpha值。进一步用于混合图像本身。因此,你需要在某些时候跳过alpha部分。

    还有另一种方法:正如你所看到的那样,你根本不需要将alpha值存储到渲染缓冲区,因为你从不使用它,在你的混合函数中你只使用源alpha。因此,您可以使用glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE)禁用它,这也意味着您需要将Alpha值清除为1.0(glClearColor(x,x,x,1.0)