Android 打开混合粒子但不混合背景

Android 打开混合粒子但不混合背景,android,opengl-es,blending,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 问题-当我绘制粒子时,它们

我有下一个过程:

 - 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)将所有粒子与背景混合

无效解决方案:

  • 将效果绘制到纹理,然后应用它,效果很好…但速度非常慢
  • 先画粒子效果,然后再画背景,看起来还可以…但我不能画场景对象,因为它们需要介于背景和效果之间
下面是显示差异的屏幕。在右侧,所需的结果,在左侧,粒子与背景混合

img:

我将感谢任何帮助

最新更新: 我能得到我想要的颜色…但是。。。(看来这条路对我毫无帮助) 我已使用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-所有写入粒子的alpha都设置为最大值,以模拟添加剂混合

正如你们所看到的,它工作得很好…除了黑色填充区域,粒子图像的alpha值为0。,还有什么不好的,在结果图像中,黑色的alpha值为1,所以我不能以任何方式替换它

编辑_2 简单来说,一般问题是:我需要画一个红色(0xff0000)发光(添加剂混合)效果。在黑色背景上是可以的,但如果我选择绿色(0x00ff00),结果颜色将接近0xffff00

有什么想法吗

GL10.GL_SRC_ALPHA,GL10.GL_ONE以高亮显示重叠粒子


除了添加剂混合之外,没有其他方法可以避免对颗粒进行分类。如果您仍然希望坚持使用此选项以避免粒子重叠,我建议您在渲染中插入“bleding”控件,以便可以降低渲染粒子的亮度或降低粒子纹理的亮度。

您可以使用此选项拒绝粒子中的alpha=0碎片。但是,请记住首先。渲染到单独的帧缓冲区是否可行?你是否在一个完全透明的帧缓冲区中添加所有粒子的混合,然后对该帧进行正常的alpha混合

我已尝试降低粒子纹理的亮度,但它不起作用,纹理主要是红色(接近0xee)和少量的吉恩、蓝色。在与bg混合的过程中,红色只增加了一点,因为它几乎达到最大值,但绿色和蓝色显著增加。因为该颜色被破坏。您能解释一下“在渲染中注入一个出血控件以便减少渲染粒子的亮度”是什么意思吗?我假设您使用的是ES 1.0,您可以通过将glColor*设置为所需的值来进行简单的多重渲染,它与您使用纹理颜色设置的颜色混合,使您可以对渲染颜色进行精细控制。因此设置glColor4f(0.5,0.5,0.5,1.0);将纹理亮度降低一半。目前我正在使用glColor为粒子添加淡出和生命周期中的颜色变化。我尝试过使用它。但问题与更改纹理颜色相同-它会降低亮度,但由于与bg混合,颜色仍然会中断。在我自己的引擎中,我通过添加混合+alpha belnding+关闭深度写入()实现了这一点。你应该先尝试用glBlendFunc(GL_SRC_alpha,GL_ONE_减去_SRC_alpha)进行简单的alpha混合,以获得所需的混合结果。好主意,Ryanm,这有助于去除黑色像素。但仍然存在一个问题。在效果的边缘有很多像素,它们的alpha值很低,但不是零。这些像素应该与背景混合,比如GL10.GL_SRC_ALPHA、GL10.GL_ONE_减去SRC_ALPHA。如果我有着色器,它会比..简单,但这里只有1.1…渲染到单独的帧缓冲区会工作吗?在一个完全透明的帧缓冲区中添加所有粒子的混合,然后在主场景中进行该帧缓冲区的正常alpha混合。是的,它可以工作。但速度非常慢,我只切换帧缓冲区,速度接近20fps