OpenGL HSV添加剂混合

时间:2013-02-25 11:06:38

标签: opengl glsl processing

我想在OpenGL上有这样的效果: http://www.escapemotions.com/experiments/flame/#top

添加剂混合似乎增加了亮度值:添加红色会产生白色。

(255,0,0) + (200,0,0) -> (255,100,100)

我可以使用GLSL实现这一点(将两种颜色转换为HSV空间,添加值,然后再转换回来),但我想知道是否有更好的方法。

火焰画家是用Processing制作的(我使用openframeworks后我不太清楚),如何在Processing中计算效果?

2 个答案:

答案 0 :(得分:2)

彼得,火焰画家程序员。

Flame Painter中的变亮模式类似于Photoshop ADD混合模式, 我在所有RGB通道中添加了少量颜色。

示例(伪代码):

color: C = (50, 20, 10) // RGB channels = 50, 20, 10
lighter color: C = C + C // RGB channels = 100, 40, 20
lighter color: C = C + C // RGB channels = 150, 60, 30
...

添加颜色直到颜色C变白。 (255,255,255)

如果颜色为纯红色,蓝色,绿色,紫色,黄色或品红色,则此方法不起作用。 红色示例:

color: C = (50, 0, 0) // RGB channels = 50, 0, 0
lighter color: C = C + C // RGB channels = 100, 0, 0
lighter color: C = C + C // RGB channels = 150, 0, 0
...

最亮的颜色是红色。 (255,0,0)

这就是为什么我在默认颜色为0的通道中添加少量(1种颜料)的原因。 例如:

color: C = (50, 1, 1) // RGB channels = 50, 1, 1
lighter color: C = C + C // RGB channels = 100, 2, 2
lighter color: C = C + C // RGB channels = 150, 3, 3
...

并且最亮的颜色将再次变白。 (255,255,255)

答案 1 :(得分:1)

混合模式作为Processing API的一部分实现: http://processing.org/reference/blendMode_.html

在内部,如果渲染器是GL渲染器(glBlendFunc(GL_SRC_ALPHA, GL_ONE)),则使用GL,否则它使用GL使用的相同数学:

private static int blend_add_pin(int a, int b) {
    int f = (b & ALPHA_MASK) >>> 24;

    return (low(((a & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
        low(((a & RED_MASK) + ((b & RED_MASK) >> 8) * f), RED_MASK) & RED_MASK |
        low(((a & GREEN_MASK) + ((b & GREEN_MASK) >> 8) * f), GREEN_MASK) & GREEN_MASK |
        low((a & BLUE_MASK) + (((b & BLUE_MASK) * f) >> 8), BLUE_MASK));
}

(来自PImage.java

至于“如果有更好的方法”,使用GL的好处是它发生在GPU而不是CPU上。因此,如上所示,自己进行数学测试将比让显卡支持的GL混合模式发挥其魔力要慢。