1 of 95

デモシーンへようこそ

4KBで映像作品を作る技術、およびゲーム開発への応用

TokyoDemoFest Organizers:

Seiya Ishibashi / Julien Guertault

2 of 95

はじめに

  • CEDEC 2016 のセッションの続きになりますが、前回を見ていなくても大丈夫な構成になっています
  • デモシーンの技術やノウハウをゲーム制作に応用してみよう、というのが今回の趣旨になります
  • 辛口セッションなのでそれなりの前提知識を求めます
    • 最低限 deferred shading がどう機能するか知っているレベル
  • スライドは公演後公開します

3 of 95

About Us

  • Tokyo Demo Fest の運営チーム
  • 両者共ゲーム会社勤めだが、今回は TDF として講演

Seiya Ishibashi

(@i_saint)

Julien Guertault

(@Zavie)

4 of 95

Agenda

  1. 前回のおさらい
  2. 64k intro 制作から学んだこと (Zavie)
  3. ゲーム制作への応用 (i-saint)

5 of 95

前回のおさらい

  • 前回のおさらい
  • 64k intro 制作から学んだこと (Zavie)
  • ゲーム制作への応用 (i-saint)

Agenda

6 of 95

  • 前回はデモシーンについて浅く広く紹介し、4k intro の作り方について大雑把に解説しました
  • 今回のセッションはレンダリングに絞った内容になっており、Raymarching に限って前回の内容をおさらいします

前回のおさらい

7 of 95

  • 4k intro = 4KB の exe によるデモ
  • 容量の制限からポリゴンを用いない特殊なレンダリング手法がよく用いられる
  • それが Distance Function & Raymarching

前回のおさらい

8 of 95

  • 画面全体を覆う 4 角形を 1 枚出す
  • あとは全てピクセルシェーダでがんばる

Distance Function & Raymarching

9 of 95

  • モデルは Pixel Shader の中で数式で表現し、それを可視化していく
  • このモデルの数式が Distance Function、可視化のプロセスが Raymarching と呼ばれる

Distance Function & Raymarching

10 of 95

Distance Function & Raymarching

11 of 95

Distance Function & Raymarching

12 of 95

  • 十分に距離が小さくなったら計算を打ち切る
    • もしくは上限マーチ回数を超えたら打ち切る
    • 完全に正確な交差点は求まらないが、必要十分
  • この計算を全てのピクセルに対して行う
    • Distance Function の複雑さ * マーチ回数 に応じて負荷が増大
  • 特徴的なレイの進み方から Sphere Tracing と呼ぶことも

Distance Function & Raymarching

13 of 95

  • 法線を求めることも可能
  • 交差点からx,y,z軸それぞれ前後に少しずらした地点との距離を計算
  • 勾配から法線を推測

Distance Function & Raymarching

14 of 95

  • 法線が求まるのでライティングも可能
  • Ray→法線 の反射方向へ再度レイを飛ばせば反射なども表現可能

Distance Function & Raymarching

15 of 95

  • ポリゴンでは難しいモデルの合成が簡単に実現できる

Distance Function & Raymarching

16 of 95

Distance Function & Raymarching

  • フラクタル

17 of 95

Distance Function & Raymarching

18 of 95

64k intro 制作から学んだこと

  • 前回のおさらい
  • 64k intro 制作から学んだこと (Zavie)
  • ゲーム制作への応用 (i-saint)

Agenda

19 of 95

Professional and hobbyist programmer.��“What do you do on your free time?”

“Same as at work.”

Demoscene: making demos with Ctrl-Alt-Test.

デモシーンについて

20 of 95

Ctrl-Alt-Testと言うグループ

  • 64k intros (=64kBなデモ) を作ります
  • プログラマー2人
  • サウンド1人2人
  • たまに、他の友人も参加

デモシーンについて

21 of 95

64k intro: H - Immersion (2017)

22 of 95

64k intro: H - Immersion (2017)

23 of 95

例・調査船

24 of 95

例・調査船

25 of 95

例・調査船

26 of 95

例・調査船

27 of 95

例・調査船

メッシュ: ~934 バイト

テクスチャ: ~1013 バイト

misc/shared: +20~25% (?)

28 of 95

例・調査船

29 of 95

例・調査船

30 of 95

例・調査船

31 of 95

例・アルテミス神殿

世界の七不思議のひとつに挙げられている

32 of 95

例・アルテミス神殿

33 of 95

例・アルテミス神殿

人間

34 of 95

例・アルテミス神殿

35 of 95

例・アルテミス神殿

石像の

テスト

36 of 95

例・アルテミス神殿

アルテミス神殿のメッシュ: ~1174 バイト

柱のメッシュ: ~817 バイト

塑像のメッシュ: ~1461 バイト

アルテミス神殿のテクスチャ: ~1370 バイト

柱のテクスチャ: ~592 バイト

misc/shared: +20~25% (?)

37 of 95

サイズについて

メッシュ

音楽

テキスチャ

シェーダー

シーン

ベース

共同

38 of 95

Size-codingは楽しい。それに、面白いです。

But not very useful. :-)

So let’s talk about more useful things.

作成について

39 of 95

Ctrl-Alt-Testと言うグループ

  • 64k intros (=64kBなデモ) を作ります

UE4, Unity, Photoshop, Maya, mp3 :-(

  • プログラマー2人
  • サウンド2人

⇒ Very limited manpower :-(

作成について

40 of 95

Reduce iteration time:

  • Hot reload data!
  • Hot reload shaders!
  • Hot reload assets!
  • Hot reload code! \o/

作成について

41 of 95

Hot reload code:

作成について

42 of 95

Abuse your tools!

デバッグについて

43 of 95

Visual Studio?

  • Clever syntax highlighting.
  • XML comments.
  • Natvis.

デバッグについて

44 of 95

デバッグについて

45 of 95

Have an error message?

  • Output log to the IDE output.�win32: OutputDebugString()
  • Include file location.
  • Format it like a compilation error.

→ Will appear in IDE console; double click will jump to location.

デバッグについて

46 of 95

Have an abstraction?

Graphic API abstraction class?

Write a debug implementation.

→ Insert a debug layer.

デバッグについて

47 of 95

H - Immersion

64k intro, 2017

デモ

48 of 95

ゲーム制作への応用

  • 前回のおさらい
  • 64k intro 制作から学んだこと (Zavie)
  • ゲーム制作への応用 (i-saint)

Agenda

49 of 95

Pros:

  • 比較的少ない労力で複雑なモデルを出せる
  • ポリゴンベースでは難しい表現ができる

Cons:

  • シーン全てを Distance Function で表現するのは無理がある
  • 編集や制御が大変
  • 重い

ゲーム制作への応用

50 of 95

  • シーン全てを Distance Function で表現するのは無理がある
    • ポリゴンモデルと Distance Function を混在できるようにしたい
  • Deferred Shading であればこれは容易に可能

ポリゴンモデルとの混在

51 of 95

  • Deferred Shading の場合ライティングは G-Buffer に対して行われる
  • G-Buffer さえ生成できれば一貫したライティングやポストエフェクト処理を実現できる
  • Raymarching で G-Buffer を生成すればポリゴンモデルと完璧な混在が可能

ポリゴンモデルとの混在

52 of 95

  • Raymarching とポリゴンモデルで座標系を一致させる必要がある
  • Raymarching に必要なパラメータは ViewProjection 行列から抽出可能

G-Buffer 生成

53 of 95

  • Ray の位置に ViewProjection 行列を掛けて Depth を算出
  • Pixel Shader の Depth 出力機能で出力
    • HLSL だと SV_Depth
    • プラットフォームよって範囲が異なる可能性があるので注意
      • 0.0~1.0 or -1.0~1.0

G-Buffer 生成

54 of 95

  • Normal
    • 通常通り勾配から求める

G-Buffer 生成

55 of 95

  • Albedo, Emission など
    • 特に決まった方法はない
    • 出したい絵に応じて臨機応変に

G-Buffer 生成

56 of 95

G-Buffer 生成

57 of 95

G-Buffer 生成

58 of 95

  • Raymarching とライティングを 1 Pass で行えば混在可能
  • Depth / Normal Buffer などを要求される場合、専用のバッファを用意
    • Ray が進んだ距離を記憶して各 Pass で使い回す

Forward Shading の場合

59 of 95

  • Intro の場合 Fullscreen Quad 1 枚で全てをレンダリングする
    • 1 つの Distance Function で全オブジェクトを表現
  • ゲームの場合この制約は不要
    • ゲーム用にシーンの構成を改善する余地がある

Object Space Raymarching

60 of 95

  • Distance Function をパーツ毎に独立したシェーダに分解
  • Bounding Volume となる単純なポリゴンモデルをシーンに配置
    • Box, Sphere など
  • ポリゴンモデルの表面から Raymarching

Object Space Raymarching

61 of 95

  • オブジェクトの Transform を反映させる
    • Ray にオブジェクトの Transform の逆行列を掛ける
  • ゲームエンジン上で Distance Function モデルの配置が可能になる

Object Space Raymarching

62 of 95

  • パラメータによる形状の変化
    • エディタ上のパラメータ調整でバリエーションを出す

Object Space Raymarching

63 of 95

Object Space Raymarching

Bounding Volume

Result

  • 作例

64 of 95

  • Raymarching の負荷 3 要因
    • Distance Function の複雑さ
    • Raymarching の Step 数
    • 描画 Pixel 数
  • この 3 つに比例して負荷が増大

Raymarching 高速化

65 of 95

  • Raymarching の負荷 3 要因
    • Distance Function の複雑さ
    • Raymarching の Step 数
    • 描画 Pixel 数
  • この 2 つを最適化する方法を考える
    • これらは一度実装すれば Distance Function が変わっても適用可

Raymarching 高速化

66 of 95

  • 低解像度のバッファから段階的に Raymarching することでトータル Step 数を減らす
    • 低解像度のバッファで Step 数多めに Raymarching
    • 高解像度のバッファで、低解像度の結果を引き継いで Step 数少なめに Raymarching
    • 上記手順を何段階か繰り返す

Hierarchical Raymarching

67 of 95

Hierarchical Raymarching

68 of 95

  • 非常に上手く機能する
  • 品質の低下は少ない方だが、細部が潰れるのが欠点

Hierarchical Raymarching

69 of 95

  • 数フレームに分けて Raymarching することで 1 フレームあたりの Step 数を減らす
    • Step 数少なめで Raymarching
    • 前フレームの Ray の位置を Temporal Reprojection しつつ継続

Temporal Raymarching

70 of 95

Temporal Raymarching

71 of 95

  • 大きな高速化が見込めるが、大きな問題も数点
    • 結果が安定するまで輪郭付近が汚くなる
    • Temporal Reprojection の誤差により Ray が貫通する
  • 輪郭付近は Step 数多めにする、モーションブラーなどで誤魔化す、Ray を少し引き戻すなど、泥臭い対策が必要

Temporal Raymarching

72 of 95

  • Pixel Shader で自力で Depth を出力する場合、Early Depth Test が無効化される
    • 遮蔽される Pixel にも Pixel Shader が走ってしまう

Conservative Depth Output

73 of 95

  • Conservative Depth Output でその欠点をある程度克服できる
    • D3D11 世代で備わった機能
    • SV_DepthGreaterEqual / SV_DepthLessEqual
  • 出力 Depth に本来よりも 前 / 後ろ の前提を与えられる
  • 自力で Depth を出力しつつ Early Depth Test を有効にできる

Conservative Depth Output

74 of 95

  • 今回の場合 Depth は Bounding Volume より必ず奥になる
  • SV_DepthGreaterEqual で高速化が見込める
  • ポリゴンモデルより後に描くようにすればより効果的

Conservative Depth Output

75 of 95

  • 近隣 Pixel の Ray から Normal 生成
    • ddx() / ddy() で勾配を算出
    • Normal 生成には通常 6 回 Distance Function を計算する必要があるが、そのコストを削減できる
    • そのままでは品質の劣化が激しい

その他使えるかもしれないテクニック

76 of 95

  • 横半分の解像度でレンダリングして前フレームの結果と混ぜる
    • Temporal Reprojection で補正しつつ Interlace で合成
    • 効果はそこそこだが品質も落ちる
    • Killzone: Shadow Fall のマルチプレイヤーモードで採られた手法

その他使えるかもしれないテクニック

77 of 95

  • Enhanced Sphere Tracing
    • Mercuryによる提案手法
    • intro 用テクニックでゲームにはやや不向き
    • 以下大雑把に紹介

その他使えるかもしれないテクニック

78 of 95

  • Over-Relaxation Sphere Tracing
    • Ray を通常より多めに進める
    • Sphere がオーバーラップしなかったら引き戻して通常運行

Enhanced Sphere Tracing

79 of 95

  • Bounding Volume を用いた最適化
    • Distance Function の Bounding Volume を用意
      • Sphere など Ray との交差点を一発で求められる図形
    • Ray と Bounding Volume との交差点を計算
    • 交差点から Raymarching 開始

Enhanced Sphere Tracing

80 of 95

  • Distance Function を事前にサンプリングして近似モデルを生成

その他使えるかもしれないテクニック

81 of 95

  • 複雑で描画面積が多い Distance Function を想定
    • ≒フラクタル
  • 事前に Distance Function をサンプリングして近似モデルを用意
    • Marching Cubes 法やボクセルモデル化などで生成
  • 近似モデルを Depth のみ専用のバッファに出力
    • 遮蔽されるピクセルに Raymarching が走るのを避けるため
  • 出力された Depth を開始点として Raymarching

事前サンプリングによる近似モデル

82 of 95

  • 少ない Step 数でいい結果を得られる
  • モデルによっては描画 Pixel 数軽減も期待できる
  • 効果はあるが、運用が難しい
    • 事前モデル生成が面倒
    • カメラがモデルに突っ込んだら Fullscreen Quad に切り替える必要がある
      • 突っ込んだのをどうやって検出する?
      • CPU 側で Distance Function 計算?

事前サンプリングによる近似モデル

83 of 95

  • ポリゴンモデルとの混在は問題なく可能
  • パーツ分解によりある程度の編集の柔軟性を確保可能
    • エディタ上でパーツを食い合わせてシーンを構築
  • 工夫次第でかなり速くできる
    • ただし 速度:品質 のトレードオフは不可避
  • 局所的な用途に限れば十分実用レベル

ゲームへの応用: まとめ

84 of 95

  • 本公演の作例データなど (Unity 用プロジェクト)

ゲームへの応用: まとめ

85 of 95

正解するカド (©TOEI ANIMATION)

実プロダクションに使われた例

86 of 95

Questions?

87 of 95

ありがとうございました!

Follow us: @TokyoDemoFest

End

88 of 95

References

89 of 95

References

90 of 95

References

91 of 95

Bonus slides (Zavie)

92 of 95

サイズについて

Removed marching cubes algorithm

Improved shader compression�(ShaderMinifier)

Add back marching cubes + Poseidon statue

93 of 95

サイズについて

Party release at Revision�(April 2017)

__fastcall

New scene

94 of 95

Syntax highlighting?

  • Use meaningful colors.
  • Make the invisible visible.
  • Make the dangerous visible.

→ Local/global, variable/function, class/namespace, etc.

デバッグについて

95 of 95

デバッグについて

Macros!

(隠しコード)

Global!�(危ない所かも)

Namespaces�(外のコード)