2014-03-06 132 views
0

我有一个粒子系统在背景纹理上渲染。每个粒子都是正方形,没有纹理应用于它,它们都是相同的颜色。背景是灰度纹理。 我想要实现的是在应用程序(如Gimp)中已知的混合类型,即颜色混合模式。Opengl ES混色模式

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

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

回答

0

glBlendFunc只支持可分离的混合模式。仅色调混合是不可分离的,所以它不能用标准OpenGL表示。见Nvidia的马克·基尔加德this presentation,滑动41

Nvidia公司提供了其新的GPU扩展(包括Tegra的),叫NV_blend_equation_advanced它增加了GL_HSL_HUE_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渲染粒子,但也有可能成为可以实现你想要做的事情的参数组合。

+0

在第二步,如果我在HSL中最大化亮度,不要得到纯白色?转换回RGB我得到(255,255,255)。所以我尝试使用HSV色彩空间并使值最大化,但粒子重叠时背景变暗。 – Davide

+0

你是对的,在HSL中应该是0.5的明亮度,而不是1.0(这是纯白色的)。值为1.0的HSV应该给出相同的结果。这个想法是,用纯色进行乘法应该不会导致亮度的变化。这只适用于纯色(你可以很容易地验证,例如RGB =(255,0,0)。) –

+0

我得到所需的效果,但只有颜色(255,0,0),(0,255,0)和(0,0,255)。如果我在HSL中使用(204,0,255)(288º,100%,50%)之类的东西,重叠会变得更暗。 – Davide