1

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

IE:

正常透明度:

(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 路线,因为这需要重写大量代码。

谢谢,安德鲁

4

1 回答 1

2

这是我使用的解决方案:

  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 缓冲区变成了具有可变不透明度的模板缓冲区。

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

于 2010-11-30T08:26:06.830 回答