1 of 40

シェーダーで行うモデリング

tonoshake

2 of 40

自己紹介

・CGで遊び始めて一年程の初心者

・3Dモデリングとシェーダーを描くことが好き

3 of 40

作ったものの一部

動く花火の団扇

何にでも水晶をはやせるシェーダー

VRChat公式Publicアバター

tonosama

STYLY Avatar Diorama Awards

みんなのいいね賞 受賞

iori space

4 of 40

モデリングできそうなシェーダー

・ジオメトリーシェーダー

・フラグメントシェーダー

線、面、点を好きなように

作ったり移動させたりできる

画面上で出す色を好きに決められる

5 of 40

ジオメトリーシェーダーによるモデリング

6 of 40

ジオメトリーシェーダーで作られるものの例

ボクセルシェーダー

GPUパーティクル

7 of 40

ジオメトリーシェーダーの基本情報

3つの出力方法をもつ

TriangleStream

LineStream

PointStream

8 of 40

ジオメトリーシェーダーでモデリング

入力 P(0,0,0)

Y

Z

X

C

B

A

O

Y

Z

X

O

P

A = P + (1, 1, 0)

B = P + (1,-1, 0)

C = P + (-1,1, 0)

出力

9 of 40

ジオメトリーシェーダーでモデリング

頂点A = P + (1, 1, 0)

頂点B = P + (1,-1, 0)

頂点C = P + (-1,1, 0)

頂点P(x,y,z)

10 of 40

ジオメトリーシェーダーでモデリング

入力 P(0,0,0)

Y

Z

X

B

A

O

Y

Z

X

O

P

A = ( 1, 1, 1)

B = ( 1, -1, 1)

C = (-1, 1, 1)

D = (-1, -1, 1)

E = ( 1, 1, -1)

F = ( 1, -1, -1)

G = (-1, 1, -1)

H = (-1, -1, -1)

C

D

E

F

G

G

11 of 40

ジオメトリーシェーダーでモデリング

入力 P(x,y,z)

A = P + ( 1, 1, 1)

B = P + ( 1, -1, 1)

C = P + (-1, 1, 1)

D = P + (-1, -1, 1)

E = P + ( 1, 1, 1)

F = P + ( 1, -1, 1)

G = P + (-1, 1, 1)

H = P + (-1, -1, 1)

12 of 40

ジオメトリーシェーダーでモデリング 〆 

Quadから生やした水晶

GPUチャーハン by アワビP

13 of 40

フラグメントシェーダーによるモデリング

14 of 40

フラグメントシェーダーの簡単な紹介

(R,G,B) = (X,Y,0)

O

X

Y

O

X

Y

(R,G,B) = Oからの距離

15 of 40

フラグメントシェーダーで描かれた画

Inigo Qilez 「Happy Jumping」

https://www.shadertoy.com/view/3lsSzf

Big WIngs「Kelp Forest」

https://www.shadertoy.com/view/llcSz8

16 of 40

レイマーチング の紹介

5ピクセル

カメラ

17 of 40

レイマーチング の紹介

5ピクセル

カメラ

18 of 40

レイマーチング の紹介

6x6ピクセル

カメラ

19 of 40

スフィアトレーシング の紹介

5ピクセル

カメラ

20 of 40

スフィアトレーシング の紹介

5ピクセル

カメラ

21 of 40

レイマーチング  球の作り方

カメラ

Z

Y

O

( 0, 0, -10)

( 0, 0 ,0)

球の表面までの距離

(球の中心⇔光の先端 間の距離) - 球の半径

光の先端

( 0, 0, -5)

r = 1

距離関数

22 of 40

レイマーチング  距離関数の紹介

箱の距離関数

float sdBox( vec3 p, vec3 b )

{

vec3 q = abs(p) - b;

return length(max(q,0.0))+min(max(q.x,max(q.y,q.z)),0.0);

}

シリンダーの距離関数

float sdCylinder( vec3 p, vec3 c )

{

return length(p.xz-c.xy)-c.z;

}

23 of 40

レイマーチング  物体の移動

Z

Y

O

光の先端

( 0, 0, -5)

Z

Y

O

光の先端

( 0, -5, -5)

Z

Y

O

光の先端

( 0, +5, -5)

(0,+5,0)

(0,-5,0)

先端 - (0,-5,0)

先端 - (0,+5,0)

光の先端座標から移動させたい値を引けば良い!

24 of 40

レイマーチング  形状の変化

Y

Z

X

光の先端 rp

mat2 rot(float a)

{

float s = sin(a),c = cos(a);

return mat2(c,s,-s,c);

}

rp.xz *= rot(rp.y);

box = sdBox(p,vec3(.9));

25 of 40

レイマーチング  形状の変化

Y

Z

X

光の先端 rp

rp.y += sin(rp.x * 2.);

box = sdBox(p,vec3(3.,1.,3.)) ;

26 of 40

レイマーチング  形状の変化

Y

Z

X

光の先端 rp

rp.x = -abs(rp.x);

rp.xz *= rot(rp.y);

box = sdBox(p,vec3(.9));

27 of 40

レイマーチングのモデリングまとめ

距離関数を作る(先人の知恵を借りる)

光の先端の調整

回転したり移動させたり...

距離関数に突っ込む

レイマーチングでモデリングした雪だるま

28 of 40

レイマーチングが行える場所

GLSL Sandbox http://glslsandbox.com/

・アクセスするだけで書き始められる 

GLSL fan   https://glslfan.com/   

・ツイッターでログイン可能

Shadertoy https://www.shadertoy.com/

・シェーダーの神がたくさん住んでいるところ

・ すごい作品がいっぱい

NEORT https://neort.io/

・作品を登録して売買できる

手軽

(Unityのfragment shaderでもできます)

29 of 40

まとめ

30 of 40

まとめ

・ジオメトリーシェーダーは入力頂点の座標を加工して増やして形を作る

・レイマーチングは光の先端の座標を加工して形を作る

シェーダーは楽しい

31 of 40

32 of 40

先人達による凄い資料

33 of 40

おまけ

ボクセルシェーダー https://github.com/rekahsnnig/shader/boxel.shader

ジオメトリーシェーダーテンプレート https://github.com/rekahsnnig/shader/template_geometry.shader

Unityシェーダー向け レイマーチング雪だるま https://github.com/rekahsnnig/shaderyukidaruma.shader

glslsandboxで使えるレイマーチング のテンプレート http://glslsandbox.com/e#59558.0

34 of 40

以降没スライド

35 of 40

ジオメトリーシェーダーでモデリング おまけ

36 of 40

レイマーチング の紹介

O

X

Y

37 of 40

シェーダー

Tree house in the Shade

by 1001

Club Transcendia

by The Architect

ShaderFes2019

by momoma

38 of 40

レイマーチング

カメラ

光: 物体 -> カメラ

見える画

カメラ

光: 物体 <- カメラ

見える画

レイマーチングじゃない

レイマーチング

39 of 40

ジオメトリーシェーダーでモデリング

頂点A = P + (1, 1, 0)

頂点B = P + (1,-1, 0)

頂点C = P + (-1,1, 0)

頂点P(x,y,z)

40 of 40

ジオメトリーシェーダーでモデリング

頂点A = P + (1, 1, 0)

頂点B = P + (1,-1, 0)

頂点C = P + (-1,1, 0)

頂点P(x,y,z)