OpenglES混合粒子而不是背景

时间:2011-03-14 18:08:10

标签: android opengl-es blending

我有下一个过程:

 - draw background
 - draw objects and blend with background (1)GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA
 - draw particle effect with blending (2)GL10.GL_SRC_ALPHA, GL10.GL_ONE in order to highlight overlapping particles

问题 - 当我绘制粒子时,它们还与背景混合并变得非常明亮。

我需要的是将粒子与(2)混合在一起,然后使用(1)与背景混合。

不工作的解决方案:

  • 将效果绘制到纹理而不是应用它效果很好......但速度极慢。
  • 首先绘制粒子效果而不是背景,它看起来不错......但我不能绘制场景对象,因为它们需要介于bg和效果之间

这是显示差异的屏幕。在正确的期望结果上,左侧粒子与背景混合。

img:

enter image description here

我将不胜感激任何帮助...

最新更新 我能够得到我想要的颜色......但......(看起来这样会让我无处可去) 我使用alpha = 0渲染背景,然后使用GL11Ext中的混合函数: glBlendFuncSeparate(GL10.GL_SRC_ALPHA,GL10.GL_DST_ALPHA,GL10.GL_ONE,GL10.GL_ONE);

GL10.GL_SRC_ALPHA,GL10.GL_DST_ALPHA - 仅当颜色具有alpha(bg现在没有)时才混合颜色

GL10.GL_ONE,GL10.GL_ONE - 为所有书写粒子设置最大值以模拟添加剂混合

enter image description here

它可以正常工作......除了黑色填充区域,其中粒子图像具有alpha 0 ..而且结果图像中黑色有alpha 1,所以我无法以任何方式替换它。 ..

EDIT_2 简单的一般问题:我需要绘制一个红色(0xff0000)发光(添加混合)效果。在黑色背景上它是好的,但如果我采取绿色(0x00ff00)比结果颜色将接近0xffff00

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

  

GL10.GL_SRC_ALPHA,GL10.GL_ONE以突出重叠粒子

除了添加剂混合之外没有其他方法可以避免需要对粒子进行分类。如果你仍然想坚持这一点以避免粒子重叠,我建议你在渲染中注入一个渗透控件,这样你就可以减少渲染粒子的亮度,或者你可以降低粒子纹理的亮度。

答案 1 :(得分:1)

您可以使用glAlphaFunc( GL_GREATER, 0 )拒绝粒子中的alpha = 0片段。首先请记住glEnable( GL_ALPHA_TEST )

答案 2 :(得分:0)

渲染到单​​独的帧缓冲区是否有效?您是否在完全透明的帧缓冲区中添加了所有粒子的混合,然后执行该帧的正常alpha混合