1 of 77

シェーダライブコーディングのすすめ

UnityエンジニアによるShader勉強会!- KLab TECH Meetup #4

2 of 77

自己紹介

↓ aが5個

3 of 77

自己紹介

一か月前からライブコーディングにハマっています

4 of 77

この発表を届けたい人

  • シェーダー好きな人!
  • シェーダーだけで絵を出すのは難しそう...と思っている人!
  • ゲーム制作中にうっかりシェーダーばかり書いてしまって進捗が出ない人!

5 of 77

発表の流れ

  • 仕事について
  • 今まで作ったもの紹介
  • シェーダーライブコーディングって何?
  • シェーダーライブコーディング4つの面白ポイント
  • デモシーンの話
  • Shadertoyの紹介
  • ライブコーディングのためのglslfan紹介
  • 入門レイマーチング
  • その後の学び方
  • 距離関数モデリングに使えるテクニック集
  • ライブコーディングで使えるテクニック集
  • ウォッチするべき人たち
  • デモンストレーション
  • まとめ

6 of 77

発表の流れ

  • 仕事について
  • 今まで作ったもの紹介
  • シェーダーライブコーディングって何?
  • シェーダーライブコーディングの4つの面白ポイント
  • デモシーンの話
  • Shadertoyの紹介
  • ライブコーディングのためのglslfan紹介
  • 入門レイマーチング
  • その後の学び方
  • 距離関数モデリングに使えるテクニック集
  • ライブコーディングで使えるテクニック集
  • ウォッチするべき人たち
  • デモンストレーション
  • まとめ

7 of 77

発表の流れ

  • シェーダーライブコーディングって何?
  • シェーダーライブコーディングの4つの面白ポイント
  • 入門レイマーチング
  • 今日から使える平面の小技(おまけ)
  • まとめ

8 of 77

シェーダーライブコーディングって何?

9 of 77

シェーダーライブコーディングって何?

  • 短時間のシェーダーコーディングで映像を作る
  • VJのパフォーマンスや競技として行われている
  • 所謂シェーダー芸のひとつ

10 of 77

競技?

国内外のデモパーティで大会が行われている

Tokyo Demo Fest 2018

Revision 2019

11 of 77

競技?

  • 大きな特徴
    • 制限時間がある
      • 大体30分前後
    • 自分の知識の範囲で勝負する
      • 必要な道具は全て競技中に実装する

12 of 77

シェーダー芸?

  • シェーダーの役割
    • 座標変換
    • シェーディング
    • 画像処理

13 of 77

シェーダー芸?

フラグメントシェーダーのみで映像を作る!

板ポリ

14 of 77

シェーダーライブコーディング4つの面白ポイント

15 of 77

面白ポイント①

シェーダーだけで完結する!

16 of 77

面白ポイント➁

まるで魔法に見える!

17 of 77

面白ポイント➂

隙間時間に遊べる!

18 of 77

面白ポイント④

宴会芸に使えるかも!?

19 of 77

入門レイマーチング

20 of 77

シェーダー芸?

フラグメントシェーダーのみで映像を作る!

板ポリ

21 of 77

フラグメントシェーダーのみで映像?

板ポリにフラグメントシェーダーというと

ポストエフェクト

22 of 77

ポストエフェクト

シェーダー芸

全ピクセルにシェーダーを実行する

描画結果をサンプルして加工する

ピクセル色を決定する

全ピクセルにシェーダーを実行する

形状を定義する

形状をトレースして情報を集める

ピクセル色を決定する

23 of 77

形状をトレースする

スフィアトレーシング

24 of 77

スフィアトレーシング

vec2 p = gl_FragCoord.xy / resolution.xy;

0.0

1.0

gl_FragCoord = 現在のピクセル座標

resolution = 画面解像度

25 of 77

スフィアトレーシング

vec2 p = ( gl_FragCoord.xy * 2. - resolution.xy ) /

min(resolution.x, resolution.y);

0.0

-1.0

1.0

26 of 77

スフィアトレーシング

vec2 p = ( gl_FragCoord.xy * 2. - resolution.xy ) /

min(resolution.x, resolution.y);

vec3 ro = vec3(0., 0., -5.);

vec3 rd = normalize(vec3(p, screenZ));

ro

rd

27 of 77

スフィアトレーシング

vec2 p = ( gl_FragCoord.xy * 2. - resolution.xy ) /

min(resolution.x, resolution.y);

vec3 ro = vec3(0., 0., -5.);

float screenZ = 2.5;

vec3 rd = normalize(vec3(p, screenZ));

screenZ = 0.5

screenZ = 5.0

screenZ = 2.5

28 of 77

スフィアトレーシング

・・・

float t = 0.0;

for (int i = 0; i < 99; i++) {

vec3 pos = ro + rd * t;

float d = distanceFunction(pos);

t += d;

}

29 of 77

スフィアトレーシング

・・・

float t = 0.0;

vec3 col = vec3(0.);

for (int i = 0; i < 99; i++) {

vec3 pos = ro + rd * t;

float d = distanceFunction(pos);

if (d < 0.0001) {

col = 色を決定!;

break;

}

t += d;

}

30 of 77

スフィアトレーシング

31 of 77

スフィアトレーシング

32 of 77

形状を定義する

Distance Function(距離関数)

  • 入力座標pからオブジェクトへの最短距離を出力する関数
  • 外部なら、内部ならの距離を出力する

float distanceFunction(vec3 p) {

float d = 最短距離を計算;

return d;

}

33 of 77

簡単な距離関数を紹介

34 of 77

r

p

d

  • 半径rの球の距離関数
  • 原点からの距離(length(p))から半径(r)を引く

原点

35 of 77

平面

p

d

  • 無限平面の距離関数
  • 入力pの高さが最短距離

36 of 77

箱の距離関数を作ってみよう

37 of 77

Distance Estimator

Distance Estimator(距離推定器)

必ずしも最短距離である必要はない

平面の距離関数をアレンジすれば箱を作れる!

Distance Function(距離関数)

38 of 77

箱の距離関数

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

39 of 77

箱の距離関数

float sdBox(vec3 p, float s) {

return p.y;

}

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

40 of 77

箱の距離関数

float sdBox(vec3 p, float s) {

return p.x;

}

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

41 of 77

箱の距離関数

float sdBox(vec3 p, float s) {

return max(max(p.x, p.y), p.z);

}

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

42 of 77

箱の距離関数

float sdBox(vec3 p, float s) {

return max(max(p.x, p.y), p.z);

}

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

43 of 77

箱の距離関数

float sdBox(vec3 p, float s) {

p = p - s;

return max(max(p.x, p.y), p.z);

}

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

s, s

44 of 77

箱の距離関数

?

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

s, s

45 of 77

Fold(折り畳み)

46 of 77

Fold(折り畳み)

0.0

-1.0

1.0

-0.2

-0.4

-0.9

0.2

0.4

0.9

47 of 77

Fold(折り畳み)

0.0

1.0

1.0

0.2

0.4

0.9

0.2

0.4

0.9

48 of 77

箱の距離関数

float sdBox(vec3 p, float s) {

p = p - s;

return max(max(p.x, p.y), p.z);

}

-1.0, 1.0

-1.0, -1.0

1.0, -1.0

1.0, 1.0

0.0, 0.0

s, s

-s, -s

s, -s

-s, s

49 of 77

箱の距離関数

float sdBox(vec3 p, float s) {

p = abs(p) - s;

return max(max(p.x, p.y), p.z);

}

1.0, 1.0

1.0, 1.0

1.0, 1.0

1.0, 1.0

0.0, 0.0

s, s

s, s

s, s

s, s

50 of 77

箱の距離関数

今回作ったもの

正確な箱の距離関数

51 of 77

箱の距離関数

今回作ったもの

正確な箱の距離関数

正確でなくても単純な形の組み合わせで距離関数を構築できる!

52 of 77

やったぜ!

53 of 77

次は?

54 of 77

今日から使える平面の小技

55 of 77

小技

ダイヤモンドの距離関数が欲しいよ~

56 of 77

小技

平面の距離関数を拡張すれば

任意の法線を持つ平面距離関数を定義できる

p

d

原点

h

n

57 of 77

小技

Gem clock by keim

58 of 77

小技

Polar Modという極座標でオブジェクトを複製するテクニック

平面の距離関数

ベースとなる円柱の距離関数

円柱を平面で削り取る(積集合)

59 of 77

小技

Polar Modという極座標でオブジェクトを複製するテクニック

平面の距離関数

ベースとなる円柱の距離関数

円柱を平面で削り取る(積集合)

60 of 77

小技

Polar Modという極座標でオブジェクトを複製するテクニック

平面の距離関数

ベースとなる円柱の距離関数

円柱を平面で削り取る(積集合)

61 of 77

小技

Polar Modという極座標でオブジェクトを複製するテクニック

平面の距離関数

ベースとなる円柱の距離関数

円柱を平面で削り取る(積集合)

62 of 77

小技

平面の距離関数だけで任意の凸体を定義できる!

距離関数のライブ感を出すのに便利!

63 of 77

まとめ

64 of 77

まとめ

  • シェーダー好きな人にはオススメの遊び!
  • フラグメントシェーダーを実装するだけでお手軽!
  • 平面最強!
  • 意外とハードルは高くない!
  • 楽しい!!(重要)

65 of 77

みんなもやろう!

たのしいよ~

66 of 77

yourname@mail.com

http://www.example.com/

こっから没スライド

67 of 77

競技?

国内外のデモパーティで大会が行われている

Tokyo Demo Fest 2018

Revision 2019

68 of 77

Slide title here

CASE1:団子の距離関数が欲しいよ~

69 of 77

Slide title here

70 of 77

Slide title here

71 of 77

Slide title here

72 of 77

裏技

73 of 77

Fold

0.0

-1.0

1.0

-0.2

-0.4

-0.9

74 of 77

Fold

0.0

1.0

1.0

0.2

0.4

0.9

0.2

0.4

0.9

75 of 77

Fold(折り畳み)

76 of 77

Fold(折り畳み)

77 of 77

Slide title here

ITER = 0

ITER = 1

ITER = 4