1

我想用 OpenGL 产生这种效果:http: //www.escapemotions.com/experiments/flame/#top

有一种添加剂混合似乎可以增加亮度值:添加红色会产生白色。

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

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

火焰画家是用 Processing 制作的(我不太了解,因为我使用的是 openframeworks),如何在 Processing 中计算效果?

4

2 回答 2

2

Peter,这里的 Flame Painter 程序员。

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)

于 2014-04-07T15:43:47.427 回答
1

混合模式作为处理 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 混合模式发挥其魔力要慢。

于 2013-03-13T05:55:56.723 回答