2013-02-25 77 views
1

我想有這種效果用OpenGL: http://www.escapemotions.com/experiments/flame/#topOpenGL的HSV添加劑調合

有一種添加劑混合,這似乎增加亮度值:除了紅色給人白色。

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

我可以實現這個使用GLSL(轉換兩種顏色爲HSV空間,增加值,以及ceverting回),但我不知道是否有更好的方法。

火焰畫家是用加工(我不知道,因爲我使用openframeworks),如何在處理中計算效果?

回答

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)

這就是爲什麼我添加少量(1種顏料)到通道,其中默認顏色爲0。 示例:

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

混合模式被實現爲處理API的一部分: http://processing.org/reference/blendMode_.html

在內部,這使用GL如果渲染器是一個GL渲染器(glBlendFunc(GL_SRC_ALPHA, GL_ONE)),否則它使用相同的數學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混合模式發揮它的魔力要慢。

+0

當我用glBlendFunc(GL_SRC_ALPHA,GL_ONE)添加兩個紅色(255,0,0)時,我得到一個紅色:http://www.andersriggelsen.dk/glblendfunc.php當我選擇純紅色時,我想獲得更淺的紅色,就像這裏http://www.escapemotions.com/experiments/flame/。也許它不僅僅是純粹的OpenGL混合,而且火焰的中心最終變成了白色,與它下面的顏色無關。 – 2013-05-21 15:14:30

+0

顏色escapemotions.com/experiments/flame可能取決於粒子的位置。它似乎離光標越近,它就是最白的。這可以解釋這種影響,無需任何特殊的混合。 – 2013-06-05 20:59:52