【问题标题】:glBlendFunc transparency in OpenGL with GLKit使用 GLKit 在 OpenGL 中的 glBlendFunc 透明度
【发布时间】:2013-05-28 09:42:37
【问题描述】:

我将 GLKit 用于 iPad 应用程序。使用此代码,我设置了混合:

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

它工作正常,但是当我尝试获取屏幕截图时,混合模式似乎错误。我使用 GLKit 的快照还是 glReadPixels 都没关系。

这是我在使用该应用程序时得到的:

这是截图:

在制作屏幕截图之前我是否必须更改混合模式或其他东西?如果是,那又是什么?

【问题讨论】:

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


    【解决方案1】:

    您遇到的问题很可能在于图像是如何从 RGBA 数据生成的。要解决这个问题,您需要在使用 kCGImageAlphaNoneSkipLast 创建 CGImage 时跳过 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)

    现在(.7, .7, .7, .76) 的结果可以很好地显示,因为您的缓冲区仅显示导致看到(.7, .7, .7, 1.0) 的 RGB 部分,但是当您使用所有 4 个组件创建图像时,您还使用了 .76 alpha 值,该值进一步用于融合图像本身。因此,您需要在某些时候跳过 alpha 部分。

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

    【讨论】:

    • 就是这样。非常感谢。
    • 你用的是什么程序?
    • kCGImageAlphaNoneSkipLast 创建 cgimage 时。
    猜你喜欢
    • 2012-10-28
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2017-01-11
    相关资源
    最近更新 更多