補遺B

OpenGLマトリクスフォーマット


マトリクス、ビデオ、そしてOpenGL

OpenGLは、数値のリストを2Dイメージに変える仮想マシンの標準的な仕様です。そのリストは、線やポリゴンをつなげる頂点の3D位置を含むことができます。また、それらは、テクスチャマッピングのための座標、ライティングに対する法線、色、エッジフラグのような他のデータを含むこともできます。

Jitterは、一般的なマトリクスシステムで処理可能なタイプのデータとしてビデオを扱います。Jitterでビデオデータを操作するとき、マトリクスの各セルは一つのピクセルを表します。マトリクスの4つのプレーンは、そのピクセルのA、R、G、B要素を格納します。これは、ビデオを格納するためのJitterの約束ごとです。

また、JitterはマトリクスにOpenGL互換画像の内容を格納するにあたって、GLグループのすべてのオブジェクトに使われる約束ごとがあります。データの内容はビデオデータのように様々なオブジェクトで読み出され、処理され、出力されることが可能です。このドキュメントではマトリクスへのOpenGLデータの格納や、それらのマトリクスを含むjit.gl.renderオブジェクトへのメッセージ構文におけるJitterの約束ごとを記述します。

このリファレンスを必要とするとき

GLグループのオブジェクトは、そのmatrixoutputアトリビュートに1が設定されたときに、ここで説明するフォーマットでマトリクスを出力します。あなた自身のパッチを通してこれらのジオメトリを処理するためには、このフォーマットを知っておく必要があるでしょう。もし、jit.opや他のマトリクス演算子を直接利用してジオメトリを作りたい場合もそのフォーマットを知っておく必要があるでしょう。しかし、あなたの描画ニーズにJitterのGLグループオブジェクトで充分なら、OpenGLマトリクスのフォーマットに関する知識が何もなくても、これらのオブジェクトをシーンの裏方にして描画させ続けることができます。


GLマトリクスリファレンス

メッセージフォーマット

OpenGLデータは、

jit.matrix [geometry matrix]
jit.matrix [geometry matrix] [draw primitive]
jit.matrix [geometry matrix] [connections matrix] [draw primitive]

というMaxメッセージ形式でjit.gl.renderオブジェクトを通ることができます。

描画プリミティブ

描画プリミティブは、ジオメトリマトリクスの頂点間のつながりをどのように描画するかを指定します。ジオメトリマトリクスがjit.gl.renderオブジェクトを描画プリミティブ無しで通るとき、jit.gl.renderオブジェクトのカレント(現在の)プリミティブが使われます。カレントプリミティブは、単にプリミティブだけを含むメッセージを送ることによって変更されます。ジオメトリクスマトリクスと描画プリミティブが一緒の場合、その描画プリミティブはそのジオメトリを描画するためだけに使われ、カレントプリミティブは変更されません。

描画プリミティブには、次のものがあります:

points 各頂点を単独の点として描画します。
lines 頂点をペアに分けて線でつなぎます。頂点A、B、C、Dがあるジオメトリマトリクスでは、線分ABとCDを描画します。
line_strip 頂点のペア毎に線でつなぎます。頂点A、B、C、Dがあるジオメトリマトリクスでは、線分AB、BC、CDを描画します。
line_loop line_stripに似ていますが、マトリクスの最後の頂点と最初の頂点がつながって線分が描画されます。
triangles 離れた三角形を描画します。頂点A B C D E Fが与えられれば、三角形ABCとDEFを描画します。
tri_strip つながった三角形の細片を描画します。頂点A B C D E Fが与えられれば、三角形ABC、CBD、CDE、EDFを描画します。頂点の順番に注意してください。すべての三角形の表面が同じ方向を向くように頂点の順番が入れ替えられます(チュートリアル33「ポリゴンモード、カラー、ブレンド」をご覧ください)。
tri_fan 三角形で扇を描きます。頂点A B C D E Fが与えられれば、三角形ABC、ACD、ADE、AEFを描画します。
quads 離れた四角形を描画します。頂点A B C D E F G Hが与えられれば、四角形ABCDとEFGHを描画します。
quad_strip つながった四角形を描画します。頂点A B C D E Fが与えられれば、四角形ABCDとCDFEを描画します。
polygon マトリクス内のすべての頂点を使い、一つのポリゴンを描画します。そのポリゴンが単純かつ凸状でない場合、その結果は定まりません。
tri_grid ジオメトリマトリクスが2次元の場合、面を形成するために各頂点がマトリクスでの近い点につながって三角形が描画されます。
quad_grid ジオメトリマトリクスが2次元の場合、面を形成するために各頂点がマトリクスでの近い点につながって四角形が描画されます。

 

接続マトリクス

接続マトリクスは、1次元でlongかcharデータのどちらかを含んでいるはずです。それがあれば、それはジオメトリマトリクスの頂点をつなげる順番を指定します。ジオメトリマトリクスを一定にしておき、それにインデックスをつける接続マトリクスを変えることで、同じ頂点の間のつながりの変化が描画されるようになります。

ジオメトリマトリクス

ジオメトリマトリクスは、long、float32、float64のどれかの形式のデータを含んでいるはずで、float32が最も一般的な選択となります。float64データタイプは、画面にレンダリングするために標準的に必要とされるものより高い精度を持ちます。longデータタイプは値を整数に制限し、座標を指定するときに一般的には使われません。

マトリクスの各セルは、一つの頂点を表します。画像は、マトリクスの行や列のどちらかに沿って頂点間のつながりを描画することでレンダリングされます。1セル幅のマトリクスは、列に沿ってつながれます。1セル高のマトリクスは、行に沿ってつながれます。マトリクスの幅と高さの両方が2つ以上のセルになっている場合には、jit.gl.renderオブジェクトのgeom_rowsアトリビュートが、行と列のどちらに従えば良いのかを決めます。もし、tri_gridかquad_gridプリミティブが指定されていれば、常にマトリクスの行と列の両方がつながれます。

2つから13のプレーンのどこにもマトリクスが使用できます。プレーン13以上は、後ほどの利用のために予約され、現在は無視されるでしょう。各プレーンは、頂点、テクスチャ座標、法線、頂点の色、エッジの5つのグループのうちの1つで、様々な値を表します。もし、あるグループを指定するために充分なプレーンがあれば、そのグループはマトリクスのレンダリングに使われます。各グループが使われるためには、頂点以外は完全に存在しなければなりません。頂点に対するxとyの値だけがある場合には、全頂点のz座標は0が設定され、xy平面上の2D画像になります。

プレーン0: 頂点のx座標
プレーン1: 頂点のy座標
プレーン2: 頂点のz座標
プレーン3: テクスチャがあれば、頂点でのテクスチャのs座標
プレーン4: テクスチャがあれば、頂点でのテクスチャのt座標
プレーン5: 頂点でのライティング法線のx要素
プレーン6: 頂点でのライティング法線のy要素
プレーン7: 頂点でのライティング法線のz要素
プレーン8: 頂点の色の赤要素
プレーン9: 頂点の色の緑要素
プレーン10: 頂点の色の青要素
プレーン11: 頂点の色のアルファ要素
プレーン12: 隣の頂点へのつながりに対するエッジフラグ:0未満なら線が描画されません