【问题标题】:OpenglES blending particles but not backgroundOpenGLES混合粒子但不是背景
【发布时间】:2011-07-15 05:23:02
【问题描述】:

我有下一个流程:

 - 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) 与背景混合。

无效的解决方案:

  • 在纹理上绘制效果然后将其应用效果很好...但速度极慢。
  • 先画粒子效果再画背景,看起来还可以……但我不能画场景对象,因为它们需要在背景和效果之间

这是显示差异的屏幕。右边的期望结果,左边的粒子与背景混合。

图片:

我将不胜感激...

最新更新: 我能够得到我想要的颜色......但是......(似乎这种方式会让我无处可去) 我用 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 的结果很糟糕,所以我无法以任何方式替换它。 ..

EDIT_2 简单来说一般问题:我需要绘制一个红色(0xff0000)发光(加法混合)效果。在黑色背景上没问题,但如果我选择绿色(0x00ff00),结果颜色将接近 0xffff00

有什么想法吗?

【问题讨论】:

  • 渲染到单​​独的帧缓冲区可以工作吗?您是否在一个完全透明的帧缓冲区中添加所有粒子的混合,然后将该帧缓冲区的正常 Alpha 混合到您的主场景中。
  • 是的,它有效。但是很慢,我在 20fps 附近丢失了只切换帧缓冲区

标签: android opengl-es blending


【解决方案1】:

GL10.GL_SRC_ALPHA, GL10.GL_ONE 用于高亮重叠粒子

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

【讨论】:

  • 我试图降低粒子纹理的亮度,但它不起作用,纹理主要是红色(接近 0xee)和少量的绿色,蓝色。在与 bg 混合期间,红色仅增加一点,因为它几乎是最大的,但绿色和蓝色显着增加。因为那个颜色坏了。
  • 您能解释一下“在渲染中注入出血控制,以便降低渲染粒子的亮度”的意思吗
  • 我假设您使用的是 ES 1.0,在那里您可以通过将 glColor* 设置为所需值来进行简单的乘法运算,它与您设置的颜色与纹理颜色相乘,让您可以很好地控制渲染的颜色。所以设置 glColor4f(0.5,0.5,0.5,1.0);会将纹理亮度降低到一半。
  • 目前我正在使用 glColor 为粒子添加生命周期中的淡出和颜色变化。我试过玩它..但问题与更改纹理颜色相同 - 它正在降低亮度,但由于与 bg 混合,颜色仍然被破坏。
  • 在我自己的引擎中,我通过加法混合 + alpha belnding + 关闭深度写入 (i408.photobucket.com/albums/pp168/DrakkLord/…) 实现了这一点。您应该先尝试使用 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) 进行简单的 alpha 混合以获得所需的混合结果。
【解决方案2】:

您可以使用glAlphaFunc( GL_GREATER, 0 ) 来拒绝粒子中的 alpha=0 片段。不过记得先glEnable( GL_ALPHA_TEST )

【讨论】:

  • 好主意 Ryanm,它有助于去除黑色像素..但仍然存在问题。效果边缘有很多像素具有非常低的 alpha,但不为零。这些像素应与 GL10.GL_SRC_ALPHA、GL10.GL_ONE_MINUS_SRC_ALPHA 等背景混合。如果我有着色器,它会比......但这里只有 1.1 ......
【解决方案3】:

渲染到单​​独的帧缓冲区可以工作吗?您是否在完全透明的帧缓冲区中添加所有粒子的混合,然后对该帧进行正常的 Alpha 混合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2014-08-14
    相关资源
    最近更新 更多