我正在将GLKit用于iPad应用。使用此代码我设置混合:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
它运行正常,但是当我尝试获取屏幕截图时,混合模式似乎是错误的。如果我使用GLKit的快照或glReadPixels则无关紧要。
这是我在使用应用时获得的:
这是截图:
在制作屏幕截图之前,我是否需要更改混合模式?如果是这样,到底是什么?
答案 0 :(得分:4)
您遇到的问题很可能在于如何从RGBA数据生成图像。要解决此问题,您需要在使用CGImage
创建kCGImageAlphaNoneSkipLast
时跳过Alpha通道,或者首先在缓冲区中使用正确的Alpha值。
解释发生了什么。您的GL缓冲区由RGBA值组成,但只有RGB部分用于显示它,但是当您创建图像时,您也使用Alpha通道,因此存在差异。它是如何实现的非常简单,让我们在屏幕中间的某个位置拍摄一个像素并完成其事件:
(.4, .4, .4, .25)
。您的混合函数表示将源颜色与源alpha相乘,目标与1 - 源alpha相乘。这导致(.4, .4, .4, .25)*.25 + (.8, .8, .8, 1.0)*.75 = (.7, .7, .7, .76)
现在结果(.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)
)