1 of 19

2021/02/14 - メガデモ勉強会2021

2 of 19

自己紹介

Twitter : @Uksksan

GitHub: @ukonpower

ukonpower

💻: フロントエンドエンジニア

💗: Three.js / WebGL / Blender

3 of 19

目次

  1. このLT
  2. ハイブリッドレンダリング
  3. テクスチャのパッキング
  4. 軽量化
  5. レンダーパイプライン
    1. Bloom
    2. SMAA
  6. その他
    • MSDF

4 of 19

このLTってなに

普通のサイトでもレイマーチングがしたい!

そう思ってる人も多いはず

そんな人達の人柱となるべくしてサイトを作りました

Web寄りのWebGLの話です

ちょうど一番目なので準備運動だと思って聞いてください

5 of 19

このLTってなに

めっちゃ調整中です

6 of 19

Recollection

WebGL(Three.js) / Blender などを用いて作成したシーンをまとめるページ。

頑張って比較的品質の良いものをつくる。

7 of 19

ポリゴン ↔ レイマーチング

ポリゴン

レイマーチング

  • 具体的
  • 低負荷
  • 抽象的
  • 高負荷

狙った絵が出しやすいので情報を見せるのに向いてる(まあ当たり前

抽象的でイメージを伝えるのには向いてるが、具体的な情報を出すには高負荷になりがち

8 of 19

Webでレイマーチングを使うには

情報

→ ポリゴン

雰囲気

→ レイマーチング

9 of 19

Webでレイマーチングを使うには

情報

→ ポリゴン

雰囲気

→ レイマーチング

結論:

ハイブリッドレンダリング

10 of 19

ラスタライズとレイマーチングのハイブリッドレンダリング

ラスタライズ

Color

Depth

レイマーチング

Color

Depth

オレオレデプステスト

11 of 19

テクスチャのパッキング

深度データには高い精度が必要。(今回の場合は16bit程度)

Floatテクスチャを利用する事もできるが、未対応の端末でも閲覧できるように深度データのパッキングを行った。

ついでに色もレイマーチング側で計算してパッキングした。

G

16bit

R

G

B

A

8bit

G

D1

D2

R

R

B

B1

B2

Depth

D1

D2

Depth

B1

Color

R

G

B2

5bit

3bit

12 of 19

テクスチャのパッキング

大変参考にさせていただきました

@edo_m18: floatの値を4つの8bit intに変換して保持するhttps://qiita.com/edo_m18/items/4b23846b8a97ec2a21de

13 of 19

レイマーチングの軽量化

レイマーチングにおいてのLOD

if( sdBox( p, size ) < 0.2 ) {

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

p.zy = abs(p.zy);

p.xz *= rotate( 0.1 );

// ...略

}

}

d = sdBox( p, size );

がむさん(@gam0022)に教わった手法です!!

レイとオブジェクトとの距離が近いときだけIFSを行う

IFS

毎回複雑な計算がされないためかなり軽量化されます!

底上げ(解像度の調整)

軽量化として取り上げるのはアレですが....

レイマーチングの描画解像度を若干下げてます

14 of 19

レンダーパイプライン

シーンの描画からポストプロセスなどのレンダリングフローの制御 → レンダーパイプライン

Scene

Bright

Composite

(Postprocess)

RenderTarget1

RenderTarget2

RenderTarget3

Edge

BWCalc

Blending

Blur1

Blur1

Blur1

Blur1

Blur1

Blur1

Blur1

Blur1

Raymarch

Mix

SceneDepth

Content

SceneMixer

SMAA

Bloom

15 of 19

Bloom

4段階の縮小バッファを用いてます。

縮小バッファを使うことは超おすすめです。(ぶっちゃけこれだけで絵が持つ)

16 of 19

SMAA (アンチエイリアス)

お気に入りのアンチエイリアス

比較はしてないけど品質良いしパフォーマンスもそんなに気にするほどじゃなさそう...?

17 of 19

MSDF

テキストをディスタンスフィールドテクスチャで描画する

→ テクスチャ解像度によるジャギりがなくなる

18 of 19

MSDF

テクスチャジェネレータ

文字の座標などが入ったjson

ディスタンスフィールドテクスチャ

19 of 19

まとめ

  • Webサイトでレイマーチングをしたい
    • ポリゴンとレイマーチングのハイブリッドレンダリング
    • テクスチャパッキングで対貧弱GPU
    • 距離関数のLODで軽量化
  • その他
    • Bloomは縮小バッファを使おう
    • SMAAいいよ
    • MSDFいいよ

日常でレイをマーチングできる世界を目指しましょう!!