本gitレポジトリーは『ゲームアプリの数学 Unityで学ぶ基礎からシェーダーまで 』(久富木 隆一 著/SBクリエイティブ 刊)のためのサンプルコードならびに著者により更新されるサポート情報を保持します。
上記書籍は、本サンプルコードへの必要十分な注釈を含んでいます。書籍を手元に置いて参照しつつ、Unityで本サンプルコードを動かしたり、あるいは自由に改変したりして、動作結果を視覚的に確認することにより、書籍の内容を直感的に理解し応用につなげることができます。
本ページと合わせ、正誤表他の情報が記載されたSBクリエイティブ社サポートページも参照ください。
- Unity 5.5.0 f3 以降
- Unity 5.3.4以前でサンプルを実行したい場合はUnity_5.3.4ブランチを取得して下さい。
- Unity 5.2.x以前でサンプルを実行したい場合はUnity_5.2ブランチを取得してください。
- Microsoft Windows 7 以降
- Mac OS X 10.10 以降
- Unityは、Unity Technologies社のwebサイトから無料のPersonal Editionを選択してダウンロードし、インストールしてください。
- 本サンプルコードは上記バージョンのUnityでの実行を前提としているため、それ以前のバージョンのUnityを同一マシン上で利用しなければならない場合は、異なるバージョンの同時インストールの項目に従いUnity複数バージョンの共存環境を作成してください。
最新のサンプルコードは本gitレポジトリーのmasterブランチに収録されています。
以下のいずれかの方法でサンプルコードを取得してください。
- 本レポジトリーのメニュー内の"Download ZIP"ボタンから一括ダウンロード
- gitクライアントでローカルPCへ本レポジトリーをclone
- githubアカウント所持者であれば、本レポジトリーを自己レポジトリーへfork
- sampleフォルダー内にサンプルコードのUnityプロジェクトが存在し、中のAssetsフォルダーにプロジェクトを構成するファイル群が含まれます。
- Editor: Unity Editor拡張
- Meshes: インポート元3Dメッシュ
- Resources: マテリアル
- Scenes: Unityシーン
- Scripts: C#スクリプトコンポーネント
- Shader: GLSLシェーダープログラム
Unityで、Unityプロジェクトとしてsampleフォルダーを開き、シーン再生ボタンを押下してください。
書籍出版後に判明した本文中の誤記とその訂正は、SBクリエイティブ社サポートページ正誤情報に掲載しておりますので、お問い合わせ前にご確認ください。
-
前書き
- 代表的なDCCツールとしてAutodesk Mayaを挙げていますが、他に、無料でオープンソースの3DモデリングツールとしてBlenderが有名です。
-
第5章
- サンプルコードのプロジェクトでは、Unity EditorメニューのFile | Build Settings | Player Settings | Graphics API for Windowsの設定は、デフォルトではOpenGL系レンダラーであるOpenGLES3が最上位で最優先と設定されているため、Windows上でもOpenGL系のプロジェクション変換行列となります。Direct3D9レンダラーを最上位に設定すると、本文133ページのプロジェクション変換行列となります。
- Unity 5.5からの変更点(Shaders: Z-buffer float inverted)として、Graphics API for Windows設定でDirect3D11レンダラーを最上位に設定した場合、従来のDirect3D9レンダラーと異なり、プロジェクション変換行列Pのz軸範囲が[1, 0]に写像されるようになります。これに伴い、本文133ページのWindows上でのプロジェクション変換行列の3行3列は、3行4列はとなります。同様に、144ページでのDirect3D向けのz軸範囲の写像しなおしも、最新サンプルコードはDirect3D11レンダラー上では[1, 0]になるよう処理を行います。
for (int i = 0; i < 4; i++) { pm[2, i] = pm[2, i] * -0.5f + pm[3, i] * 0.5f; }
Unity 5.5でのDirect3D11レンダラーの変更は、本文234ページで触れているデプス(深度)バッファー/Zバッファーの精度を、(Direct3D 9では利用できなかった)浮動小数点精度を用いて向上させるとともに、reverse-Zとして知られる[1, 0]への写像により遠景部分で精度を向上させるものです。精度向上のためのテクニックとして、他に対数デプスバッファー(Logarithmic Depth Buffers)があります。
-
第6章
-
第7章
- 本文181ページの曲線当てはめは、本文168ページで紹介しているスケルタルアニメーションを実現するために、キーフレームアニメーションの元データをCatmull-Romスプラインのような曲線アルゴリズムで近似することによりデータ量を圧縮するのに利用されることがあります。
-
第8章
- TBDRのメリット/デメリットについては、同じ章で後に存在するグラフィックスパイプライン解説の読後に再度読んでみてください。
- 遅延シェーディングは、第9章で触れているマルチパスレンダリングを行っています。Gバッファーの作成までがpass 1、Gバッファーを用いて行われる(pass 1ではあえて行わずに次のpassまで遅延された)照明計算がpass 2です。
-
第9章
- 4次元ベクトルを表す型
vec4
はx
、y
、z
、w
の4つのメンバー変数を持つ構造体であり、packednormal
はビットマップの1ピクセルを表すvec4
で、RGBA各チャンネルを各メンバー変数に格納しています。つまりpackednormal.w
にA(アルファ)が、packednormal.y
にG(緑)が入っているので、スウィズル演算子wy
を使い、w
とy
をvec2
として抜き出して展開します。 - サンプルコードのChapter09シーンに以下2点の仕様を追加
- シーン再生時に光源を回転
- 有名な3Dモデルである、Utar teapotと、スタンフォード大学のHappy Buddhaを、Blenderにインポート。Blender上で以下改変を適用してWavefront objフォーマットでエクスポートし、Unityのシーン内に配置
- オリジナルのマテリアルを削除
- サブメッシュをjoin
- メッシュ内の三角形の数が16ビットで表現できない数値(65535)以上であるとUnityでのインポート時にサブメッシュに分割されるため、Decimate ModifierでFace Countを65534以下に削減
- Unity 5.3.5以降では、シェーダープログラム内でのモデル変換行列
_Object2World
の定義が、UnityCG.glslinc内では廃止されていますので、シェーダープログラムを書く際には、代わりに新しく定義されたunity_ObjectToWorld
を使用して下さい。(本レポジトリー内でのサンプルコードでは、_Object2World
が定義されていない場合はunity_ObjectToWorld
を用い_Object2World
を別名として定義するようにしています。) - Unity 5.5では、MacでのグラフィックスAPIとしてはPlayer Settingsでの設定ではOpenGLCoreのみ選択できOpenGL2が廃止されています。従って、Mac向けにGLSLシェーダープログラムを動作させるためにはOpenGLCoreがサポートするGLSL 1.30に従って書く必要があります。GLSL 1.30では
varying
変数は廃止されており、代わりに、バーテックスシェーダーで出力する変数はout
指定してバーテックスシェーダー内に定義し、同名の変数をin
指定してフラグメントシェーダー内に定義しフラグメントシェーダーへの入力とします。
- 4次元ベクトルを表す型
- 随時更新
- ゲームアプリの数学@Unity Rendering Wizardの集い
- 2015年10月22日渋谷dots.で開催されたUnity Rendering Wizardの集いでのLT資料です。
- ゲームアプリの数学@プログラマのための数学勉強会
- 2015年11月21日渋谷dots.で開催された第5回 プログラマのための数学勉強会 #maths4pgでのLT資料です。
- ゲームアプリの数学@GREE GameDevelopers' Meetup
- 2015年12月16日六本木ヒルズのグリー株式会社で開催されたGREE GameDevelopers' Meetup 02 #greegdm02での講演資料です。書籍『ゲームアプリの数学 Unityで学ぶ基礎からシェーダーまで』の紹介、番外編(レイトレーシング/レイマーチング/SDFなど、ラスタライズを行わない非ポリゴンベースの3Dグラフィックスの紹介)、ゲーム開発の未来展望(手続き生成、機械学習/ディープラーニング、モバイルVRなど)から成ります。
本サンプルコードはCC BY-SA/Creative Commons Attribution Share Alike 4.0でライセンスされています。
- 2017-01-22 第5章サンプルコードDirect3D11向け修正。第5章、第7章補遺追加
- 2017-01-07 Unity 5.5/5.4サポート(Unity 5.5.0f3)、_Object2World、varyingについて補遺追加
- 2015-12-18 著者講演資料追加
- 2015-12-18 Unity 5.3サポート(Unity 5.3.0f4)
- 2015-12-18 Unity 5.2向けブランチ追加(Unity_5.2)(Unity 5.2.4f1)
- 2015-09-29 補遺追加
- 2015-09-26 補遺追加
- 2015-09-22 補遺追加
- 2015-09-19 初版