SlideShare a Scribd company logo
ゲームアプリの数学
@GREE
GameDevelopers'
Meetup
2015-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年も何卒よろしくお願い申し上げます

More Related Content

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