vvvv プリミティブ

Pocket

この記事はvvvv Advent Calendar8日目の記事です。


新しい表現を身に付けるため、vvvvの中でどのようなデータが流れ描画されているのかを理解したい。
基本の基本(プリミティブ)に戻り、プリミティブを自力で(※)生成し描画してみる。
(※Boxノードとか使わないという意味)

DirectX11(に限らず?)では頂点情報を

  • 点リスト
  • 線リスト
  • 隣接付き線リスト
  • 線ストリップ
  • 隣接付き線ストリップ
  • 三角形リスト
  • 隣接付き三角形リスト
  • 三角形ストリップ
  • 隣接付き三角形ストリップ

などの形式で扱う。
詳細→ プリミティブ トポロジ (Direct3D 10)

今回は線リスト、線ストリップ、三角形リスト、三角形ストリップを自前でジオメトリデータを生成して描画してみる。
点については所謂パーティクルでありシンプルなので割愛。

線リスト

ジオメトリデータを作成するのにはGeometryBufferノードとInputElementノードを使う。
InputElementノードでジオメトリデータのレイアウトを決める。
ここでどのようなレイアウトを選ぶかはシェーダーによって変わってくる。
今回はシンプルにConstantノードを使った。
このシェーダーの中身を見ると頂点シェーダーに渡される構造体は次の様になっている。

struct vsInputTextured
{
    float4 posObject : POSITION;
	float4 uv: TEXCOORD0;
};

頂点座標とテクスチャ座標を渡しているので、InputElementノードでそのように指定する。
また、float4はR32G32B32A32_Floatに該当するのでFormatピンではそれを選択する。(デフォルトで選択されているが。)

この辺はvvvvに限った話ではなく、そもそもDirectXの話なのでとても汎用的で大事な知識である。
ごりごりコードを書かなければいけない部分をvvvvがよしなにやってくれているのである。

正しいレイアウトを選択すると、Constantノードの出力ピンであるLayout ValidがOnになる。

続いて指定したレイアウトに沿うようにジオメトリデータを作成する。
(画像右上)
上段は頂点座標情報、下段はテクスチャ座標。
(なお、テクスチャ座標は今回使用しないので値は適当。)

線リストは2つのジオメトリデータで1組なのでSpreadの値を変えるとこうなる。
4組のSpreadsで2本の線が表現できる。線はつながっていない。

線ストリップ

線リストのパッチのTopologyをLineStripに変えただけ。
今まで繋がっていなかった線が繋がっているのがわかる。
ジオメトリデータを作るSpreadの数は同じだが、線が1本増えている。
このようにストリップ形式の方が頂点データ数を削減できる。

三角形リスト

線リストと同じ要領でSpreadsの組をもう2組増やす。
三角形リストは頂点数が3の倍数でなければならない。
たとえばConsのInputCountを一つ減らして5つにしてしまうと、ジオメトリデータが1組分足りないので2つめの三角形は描画されない。

三角形ストリップ

三角形が繋がっているのがわかる。
三角形ストリップは他のレイアウトに比べて人が理解するには少しわかりにくい順番で並んでいくので面白い。

次のステップ

自らジオメトリデータを作成して図形を描画することが出来た。
これらの基本を押さえながらアルゴリズムを考えれば、
自由に3D座標空間にグラフィックをジェネレートできるようになるのではなかろうか。
作例はまた後日。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください