3Dゲーム作る上で避けて通れない、表題のモノたちが一体なんなのか軽くまとめてみました。
マテリアル
実のところ一番ふわふわして分かりにくいのがこの マテリアル だと思います。
マテリアルは以下の情報を保持しています。
- テクスチャ
表面のベース模様となる画像 - 表面の色
テクスチャとブレンドされる - テカリ具合、荒れ具合
光の反射などのパラメータ。ハイライトの入り方などに影響します - シェーダー
後述 - シェーダに設定するカスタムプロパティ
シェーダによって、描画に必要な特殊なプロパティがあります。
マテリアルが持っているプロパティを変更することで、同じシェーダでもマテリアルごとに描画内容を変えることができます。インスペクタから設定変更可能です。
よく「質感を表現する」のがマテリアルと言いますが、シェーダに渡すデータを持っておくモノだとも言えます。
メッシュ
いわゆる ポリゴン(三角形)の集まりで、3Dモデルの表面の形 を表します。
メッシュは以下のような情報を持っています。
- 頂点
ポリゴンを構成する三角形の元となる、三次元座標のリストです。(Vector3の配列) - 三角形のリスト
頂点のリストから三つをとって一つの三角形を構成しており、その三角形のリスト(三頂点を1セットとした配列)を保持しています。実際には int 型の配列で、座標ではなく 頂点配列に対するインデックス値 で保持しています。3頂点ごとに直列に入っているようです。 - テクスチャのUV座標
テクスチャと頂点の位置関係を保持する配列です。Vector2型で、0から1の少数で持っています。 - サブメッシュ
一つのメッシュは複数のサブメッシュから構成されます。サブメッシュの三角形リストは、GetTrianglesメソッドで取れます。マテリアルが複数 つけられている場合は サブメッシュが複数 あるということです。
シーンに配置する際はMesh Filter がメッシュの参照を持ち、Mesh Rendererに渡して描画されます。
スキンメッシュ
https://docs.unity3d.com/jp/current/Manual/class-SkinnedMeshRenderer.html
スキンメッシュは通常のメッシュとは違い、 ボーン と呼ばれる仕組みを持っています。
ボーンとはその名のとおり骨組みのことです。
人物モデルなどの衣服の動きなどが不自然にならないように、ボーンが動いたときにメッシュがどう動くか重み付けをする ことで、自然なアニメーションができるようになります。
シーンに配置する場合は通常のメッシュと違い、MeshFilterは作成されません。
SkinnedMeshRenderer自体がメッシュの参照を持っています。
シェーダー
画面への描画を受け持つのが シェーダー です。
メッシュ情報(頂点、三角形)、テクスチャ、マテリアルのデータを受け、OpenGL(やDirectX)の命令群にしてGUIに発行する のがシェーダーの仕事となります。
また、ライティングの効果をつけるのもシェーダの役割です。(ライト情報はUnityから自動で渡されているぽい?)
関係性を図にしてみた
マニュアルから読み取った関係性を、自分なりに整理して図にしてみました。(間違ってたらごめん)
メッシュ(ボーンなし)の描画
メッシュ(ボーンあり)の描画