フォト

Google AdSense


  • AdSense
無料ブログはココログ

« ひっそりと | トップページ | 追加 »

2004.11.08

頂点テクスチャ

結局、ディスプレースメントマッピングにしか使ってないのは、その可能性のわりに創意工夫がたらんよなぁ・・・(ま、他の利用方法は現在実験してる最中ですが)。

ところで、頂点テクスチャの例でよく出てくる、”頂点テクスチャを使ったボーン処理”っていうのについて誰か実現しててサンプルとかあるんですかねぇ?

個人的にクォータニオンなら4次元なので、1枚のテクスチャで1ピクセルで格納できますが、4×4行列の場合どうしましょうかね。

一応、GeForce 6800では頂点テクスチャの読み出しは4枚可能ですから行単位で4次元を1枚のテクスチャに格納して4枚で4×4行列(クォータニオン + 平行移動ベクトルで2枚のテクスチャでもいいのかも)は引き出して来れそうですね(※イメージとしては下記)。ただ、下記の様な使い方ではボーンは1本しか使えませんね(頂点テクスチャって使えるsamplerが4でテクスチャ命令自体は4つ以上呼んでも大丈夫でしたっけ?大丈夫なら行列を参照するテクスチャ座標を複数持って置けばいいわけですけどね)。

アニメーション時の行列の処理についてはピクセルシェーダで解いてMRTで4枚同時出力を行えば1パスで色々と出来そうですね。まぁ、すでにこの辺についてはGPUベンダーとか海外の誰かがデモとか論文とか書いてそうですね。

// 作成する行列
// Samplernは行ベクトルの入ったテクスチャ
float4x4 Matrix;
Matrix[0] = tex2Dlod(Sampler1, float4(tu, tv, 0, 1));
Matrix[1] = tex2Dlod(Sampler2, float4(tu, tv, 0, 1));
Matrix[2] = tex2Dlod(Sampler3, float4(tu, tv, 0, 1));
Matrix[3] = tex2Dlod(Sampler4, float4(tu, tv, 0, 1));

それにしてもなんか面白そうなネタは無いモンですかね(論文書き中にこんなこと言ってるのは現実逃避以外の何者でもない)。

せいぜい思いつくのは、1つの頂点バッファに複数のメッシュの頂点データを入れて1回のDrawIndexedPrimitiveで複数メッシュ描画ぐらいでしょうかね。

もうちょいと具体的に例を挙げると、2x2テクスチャに各ピクセル異なった回転×平行移動行列を事前にセットして(4枚のテクスチャで事前にピクセルシェーダかテクスチャロック(PCI-Expressならこれでもいいかも)で)。頂点バッファには事前に、100頂点×4を入れておいて、それぞれ

頂点バッファ 0頂点目~99頂点目 tu=0 tv=0
頂点バッファ 100頂点目~199頂点目 tu=1 tv=0
頂点バッファ 200頂点目~399頂点目 tu=0 tv=1
頂点バッファ 300頂点目~499頂点目 tu=1 tv=1

としておいて、頂点テクスチャで4枚のテクスチャから行列を取り出してビューとプロジェクションを乗算してあげてそれを頂点座標に乗算してトランスフォームすれば1回のDrawIndexedPrimitiveで複数の異なった行列でトランスフォームするモデルを描画できるよなぁ・・・。でも、あんまりありがたいことかどうか疑問ですね(パフォーマンステストしてないのでなんともいえませんが)。

だいたい、ジオメトリインスタンシング(頂点バッファに入れるデータ量がちょい違うが)みたいなもんだしねぇ。

まぁ、なんにせよこの辺の利用方法については、今回の論文後に実験でも始めますかねぇ。なんか新しい論文のネタに繋がればいいんですけどねぇ(まぁ、プリプロセスで何やるかによるでしょうが)。

« ひっそりと | トップページ | 追加 »

Programming」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2210/1904860

この記事へのトラックバック一覧です: 頂点テクスチャ:

« ひっそりと | トップページ | 追加 »