【问题标题】:Opengl ES color blend modeOpengl ES 颜色混合模式
【发布时间】:2014-04-09 20:10:35
【问题描述】:

我在背景纹理上渲染了一个粒子系统。每个粒子都是一个正方形,没有应用纹理,它们都是相同的颜色。背景是灰度纹理。 我想要实现的是与颜色混合模式相同类型的混合,在 Gimp 等应用程序中众所周知。

基本上,粒子覆盖的背景区域应保持其亮度,但采用粒子的颜色。 我已经尝试了 glBlendFunc() 参数的几种组合并尝试弄乱 glTexEnv,但我在理解它时遇到了很多麻烦。 目前,如果两个粒子重叠,它们要么变亮要么变暗(取决于 glBlendFunc 参数)。

我在安卓上使用 OpenGL ES 1.1。有什么方法可以在不使用 OpenGL ES 2.0 的情况下实现这种效果?如果有,是什么?

【问题讨论】:

    标签: android opengl-es color-blending


    【解决方案1】:

    glBlendFunc 仅支持可分离的混合模式。仅色调混合是不可分离的,因此无法在标准 OpenGL 中表示。请参阅 Nvidia 的 Mark Kilgard 的 this presentation,幻灯片 41。

    Nvidia 在其较新的 GPU(包括 Tegra)上提供了一个扩展,称为 NV_blend_equation_advanced,它添加了 GL_HSL_HUE_NVGL_HSL_COLOR_NV 令牌来执行您描述的操作。鉴于您希望保持对 OpenGL ES 1.1 的支持,这实际上不适合您。

    但是,鉴于您的背景是灰度的,可能有一种方法可以实现您所描述的效果:

    1. 将您的粒子颜色从 RGB 转换为 HSL 颜色空间
    2. 在 HSL 中最大化亮度(即设置为 1.0 0.5)
    3. 转换回 RGB。这将是您的实际粒子颜色
    4. 使用多重混合操作绘制您的粒子:glBlendFunc(GL_DST_COLOR, GL_ZERO)

    这应该在使用粒子颜色绘制背景时保持亮度。

    编辑:glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR) 将给出 2 * 源 * 目标颜色,这可能会有所帮助。

    编辑2:尝试glTexEnvf如下

    1. 使用glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) 渲染背景
    2. 使用glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)渲染粒子

    距离我上次使用 glTexEnv 已经十多年了,但可能有一些参数组合可以实现你想要做的事情。

    【讨论】:

    • 在第二步中,如果我在 HSL 中最大化亮度,我不会得到纯白色吗?转换回 RGB 我得到 (255,255,255)。所以我尝试使用HSV色彩空间并最大化该值,但是当粒子重叠时背景变得更暗。
    • 你是对的,在 HSL 中,亮度应该是 0.5,而不是 1.0(纯白色)。值为 1.0 的 HSV 应该给出相同的结果。这个想法是,与纯色相乘应该不会导致亮度变化。这仅适用于纯色(您可以使用例如 RGB = (255,0,0) 轻松验证。)
    • 我得到了想要的效果,但只有颜色 (255,0,0)、(0,255,0) 和 (0,0,255)。如果我在 HSL 中使用 (204,0,255),即 (288º, 100%, 50%),重叠会变得更暗。
    • 玩了一会儿之后,似乎只有通道设置为 255 或 0 的颜色(即 255,0,0; ​​255,255 ,0; 255,0,255 等)我可以尝试更多的想法吗?
    • 啊,我刚刚意识到 glTexEnv 在 OpenGL ES 1.1 中可用。我认为它仅在桌面 OpenGL 中可用。请参阅我对上述帖子的编辑,了解另一种可能的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多