いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : マテリアル、メッシュ、シェーダの関係まとめ

3Dゲーム作る上で避けて通れない、表題のモノたちが一体なんなのか軽くまとめてみました。

docs.unity3d.com

マテリアル

実のところ一番ふわふわして分かりにくいのがこの マテリアル だと思います。

マテリアルは以下の情報を保持しています。

  • テクスチャ
    表面のベース模様となる画像
  • 表面の色
    テクスチャとブレンドされる
  • テカリ具合、荒れ具合
    光の反射などのパラメータ。ハイライトの入り方などに影響します
  • シェーダー
    後述
  • シェーダに設定するカスタムプロパティ
    シェーダによって、描画に必要な特殊なプロパティがあります。

マテリアルが持っているプロパティを変更することで、同じシェーダでもマテリアルごとに描画内容を変えることができます。インスペクタから設定変更可能です。

よく「質感を表現する」のがマテリアルと言いますが、シェーダに渡すデータを持っておくモノだとも言えます。

Unity - スクリプトリファレンス: Material

メッシュ

いわゆる ポリゴン(三角形)の集まりで、3Dモデルの表面の形 を表します。

メッシュは以下のような情報を持っています。

  • 頂点
    ポリゴンを構成する三角形の元となる、三次元座標のリストです。(Vector3の配列)
  • 三角形のリスト
    頂点のリストから三つをとって一つの三角形を構成しており、その三角形のリスト(三頂点を1セットとした配列)を保持しています。実際には int 型の配列で、座標ではなく 頂点配列に対するインデックス値 で保持しています。3頂点ごとに直列に入っているようです。
  • テクスチャのUV座標
    テクスチャと頂点の位置関係を保持する配列です。Vector2型で、0から1の少数で持っています。
  • サブメッシュ
    一つのメッシュは複数のサブメッシュから構成されます。サブメッシュの三角形リストは、GetTrianglesメソッドで取れます。マテリアルが複数 つけられている場合は サブメッシュが複数 あるということです。

シーンに配置する際はMesh Filter がメッシュの参照を持ち、Mesh Rendererに渡して描画されます。

f:id:sugar_affordance:20161223235554p:plain

Unity - マニュアル: メッシュ

Unity - スクリプトリファレンス: Mesh

スキンメッシュ

https://docs.unity3d.com/jp/current/Manual/class-SkinnedMeshRenderer.html

スキンメッシュは通常のメッシュとは違い、 ボーン と呼ばれる仕組みを持っています。

ボーンとはその名のとおり骨組みのことです。

人物モデルなどの衣服の動きなどが不自然にならないように、ボーンが動いたときにメッシュがどう動くか重み付けをする ことで、自然なアニメーションができるようになります。

f:id:sugar_affordance:20161223235617p:plain

シーンに配置する場合は通常のメッシュと違い、MeshFilterは作成されません。
SkinnedMeshRenderer自体がメッシュの参照を持っています。

f:id:sugar_affordance:20161223235654p:plain

シェーダー

画面への描画を受け持つのが シェーダー です。

メッシュ情報(頂点、三角形)、テクスチャ、マテリアルのデータを受け、OpenGL(やDirectX)の命令群にしてGUIに発行する のがシェーダーの仕事となります。

また、ライティングの効果をつけるのもシェーダの役割です。(ライト情報はUnityから自動で渡されているぽい?)

関係性を図にしてみた

マニュアルから読み取った関係性を、自分なりに整理して図にしてみました。(間違ってたらごめん)

メッシュ(ボーンなし)の描画

f:id:sugar_affordance:20161223235744j:plain

メッシュ(ボーンあり)の描画

f:id:sugar_affordance:20161223235826j:plain


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。