Mobile Game Math Unity

OTHER
by ryukbk

The sample code for the game math book (https://www.amazon.co.jp/dp/4797384263) by Ryuichi KUBUKI

( Crawled an hour ago )
+

# ゲームアプリの数学 サンプルコード

本gitレポジトリーは『ゲームアプリの数学 Unityで学ぶ基礎からシェーダーまで 』(久富木 隆一 著/SBクリエイティブ 刊)のためのサンプルコードならびに著者により更新されるサポート情報を保持します。

上記書籍は、本サンプルコードへの必要十分な注釈を含んでいます。書籍を手元に置いて参照しつつ、Unityで本サンプルコードを動かしたり、あるいは自由に改変したりして、動作結果を視覚的に確認することにより、書籍の内容を直感的に理解し応用につなげることができます。

本ページと合わせ、正誤表他の情報が記載されたSBクリエイティブ社サポートページも参照ください。

更新履歴

  • 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 初版

動作環境

ダウンロード

最新のサンプルコードは本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章
    • クォータニオンはwxyzの4つの数値の組として表現されますが、回転のために用いる正規化されたクォータニオンであれば、大きさが1でありが成立することを利用して3つの数値があれば残り1つの数値を求められるため、精度を落としてwの符号をいずれかの数値内のビットに保存するなどの処理を入れれば3つの数値の組としてさらにコンパクトな形式で保存できます。
    • 正規化されたクォータニオンの逆数を与えて回転すると、元のクォータニオンによる回転の逆回転となります。サンプルコード中のQuaternion.Inverseは、引数として与えた正規化されたクォータニオンの逆数を返します。
  • 第7章
  • 第8章
    • TBDRのメリット/デメリットについては、同じ章で後に存在するグラフィックスパイプライン解説の読後に再度読んでみてください。
    • 遅延シェーディングは、第9章で触れているマルチパスレンダリングを行っています。Gバッファーの作成までがpass 1、Gバッファーを用いて行われる(pass 1ではあえて行わずに次のpassまで遅延された)照明計算がpass 2です。
  • 第9章
    • 4次元ベクトルを表す型vec4xyzwの4つのメンバー変数を持つ構造体であり、packednormalはビットマップの1ピクセルを表すvec4で、RGBA各チャンネルを各メンバー変数に格納しています。つまりpackednormal.wにA(アルファ)が、packednormal.yにG(緑)が入っているので、スウィズル演算子wyを使い、wyvec2として抜き出して展開します。
    • サンプルコードのChapter09シーンに以下2点の仕様を追加
      1. シーン再生時に光源を回転
      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指定してフラグメントシェーダー内に定義しフラグメントシェーダーへの入力とします。

FAQ

  • 随時更新

著者講演資料

著作権表示/ライセンス

(C) 2015 Ryuichi KUBUKI (久富木 隆一)

本サンプルコードはCC BY-NC-SA/Creative Commons Attribution Non-Commercial Share-Alike 4.0でライセンスされています。

The contents of this repository are licensed under CC BY-NC-SA/Creative Commons Attribution Non-Commercial Share-Alike 4.0.

著者連絡先