2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

palette関数でグラデーション

Posted at

シェーダーで配色するときに、以下のようなpalette関数を使うといい感じのグラデーションを作ることができる。しかし、パラメータからどういうグラデーションができるか予測しづらいという欠点もある。この記事は、palette関数でパラメータを変えたときの挙動をメモ的にまとめたものである。

vec3 palette(float t, vec3 offset, vec3 amplitude, vec3 frequency, vec3 phase) {
    return offset + amplitude * cos(6.28318530718 * (t * frequency + phase));

なお、この記事で出てくるコードは上述したpalette関数をマクロ関数にしたものを使用している。

#define palette(t,offset,amplitude,frequency,phase) ((offset)+(amplitude)*cos(6.28318*((t)*(frequency)+(phase))))

まずはphase以外を固定して試してみる。

位相の差を等間隔にすると、虹色のグラデーションになる。

palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.333, 0.666))

palette_01.png


RGBの位相差を等間隔なまま小さくすると、グラデーションに明るい部分(白色)と暗い部分(黒色)が表れる。

palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.2, 0.4))
palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.1, 0.2))
palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.05, 0.1))

palette_02.png
palette_03.png
palette_04.png

palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.4, 0.2))
palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.2, 0.1))
palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.1, 0.05))

palette_05.png
palette_6.png
palette_07.png

palette(t, 0.5, 0.5, 1.0, vec3(0.2, 0.4, 0.0))
palette(t, 0.5, 0.5, 1.0, vec3(0.1, 0.2, 0.0))
palette(t, 0.5, 0.5, 1.0, vec3(0.05, 0.1, 0.0))

palette_08.png
palette_09.png
palette_10.png


RGBのうち2つの位相差を小さくすると、2色のグラデーションのようになる。

palette(t, 0.5, 0.5, 1.0, vec3(0.0, 0.1, 0.5))
palette(t, 0.5, 0.5, 1.0, vec3(0.5, 0.0, 0.1))
palette(t, 0.5, 0.5, 1.0, vec3(0.1, 0.5, 0.0))

palette_14.png
palette_15.png
paltte_16.png


ここからはphase以外もいじってみる。

frequencyをいじると、いろいろな色が現れるようになるが制御が難しそう。

palette(t, 0.5, 0.5, vec3(1.0, 2.0, 3.0), vec3(0.0, 0.333, 0.666))

palette_17.png


offsetとamplitudeもいじってみる。

例えば、R成分を定数にしてみるとこんな感じ。

palette(t, vec3(0.0, 0.5, 0.5), vec3(0.0, 0.5, 0.5), 1.0, vec3(0.0, 0.0, 0.2))
palette(t, vec3(0.5, 0.5, 0.5), vec3(0.0, 0.5, 0.5), 1.0, vec3(0.0, 0.0, 0.2))
palette(t, vec3(1.0, 0.5, 0.5), vec3(0.0, 0.5, 0.5), 1.0, vec3(0.0, 0.0, 0.2))

palette_18.png
palette_19.png
palette_20.png


offset、amplitudeもいじるといい感じのグラデーションができるが、結局挙動を予想しながら作るのは難しい。

palette(t, vec3(0.7, 0.5, 0.3), vec3(0.2, 0.3, 0.3), 1.0, vec3(0.0, 0.35, 0.5));
palette(t, vec3(0.4, 0.5, 0.5), vec3(0.2, 0.3, 0.2), vec3(2.0, 1.0, 1.0), vec3(0.0, 0.4, 0.5))
palette(t, vec3(0.2, 0.6, 0.4), vec3(0.1, 0.5, 0.1), vec3(1.0, 1.0, 2.0), vec3(0.0, 0.3, 0.15))
palette(t, vec3(0.5, 0.7, 0.5), vec3(0.5, 0.1, 0.5), 1.0, vec3(0.0, 0.5, 0.3))

palette_21.png
palette_22.png
palette_23.png
palette_24.png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?