頂点テクスチャってなに?

頂点テクスチャでスキンアニメーション、その1:頂点テクスチャってなに?

前回紹介したクォータニオンを使ったスキンアニメーションの実装方法はシェーダーモデル2.0では最も多くのボーン数を使うことができる手法です。この手法を使うことでオリジナルのスキンアニメーションサンプルでは59個だった最大ボーン数が、二倍近い117個になりました。

 

もっと多くのボーン数を使える手法はないのでしょうか?

 

残念ながら、シェーダーモデル2.0ではここが限界ですが、シェーダーモデル3.0から追加された機能を使うことで更に多くのボーンを使うことができます。

使う機能とは以下の二つです。

  • 頂点テクスチャ
  • 浮動小数点テクスチャ

頂点テクスチャは、その名のとおり頂点シェーダー内でテクスチャデータをフェッチ(読み込み)できる機能です。発表当時(2004年)のデモでは波のシミュレーションをピクセルシェーダーで行い、その結果を頂点テクスチャとして使うことで、立体的な波を表現していました。

XNA Field

また、XNA GSE 1.0のXNA Fieldデモではマルチスレッドでリアルタイムにフラクタル生成した結果を頂点テクスチャとして使用して地形モデルを表示していました。

実際のゲームでも、バーチャファイター5では水面と雪原、フォグなどの表現で頂点テクスチャは使われています。

頂点テクスチャの特徴としては

  • 頂点シェーダー内で最大4種類のテクスチャをフェッチできる
  • 任意のテクスチャ座標から複数回の読み込みができる
  • 浮動小数点テクスチャと組み合わせることでさまざまなデータを扱うことができる
  • 定数レジスタに比べて大量のデータを扱うことができる

が、あります。

普段、テクスチャというと色情報が入った画像を使いますが、0-255の範囲の数値として扱うことで色以外の情報を格納するのにも使えます。これに加えてシェーダーモデル3.0から採用された浮動小数点テクスチャを使うことで、色以外の情報を格納するのが更に容易になりました。

また、頂点テクスチャの読み込みはピクセルシェーダー内でのテクスチャの読み込みと同様に自由にテクスチャ座標を指定することができ、複数回読み込むことができます。

これらの特徴を利用して、画像情報以外のデータを入れたテクスチャから自由にデータを読み込むことで頂点テクスチャを定数レジスタの変わりとして使うことができます。定数レジスタ数が256だったのに対して、頂点テクスチャでは大量のデータを格納することができます。例えば2,048x2,048のテクスチャは定数レジスタ数に換算すると400万という膨大な数のデータを格納することができます。

このように頂点テクスチャは非常に魅力的な機能ですが、弱点もあります。

  • 対応しているGPUはまだ少ない、対応していても動作が遅いものが少なくない
  • 浮動小数点テクスチャではフィルタリングが使えないものが殆ど
  • テクスチャに格納できる要素数が1,2,4と限定されている

頂点テクスチャは最近のGPUでは当たり前のようについている機能ですが、まだ対応していないGPUの数も多く、ピクセルシェーダー内でテクスチャフェッチをするのに比べて速度的に劣る場合が多いです。

また、頂点テクスチャで使用されるテクスチャはその性質上、浮動小数点テクスチャを使うことが多いのですが、Direct X 9.0世代の殆どのGPUでは浮動小数点テクスチャに対してのバイリニアなどのフィルタリングができないものが殆どです。しかも、できないだけなら良いのですが、テクスチャフィルタを設定した状態でフェッチするとでたらめな数値を返してきたりするので、正しいフィルタリング設定をせずに頂点テクスチャを使ってしまい、自分のプログラムが正しく動作しているかどうかを時間を掛けて調べたあげく、見つけた原因が単純にフィルタリング設定のミスだったなんてことがあります。

頂点バッファで使われる代表的な型といえばVector3ですが、残念ながら頂点テクスチャではVector3は使えません。浮動小数点型で使えるのはSingle、Vector2、そしてVector4だけです。これはテクスチャのテクセルサイズには16ビット、32ビット、64ビット、そして128ビットの組み合わせしか指定できないのが原因です。

頂点テクスチャを使おう

以上のように、頂点テクスチャは魅力的な機能なのですが、使えるGPUの少なさから今まではおまけ的な機能として使われることが殆どでした。ですが、最近では使えるGPUの数も増えてきたので有効活用するケースも増えてきました。特にXbox 360やPS3はどちらも頂点テクスチャをサポートしていて、使っていると思われるタイトルも見かけるようになりました。

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