ゲームアプリの数学@GREE GameDevelopers' Meetup

45
ゲームアプリの数学 @GREE GameDevelopers' Meetup 2015-12-16 久富木 隆一 (Ryuichi KUBUKI)

Transcript of ゲームアプリの数学@GREE GameDevelopers' Meetup

ゲームアプリの数学

@GREE

GameDevelopers'

Meetup2015-12-16

久富木隆一 (Ryuichi KUBUKI)

Who Am I?

久富木隆一 (Ryuichi KUBUKI @ryukbk )

『ゲームアプリの数学』著者

グリーでゲームアプリ開発の仕事をしています

師走のお忙しい中お越しいただき誠にありがとうございます

「勉強会って勉強になるの?」というメタな問題提起は近年ありがち

個別具体的知識や「銀の弾丸」を得るというより、共感と刺激に遭遇する場所としての勉強会

同業他者/他社の動向

まだアセットダウンロードで消耗してるの?

専門の外へのエントリーポイント

今日お話すること

1. 『ゲームアプリの数学』テーマ

2. 『ゲームアプリの数学』番外編

3. 2020年のゲーム開発者

この3つが必ずしも分離しているわけではなく説明が前後するかも

本スライドは後ほどSlideShareへアップロードされます

http://www.slideshare.net/ryukbk

問題意識

ゲーム開発者という専門職業を差別化し成り立たせているものは何か

ゲーム開発者という職に就きたい人々の障害となりうるものは何か

ゲーム開発上の障害をソフトウェアで解決するミドルウェア/エンジン(Unity

他)は何を担っているか/いないか

書籍『ゲームアプリの数学 Unityで学ぶ基礎からシェーダーまで』

左: 大型本右: Kindle版SBクリエイティブ刊

第1章三角関数第2章座標系第3章ベクトル第4章行列第5章座標変換第6章クォータニオン第7章曲線第8章ゲームアプリの環境第9章シェーダー

『ゲームアプリの数学』概要

現代の2D/3Dゲーム開発に必要な数学要素を簡潔に解説

1-4章: 前半の山である5章-座標変換(3D

ジオメトリー処理)の構成要素

1-8章: 後半の山である9章-シェーダー(GPUでのジオメトリー/フラグメント並列処理)の構成要素

ベクトル、行列、クォータニオンの定義と演算(API)

1章: 紀元前から17世紀、2-6章: 19世紀、7-9章: 20世紀

第1章三角関数第2章座標系第3章ベクトル第4章行列第5章座標変換第6章クォータニオン第7章曲線第8章ゲームアプリの環境第9章シェーダー

『ゲームアプリの数学』概要

7章曲線: ジオメトリーの、アルゴリズムによる手続き生成

(procedural generation)

8章: リアルタイム3Dグラフィックストレンド、GPUアーキテクチャーの歴史、(モバイル)システムアーキテクチャー、グラフィックスパイプライン解説により、GPU上の並列プログラミングの文脈と前提知識を補充

第1章三角関数第2章座標系第3章ベクトル第4章行列第5章座標変換第6章クォータニオン第7章曲線第8章ゲームアプリの環境第9章シェーダー

『ゲームアプリの数学』概要 座標変換、クォータニオンによる3D回転、Bスプラインなど、あまり解説されない要所の数式は、実用性抜きで途中を省略せず、くどいほどに記載

数学レベルはほぼ高校数学の復習。3D座標変換は大学の線形代数の応用。物理演算や計算幾何学は現代のゲームエンジンでは物理/オクルージョンカリングミドルウェアのAABBツリー等で担保されており扱わない

数学の外側の、現代のゲーム開発哲学/デザインパターン/開発ツール/実行環境についても学べる

「テクスチャーは大きなデータブロブをシェーダープロセッサーで扱うための道具である」等の気付きや肌感を伝えたい

『ゲームアプリの数学』概要// vertex shader

void main() {

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

}

// fragment shader

void main() {

gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);

}

この最も単純なシェーダープログラムが何を意味しているかの解説に書籍の大部分は割かれている

なぜシェーダーなのか?

ゲームエンジンが公開する低レベル操作のための標準的エントリーポイント

ゲームで次のステージへ進むための装置としてのボスに(何故か)存在する弱点を攻めるように、シェーダーの攻略が作品の完成度を左右し、差別化ポイントになる(といいなあ)

アーティストとエンジニアをつなぐ、アートとテクノロジーの共通言語としてのシェーダー

GPU並列プログラミングへのいざない

「でも、お好きなんでしょう? シェーダーとか低レベルとか」

「でも、お好きなんでしょう? シェーダーとか低レベルとか」

「んなこたーない」

『ゲームアプリの数学』テーマ

なんでもかんでも独自実装を重んじる意識高い原理主義の礼賛はしない

研究者ではない開発者にとって、結果につながらない無用の仕事を作ることは罪ですらある(自分は良くても人のことを考えよう)

オレオレフレームワークや難解なシェーダーを書いたチームメンバーが退職した、さあどうする?

トラブルシューティングに、数学や基本原理の知識は有用

備えあれば憂いなし、転ばぬ先の杖。自衛のためには、強くなるしかない

『ゲームアプリの数学』テーマ

ゲームエンジン(という名の他者のコードベースアセット)との共存

技術評価や、ゲームエンジンが期待しない動作をした場合の問題解決にも、動作原理や設計思想の知識は活きる

8割の作業は便利なゲームエンジンなどのツールに任せつつ、2割の重要な部分に開発リソースを集中できるように

『ゲームアプリの数学』テーマ

Wikipedia: 無限の猿定理(infinite monkey theorem)

制約なく十分長い時間をかければ猿でも作品を書ける

エンジニアのアイデンティティ

問題解決者

(アーティストにはアーティストの、言語化出来ない高次のロジック/ディシプリンが有るかもしれない)

エンジニアは、有限の時間の中で、明瞭な規則を表すアルゴリズムで問題を解く

『ゲームアプリの数学』テーマ

数学は普遍的な形式言語である

廃れない

どこの国の誰でもプログラムが書ける時代、できることは多い方がよい

汎用でつぶしがきく(VR、ロボット、etc.)

商業エンターテインメントの世界は厳しい

面白いものを作れないプランナーは存在意義ゼロ

一方で、技術は積み上げていける

『ゲームアプリの数学』テーマ

ざっくり言って

3D空間の3角形/ポリゴンを2Dに変換、ラスタライズ

2Dのフラグメント(ピクセル)に色を塗る

その間に三角関数やベクトルや行列を多用

主役はGPU

そんな感じです

以上が書籍のテーマ

閑話休題

ここからは番外編

『ゲームアプリの数学』番外編

3角形の処理が基本の、大原則はわかった

3D空間の3角形/ポリゴンを2Dに変換、ラスタライズ

2Dのフラグメント(ピクセル)に色を塗る

その間に三角関数やベクトルや行列を多用

主役はGPU

他のやりかたはないの?

『ゲームアプリの数学』番外編

他のやりかた… あるんです!

3D空間の3角形/ポリゴンを2Dに変換、ラスタライズ

2Dのフラグメント(ピクセル)に色を塗る

その間に三角関数やベクトルや行列を多用

主役はGPU

ポリゴンなき異世界の3D表現

『ゲームアプリの数学』番外編

レイトレーシング(ray tracing)拡散反射光による大域照明で写実的表現

レンダリング方程式を(近似的に)解き、光と物体の交差を判定

ラジオシティ

モンテカルロ・パストレーシング

フォトンマッピング

ゲームのようなリアルタイム処理には計算負荷が高すぎるCornell box by Henrik Wann Jensen

もっと楽なのないの?

…あるんです!

『ゲームアプリの数学』番外編

レイマーチング(ray marching)バーテックスシェーダーは使わずフラグメントシェーダーのみ使う

ポリゴンメッシュではなく、数式である距離関数(distance

function)を基礎部品(プリミティブ)として物体の形状(ジオメトリー)を定義。ストレージやメモリー空間を占有しない

視点から、光線の先端を、一定間隔ずつ繰り返し進める(march)

光線の座標をパラメーターとして与えた距離関数の値が十分に小さくなったら物体に衝突したとみなす

レンダリング方程式を解く(解析的交差判定)のにあまり頑張らなくてもOK!

『ゲームアプリの数学』番外編float sdSphere( vec3 p, float s )

{

return length(p) - s;

}

float sdBox( vec3 p, vec3 b )

{

vec3 d = abs(p) - b;

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

}

float opS( float d1, float d2 )

{

return max(-d2,d1);

}

vec2 opU( vec2 d1, vec2 d2 )

{

return (d1.x<d2.x) ? d1 : d2;

}

距離関数(distance function)と、そのブーリアン演算で、ジオメトリーのプリミティブを表現

Raymarching – Primitives

by Íñgo Quílez

http://iquilezles.org/www/articles/distfunct

ions/distfunctions.htm

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

『ゲームアプリの数学』番外編

CSG(Constructive Solid Geometry)

Wikipedia: Constructive Solid Geometryプリミティブとそのブーリアン演算でオブジェクトを作成ただし対応しているモデリングツールは多くない

レイマーチング、一定間隔ずつ行進って、当てずっぽうかよ!

もう少しなんかないの?

…あるんです!

『ゲームアプリの数学』番外編

符号付距離場(signed distance field, SDF)

全ての点について最も近い物体表面への距離を正の値(物体の外側)か負の値(内側)

で記録

3D空間なら3Dテクスチャーに保存できる

レイマーチングにSDFを併用すると、一定間隔ではなくSDFの値ずつ行進(=sphere

tracing)できるので、効率が良い

ただしSDF自体はストレージ領域やメモリー空間を占有するPer-Pixel Displacement Mapping with Distance Functions

By William Donnelly, GPU Gems 2, 2005

『ゲームアプリの数学』番外編

SDFはフォントレンダリングにも応用

Improved Alpha-Tested Magnification for Vector Textures

and Special Effects, Chris Green, Valve, SIGGRAPH 2007

SDFとGPUによる補間で高解像度の元フォント画像並の縁の滑らかさを再現

解像度毎に複数枚のフォントテクスチャーを用意する必要がなく、1枚のSDF

テクスチャーで済み、メモリーの節約

有名UnityアセットText Mesh ProもSDF対応

Google ChromeのレンダリングエンジンSkiaでもSDFによるフォントレンダリングに対応

https://github.com/google/skia/blob/master/gm/dftext.cpp

『ゲームアプリの数学』番外編

さらにその先へ – SDFをも手続き生成

レイマーチングの第一人者Iñigo

Quilezによる2008年の発表

数式とフラグメントシェーダープログラムを絵筆のように使い、手続き生成によって複雑な3D

シーンを4KBのデモに納める

古くに存在したヨーロッパのデモシーンでは細い回線でドヤるための手段として華やかなCGデモをいかに小さなプログラムで表現するかが競われた

Rendering Worlds with Two Triangles

with raytracing on the GPU in 4096 bytes

by Iñigo Quilez, NVSCENE 2008

なんかゲームに関係あるの?

…あるんです!

『ゲームアプリの数学』番外編

ハイブリッドレンダリングデモシーン出身でSCEに在籍していた

Matt Swobodaによる手続き生成やSDFについての2012年の発表での、将来のレンダリングパイプライン予想

メインのキャラクター表示は依然としてポリゴンをラスタライズ

照明や反射といった効果はレイトレーシングなどの手法を限定的に低精度で採用へ

Advanced Procedural Rendering in DirectX 11

by Matt Swoboda, SCEE, GDC 2012

『ゲームアプリの数学』番外編

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

ディスタンスフィールドアンビエントオクルージョン

SDFを使い、環境光の届かない場所に陰を生成

レイトレースディスタンスフィールドソフトシャドウ

SDFを使い、動的なレイトレースされたソフトな影を生成

『ゲームアプリの数学』番外編

Advances in Real-Time Rendering in Games @ SIGGRAPH 2015

AAAゲームを開発する有名開発会社の最高峰をなす面々による、現代のゲームにおけるグラフィックスレンダリングに関する10のセッション

『ゲームアプリの数学』番外編

Advances in Real-Time Rendering in Games @ SIGGRAPH 2015

10のセッションのうち7つがレイマーチングまたはSDFについて言及

『ゲームアプリの数学』番外編 Learning from Failure: a Survey of Promising, Unconventional and Mostly Abandoned

Renderers for ‘Dreams PS4’, a Geometrically Dense, Painterly UGC Game’,

Alex Evans (MediaMolecule), SIGGRAPH 2015

VR空間でユーザーがキャラクターを彫刻して作るPS4タイトル”Dreams”に向けた3年間のR&Dにおける試行錯誤の軌跡

ポリゴンメッシュのラスタライズは無く、CSGのシーンからコンピュートシェーダーで生成したSDFを点の集合(point cloud/splat)

に変換した点描でオブジェクトを表現

ハイブリッドではない、真の次世代ゲームグラフィックスレンダリングを実現

『ゲームアプリの数学』番外編

真の次世代ゲームグラフィックスレンダリングって何?

ポリゴン\(^o^)/オワタ…なのか?

『ゲームアプリの数学』読んで一生懸命3Dとかポリゴンメッシュとか勉強したのにどうしてくれるんですか

1995-2020、4半世紀。思えば短い命だったラスタライザー

『ゲームアプリの数学』番外編

大丈夫だ、問題ない

コンソールでポリゴンが無くなるのは相当先

モバイルでポリゴンが無くなるのはさらに先

ラスタライザーが死んでも数学は死なない

ゲームエンジンが身代わりになってくれる

きっと未来は明るい – 2020年のトレンドは?

2020年のゲーム開発者

CPUとGPUの融合 - ソフトウェアレンダリングへの回帰

ハードウェア性能の向上ほどにはゲームの予算はスケールしないので生産性向上は重要な課題

生産性を上げるためには性能を犠牲にするべき

THE END OF THE GPU ROADMAP

Tim Sweeney, HPG 2009

2020年のゲーム開発者

生産性向上の鍵 – アルゴリズムによる手続き生成

PS4タイトル”No Man’s Sky”は、無数の惑星を全て自動生成

棲息する生物はSuperformulaと呼ばれる曲線の数式を元に生成する

No Man’s Sky

Hello Games, 2016

Wikipedia:

Superformula

2020年のゲーム開発者

大域照明や流体物理といった重い挙動を、限られたシーン内ながら機械学習でそれらしく真似られるようになる

特徴ベクトルを既存の方程式を使って最適にデザインしているのもそのうちディープラーニングで不要になるかも

Global Illumination with

Radiance Regression Functions, 2013

Data-driven Fluid Simulations using Regression Forests, 2015

アルゴリズムなんて造れない? なら機械にやらせればいいじゃない

2020年のゲーム開発者

そのころモバイルでは…

iPhone 1発売の翌年2008年に、AppleはiPhoneを挿して使うVR HMDを特許出願し、2015年に特許取得しているApple wins patent for a head-mounted

iPhone virtual reality display

2018年のiPhone 8ではVRに適したOLEDが採用されるらしい

2010年のiPhone 4から2015年のiPhone 6sは浮動小数点演算性能(FLOPS)では30倍の開きがあり、2015-2020年でもそれくらい伸びるかも

モバイルでもコンピュートシェーダー活用の機運が高まる!

結び

「それさえ頭に入れておけば知の世界を自由に渉猟できるような明快な地図が描きたかった」(浅田彰、2013)

海外の映画や音楽を楽しむために英語を学ぶように、あなた自身がゲームの世界を真に楽しむために数学の言葉を学んではいかがか

Thank You

2016年も何卒よろしくお願い申し上げます