【问题标题】:glBlendColor not working on iOSglBlendColor 在 iOS 上不起作用
【发布时间】:2016-03-25 21:58:53
【问题描述】:

我在使用 glBlendColor 和 glBlendFunc 在 GLKView 中合成两个图像时遇到问题 - 它似乎实际上并没有设置颜色,因为我设置的任何颜色对结果输出都没有影响。我正在尝试使用 glBlendColor 在帧缓冲区中已经存在的图像之上以各种不透明度合成图像,该图像的不透明度为 1。

谁能告诉我哪里出错了?我在 Xcode 7.3 中为 iOS 9.3 写作。这是我的代码:它将 image1 替换为 image2,没有透明度,但它应该将 image2 放在 image1 的顶部,透明度为 0.5。

let glContext = EAGLContext(API: .OpenGLES3)
let glView = GLKView(frame: view.frame, context: glContext)
let ciContext = CIContext(EAGLContext: glContext)

view.addSubview(glView)


let uiImage1 = UIImage(named: "1.jpg")!
let image1 = CIImage(image: uiImage1)!

let uiImage2 = UIImage(named: "2.jpg")!
let image2 = CIImage(image: uiImage2)!


glView.bindDrawable()

ciContext.drawImage(image1, inRect: image1.extent, fromRect: image1.extent)

glEnable(GLenum(GL_BLEND))
glBlendFunc(GLenum(GL_CONSTANT_ALPHA), GLenum(GL_ONE_MINUS_CONSTANT_ALPHA))
glBlendColor(0, 0, 0, 0.5)

ciContext.drawImage(image2, inRect: image2.extent, fromRect: image2.extent)

glView.display()

【问题讨论】:

  • 我没有答案,但是,如果它可以帮助其他人看到这个:我尝试在 drawImages 之后添加一些 glGets 并确认启用和混合仍然是设置的;我还尝试将混合功能切换为GL_ONEGL_ONE 并确认添加绘图。所以我不认为CIContext在修改任何东西,所有的片段肯定都到了输出阶段。
  • @Tommy,感谢您的评论。是的,我已经成功地使用 CoreImage 来做不透明度,然后 glBlendFunc 只是将已经透明的第二个图像放在第一个上,但是如果我尝试跳过 CoreImage 并使用 glBlendColor 来制作不透明度,我得到没有不透明度调整。这让我觉得 CoreImage 上下文由于某种原因不能很好地与glBlendColor 配合使用。

标签: ios swift opengl-es


【解决方案1】:

如果它有助于找到答案,iOS 支持EXT_shader_framebuffer_fetch,它“提供了一种机制,片段着色器可以读取现有的帧缓冲区数据作为输入 [which] 可用于实现本来不方便的合成操作或不可能使用固定功能混合”; Apple explicitly advertises it 提供了“获取帧缓冲区数据以进行可编程混合”的机会。

我不清楚观察到的行为会如何产生 - 加法混合模式得到尊重,但对混合颜色的乘法则不然 - 但这可能有助于解释为什么预期可能会受挫。

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 2012-05-29
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2015-02-02
    • 2015-05-20
    相关资源
    最近更新 更多