Share via


vFetchの使い方

vFetchでスキンアニメーション、その2:vFetchの使い方

Fetchを使ったスキンアニメーションの実装例を紹介する前にvfetchの基本的な使い方を紹介します。

例えば、以下のシェーダーコードのように頂点位置、色を使用する頂点シェーダーがあるとします。

 VS_OUTPUT VertexShader(float4 position: POSITION, float4 color : COLOR )
{
}

上のコードと同じ動作をするコードはvFetchを使って以下のように書くことができます。

 // INDEXセマンティクスを使ってインデックス値を取得する
VS_OUTPUT VertexShader(int index : INDEX)
{
    float4 pos;    // フェッチしたデータを格納するための変数、float4のみ指定できる
    float4 col;

    // vfetchはアセンブリ命令なのでasmブロックを使う必要がある
    asm
    {
        vfetch pos, index, position        // positionのフェッチ
         vfetch col, index, color        // colorのフェッチ
    };
    

最初にインデックスバッファから読み込んだインデックス値を取得するためにINDEXセマンティクスを使います。次にフェッチしたデータを格納する為の変数を宣言します。この変数はfloat4型でないといけません。それ以外の型を指定するとコンパイルエラーになります。

次にvfetch命令を使って頂点データをフェッチします。vfetchはアセンブリ命令なのでasmブロック内に書く必要があります。vfetchの書式は以下の様になっています。今までは読みやすいようにvFetchと書いてきましたが、実際の命令は全て小文字のvfetchになります。

vfetch 取得したデータを格納する変数名, 頂点インデックス, セマンティクス

ここではインデックスバッファから取得した頂点インデックスを使用していますが、任意のインデックスを指定することができます。このことを利用して、GameFest Japan 2009のデモでは、index内に元の頂点インデックスとインスタンスのインデックスの2つの情報を算術符号化圧縮を使って格納し、シェーダー内で展開、頂点データとインスタンス用のデータをvFetchを使って取得しています。

vfetchに指定するセマンティクスはシェーダーで指定する入力セマンティクスの小文字となっています。大文字が混ざっているとコンパイルエラーになります。また、texcoord0, texcoord1のようにセマンティクスの後に数字を指定することもできます。下の表は入力セマンティクスとvFetchで指定するセマンティクスの対応表です。

入力セマンティクス

vFetchセマンティクス

説明

BINORMAL binormal バイノーマル(従法線)
BLENDINDICES blendindices ブレンドインデックス
BLENDWIEHGTS blendweight ブレンドの重み
COLOR color カラー
NORMAL normal 法線
POSITION position 頂点位置
PSIZE psize ポイントサイズ
TANGENT tangent タンジェント(接線)
TEXCOORD texcoord テクスチャ座標

まとめると

  • 頂点インデックスはINDEXセマンティクスを使って取得する
  • フェッチしたデータを格納する変数の型はfloat4にする
  • vfetchはasmブロック内に記述する
  • vfetchのセマンティクスは入力セマンティクスの小文字になっている

と、なります。

次回は、このvFetchを使ったスキンアニメーションの実装例を紹介します。