1

OpenGL でこの種の効果を実現したいと思います: http://www.escapemotions.com/experiments/flame/#top

明るさの値を追加するように見える加法ブレンドがあります。赤色を追加すると白色が得られます。

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

GLSL (2 つの色を HSV 空間に変換し、値を追加して元に戻す) を使用してこれを実装できますが、もっと良い方法があるかどうか疑問に思っています。

フレームペインタは Processing で作られています (私は openframeworks を使っているのでよくわかりません)。

4

2 に答える 2

2

ここでは、Flame Painter プログラマーの Peter です。

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

ブレンドモードは、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を使用することの良い点は、CPUではなくGPUで発生することです。したがって、上記のように自分で計算を行うと、グラフィックカードでサポートされているGLブレンドモードに魔法をかけるよりも遅くなります。

于 2013-03-13T05:55:56.723 に答える