OpenglES混合粒子但不混合背景

7

我有以下的流程:

 - 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)将所有内容与背景混合在一起。
不起作用的解决方案:
- 将效果绘制到纹理上,然后应用它可以正常工作...但是非常慢。 - 首先绘制粒子效果,然后再绘制背景,看起来不错...但是我不能绘制场景对象,因为它们需要在背景和效果之间。
这是屏幕截图,显示了差别。右侧是所需结果,左侧是粒子与背景混合。
图片:
我会感激任何帮助...
最新更新: 我能得到我想要的颜色...但是...(似乎这种方式无法帮助我) 我已经渲染了透明度为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。
有什么想法吗?

渲染到单独的帧缓冲区会起作用吗?在完全透明的帧缓冲区中添加混合所有粒子,然后在主场景上对该帧缓冲区进行正常的Alpha混合。 - TurqMage
是的,它可以工作。但非常慢,只是切换帧缓冲区就会损失近20fps。 - Yuriy
3个回答

3

GL10.GL_SRC_ALPHA和GL10.GL_ONE组合可用于突出重叠粒子

除了加法混合,没有其他方法可以避免排序粒子的需求。如果您仍想坚持这种方式以避免粒子重叠,则建议您将混合控制注入渲染中,以便您可以减少渲染粒子的亮度或减少粒子纹理的亮度。


我试图降低粒子纹理的亮度,但是没有效果。纹理大部分是红色(接近0xee),绿色和蓝色很少。当与背景混合时,红色只增加了一点,因为已经接近最大值,但是绿色和蓝色都显著增加了。因此,颜色变得不协调。 - Yuriy
你能解释一下“在渲染中注入混合控制,以便可以降低渲染粒子的亮度”是什么意思吗? - Yuriy
我假设您正在使用ES 1.0,在那里您可以通过将glColor*设置为所需值来进行简单的乘法运算,它将与纹理颜色一起乘以,从而对渲染颜色进行精细控制。 因此,设置glColor4f(0.5,0.5,0.5,1.0);将使纹理亮度减半。 - Drakk Lord
目前我正在使用glColor来为粒子添加淡出和寿命期间的颜色变化。我已经尝试过调整它,但问题与更改纹理颜色相同——它会降低亮度,但由于与背景混合而导致颜色仍然失真。 - Yuriy
在我的引擎中,我使用了加法混合+透明度混合+关闭深度写入的方式来实现这个效果(http://i408.photobucket.com/albums/pp168/DrakkLord/TeaRsYsEngine_particles.png)。你应该先尝试使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)来制作简单的透明度混合,以获得所需的混合效果。 - Drakk Lord
显示剩余3条评论

1

不错的想法Ryanm,它有助于去除黑色像素...但仍然存在问题。在效果边缘有许多alpha非常低(但不为零)的像素。这些像素应该像GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA一样与背景混合。如果我有着色器,那么这就很简单了...但现在只有1.1... - Yuriy

0

将渲染到单独的帧缓冲区是否可行?在完全透明的帧缓冲区中进行所有粒子的加法混合,然后对该帧进行正常的Alpha混合,这样做可以吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接