我想在OpenGL上有这样的效果: http://www.escapemotions.com/experiments/flame/#top
添加剂混合似乎增加了亮度值:添加红色会产生白色。
(255,0,0) + (200,0,0) -> (255,100,100)
我可以使用GLSL实现这一点(将两种颜色转换为HSV空间,添加值,然后再转换回来),但我想知道是否有更好的方法。
火焰画家是用Processing制作的(我使用openframeworks后我不太清楚),如何在Processing中计算效果?
答案 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混合模式发挥其魔力要慢。