【问题标题】:OpenGL blending with source and destination alphaOpenGL 与源和目标 alpha 混合
【发布时间】:2011-05-16 19:49:04
【问题描述】:

我正在尝试将带有 alpha 的纹理渲染到带有 alpha 的帧缓冲区。我需要纹理的透明度由它自己的 alpha 和已经渲染到帧缓冲区的 alpha 的组合来控制。

即:

正常透明度:

(src_colour * src_alpha) + (dst_colour * 1-src_alpha)

要求的透明度:

(src_colour * src_alpha * dst_alphe) + (dst_colour * 1-(src_alpha * dst_alpha))

谁能弄清楚如何做到这一点?

我已经工作了 9 个小时了 :-)

我在 Android 上使用 OpenGL 1.0 和 GL11ExtensionPack,所以我可以访问 glBlendFunc 和 glBlendFuncSeparate。我不希望使用着色器走 GLES20 路线,因为这需要重写大量代码。

谢谢, 安德鲁

【问题讨论】:

  • 标准 GL 混合不支持此功能。着色器也不(单次通过)。你想达到什么目的?可能还有其他方法。
  • 该游戏是一个垂直滚动的射击游戏,从上到下的视角观看。前景中渲染了风景、宇宙飞船、导弹等,背景是天空和星空。然后是一些细节,例如在风景中添加的建筑物,这会产生阴影。 (阴影被烘焙到纹理中。)我需要阴影只影响前景中的内容,而不是背景。我使用模板缓冲区实现了这一点,但是一些游戏的精灵具有 alpha 透明度,因此模板缓冲区的二进制开/关解决方案是不够的。阴影需要混合。

标签: android opengl-es alpha blend


【解决方案1】:

这是我使用的解决方案:

  1. 启用颜色和 alpha 写入
  2. glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA)
  3. 渲染前景对象
  4. 禁用 alpha 写入
  5. 渲染阴影
  6. 渲染投射阴影的对象
  7. glBlendFunc(GL10.GL_ONE_MINUS_DST_ALPHA, GL10.GL_DST_ALPHA)
  8. 渲染背景对象

这会产生仅出现在前景对象上的阴影效果。实际上,alpha 缓冲区变成了具有可变不透明度的模板缓冲区。

幸运的是,我的背景对象没有透明度,就好像它们没有透明度一样,我认为不使用着色器就无法实现这种效果。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 2011-12-14
    • 1970-01-01
    • 2013-11-16
    • 2015-07-25
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多