説明しよう!マテリアルとはッ!

=前置き=

 以前に書いた説明しよう!シェーダーとはッ! - Master of Noneの続きのようなもの。シェーダまわりの学習を始めた頃は「マテリアルとテクスチャとシェーダの関係」や「ポリゴンとモデルの違い」もよくわからなかったのを思い出したので、そこらへんの説明を昔の自分がわかるように書いてみようと思う。

 前回と同様に粒度の粗い説明なので、これで大まかな概念を理解したらちゃんとした説明を読むと良いと思う。

=テクスチャ=

 テクスチャとは「画像」である。一般的にはtgaというファイル形式が多く使われるかと思うが、pngなど他の形式でもサポートされていれば使うことが可能である。とにもかくにも基本的には「テクスチャ=ただの画像」である。

 逆に言えばテクスチャは「画像以外のデータ」は持たない。アンビエントとかいうパラメータを持ったりしない、あくまで単なる画像である。

=ポリゴン=

 ポリゴンとは「頂点データのかたまり」である。これは以前の説明しよう!シェーダーとはッ! - Master of Noneで書いたように、頂点(=位置情報やテクスチャ座標などのデータ)によって主に三角形の頂点として並べる形で表現されたものになる。

 ポリゴンとテクスチャは別物である。これらが違うのはわかりやすいかと思うが、最終的な表示ではこのポリゴンにテクスチャを貼って表示しないといけない。これらの対応付けを行うのが次の「マテリアル」と「モデル」になる。

=マテリアル=

 マテリアルは「ポリゴンの表示方法を決めるアレコレをまとめたもの」である。ただ、ベースにあるのは「頂点シェーダ」と「ピクセルシェーダ」なので、基本的には「頂点シェーダとピクセルシェーダをまとめたもの」と考えると良い。

 マテリアルには「テクスチャ」だの「アンビエントカラー」だのを設定する場合があるが、これらはあくまで頂点シェーダやピクセルシェーダに渡して「このテクスチャで表示する」とか「アンビエントカラーはこれを使う」などの処理を行うためのものであり、「ピクセルシェーダで表示する色は全て黒」という風にシェーダ内で計算が完結していれば「テクスチャ」などの設定は不要である。

 逆に言えばマテリアルというのはシェーダなどによって設定するパラメータが決まるとも言える。テクスチャを2枚重ねて表示するシェーダを使うのであればマテリアルでテクスチャを2枚設定できる必要があるし、2つの色のグラデーションを使うのであれば2つの色を設定できる必要がある。(ちなみに色のグラデーションはポリゴンの頂点カラーの方で実現する方法もあるが、状況に応じて色を変化させる必要がある場合はマテリアル経由で変化させたりする)

 そういうわけで、マテリアルとは「ポリゴンの描画方法を(頂点シェーダとピクセルシェーダとそれらに必要なデータを保持することで)決めるもの」である。

=モデル=

 モデルは「ポリゴンとマテリアルをまとめたもの」である。

 マテリアルの中には「シェーダで必要なもの」として「テクスチャ」や「アンビエントカラー」などを保持しているが、「ポリゴン」は保持しない。なぜなら同じマテリアルで色んな形状のポリゴン(例えば色んな形の岩とか)を表示することがあり、そういう時は同じマテリアルを使いまわしつつポリゴンだけ別のものにできた方が都合が良いからだ。というわけで、マテリアルとポリゴンは分けられるのだが、表示の際にはくっつけておいた方が都合が良いので「モデル」という形でまとめる。これが一般的に表示するためのデータ一式となる。

=まとめ=

 まとめると、
 「テクスチャは画像である」
 「ポリゴンは頂点データをまとめたものである」
 「マテリアルはシェーダ(頂点シェーダ&ピクセルシェーダ)とそれらに必要なデータ(テクスチャなど)を保持するものである」
 「モデルはポリゴンとマテリアルを保持するものである」
 という感じ。

 特にマテリアルの理解が難しいかと思うが、シェーダ2つを起点にすればわかりやすいかと思う。

 ポリゴンとモデルの違いは上記の通りで「モデルはポリゴンとマテリアルを内包する」という感じなので、モデルはポリゴンよりも上のレイヤーの概念となる。

 「アンビエントカラー」とかはマテリアルと一緒に目にすることが多いのでマテリアル特有のものに見えるかもしれないが、これはあくまで「マテリアルで設定できるようにピクセルシェーダの外に出したパラメータ」であり、基本的にはシェーダ内で完結するものだ。

 あとは「テクスチャ=画像」と書いたものの、それは必ずしも「表示される画像」というわけではなくて「法線マップ」などの「特殊な画像」だったりもする。ここらへんについてはここでは書かないので、3D描画まわりの別サイトなり書籍なりを参考にしてもらえばと思う。そしてその場合もRGBの扱いが違うだけでデータ形式としては画像であるのは間違いない。