GeForce 6800用Naluデモに見るShaderModel 3.0の威力
2004/07/22 22:54
DirectX SDKのテクスチャツールで見たNaluの肌テクスチャの様子。水色部分以外はα値が設定されている
 GeForce 6800シリーズの最大の特徴は,ShaderModel 3.0に対応したということだ。ShaderModel 3.0は未公開のDirectX 9.0cの仕様であって,残念ながらGeForce 6800を購入してもこれまでその部分を実感することはできなかったわけだが,今回NVIDIAから公開されたデモによって,ようやくその一端を感じ取ることができるようになった。
 ShaderModel 3.0では多くの拡張があるのだが,最大のアドバンテージはやはりShader命令でのダイナミックな実行制御だろう。プログラミング言語でいうと「if文」である。プログラミング経験のある人なら,ifなどの分岐構文なしでどうやってプログラムを作っていたのかとむしろ不思議に思うかもしれない。これまでのShaderプログラミングは一直線の処理の羅列が基本で,一部ループができるという程度のものでしかなかった。それが一般的なプログラミング言語のように柔軟な記述が行えるようになったのだ。

 NVIDIAの発表で,ダイナミック分岐が行われているとはっきり明示されているのはNaluデモの鱗表現部分である。
 肌と鱗の部分の描き分けはテクスチャによって行われているということらしい。実際にNaluで使われているテクスチャを見ると,鱗部分にはα情報が設定されていることが分かる。これがどのように機能しているのかテクスチャのα情報を書き換えて実験してみた。
 最初の画面は通常のテクスチャによる画像だ。鱗部分はややメタリックなギラつき加減で,肌の部分とは明らかに表現が異なる。



 テクスチャのα値を0で埋めたものが,次の画像だ。鱗情報がまったく消えていることが分かる。鱗部分の虹色やメタリックな光沢,鱗のバンプ情報も参照されていない。



 さらに落書きっぽいけど,適当なα値の画像でαを差し替えてレンダリングしたもの。右がα画像(分かりやすくするためテクスチャの上下を反転している)。α値が0でない部分では,元のデモ映像には出ていない通常肌部分でも,鱗っぽいバンプマッピングが出ていることも分かる。



 以上のことから,α値が0ならば通常肌のシェーディング,0以外なら鱗のシェーディング+鱗のテクスチャ&バンプの参照が行われていることが見て取れる。
 これまでのShaderプログラムは,ポリゴン単位でしか指定できなかった。既存技術で同様なことをしようとしたら,鱗の境界ごとにポリゴン分割を行うか,鱗ポリゴンを肌の上に貼り付けるといった面倒な処理が必要だった。不可能というわけではないが,煩雑で処理も重くなる。今回のデモではやられていないが,Shaderの異なる部分をアニメーションさせようとか思ったら,さらに大変なことになる。
 これが,テクスチャをテーブルとして参照してShaderを切り替えるという手法になることで表現力が格段に向上し,なおかつ簡単な処理になることが分かるだろう。

 ShaderModel 3.0を使ったゲームが登場するのはまだ先(というかDirectX待ち)の状況だが,現時点でGeForce 6800の実力を見るにはNaluなど一連のNVIDIAデモは,ユーザー必見だといえるだろう。(aueki)

→GeForce 6800関係の記事は「こちら」





友達にメールで教えよう!

この記事へのリンクはこちら
http://www.4gamer.net/news/history/2004.07/20040722225448detail.html