●DirectX 9を拡張するNV30のCineFXアーキテクチャ
NVIDIAのデヴィッド・カークChief Scientist |
NVIDIAが、次世代GPU「NV30」向けに開発したアーキテクチャ「CineFX」は、DirectX 9ではない。DirectX 9のフィーチャを全て包括しつつ、さらにDirectX 9にない拡張が加えられている。「DirectX 9の上を行く。NV30はアップツーボトムのフルの浮動小数点プロセッサで、何千もの命令をサポートし、高等言語も提供する」とNVIDIAのDavid B. Kirk(デヴィッド・カーク)氏(Chief Scientist)は、要約する。
Cinefxでは、DirectX 9よりProgrammable Shader(GPUの演算ユニット)の命令セットやレジスタを大きく拡張、浮動小数点フレームバッファもサポートする。また、ひとつのシェーダプログラムがサポートできる命令数も大幅に増やした。さらに、CineFXアーキテクチャをフルサポートする、NVIDIA独自のシェーディング高等言語「Cg」もリリースする。
NVIDIAがCineFXとCgで目指すのは、DirectX 9 GPUよりさらに“シェーダセントリック”なGPUだ。CineFXでは、DirectX 9より複雑なシェーダが実行可能で、また、データ精度も完全に浮動小数点にできる。より複雑なシェーディングができるGPUだ。そのため、数千命令以上の複雑なプログラム規模と高精度の浮動小数点データタイプを要求する高度なオフラインCG向けシェーダ(プログラム)も、NV30に移植しやすい。
●GPUの処理性能をピクセルにかける処理の複雑化に使う
NVIDIAは過去数年、GPUの高速化のリーダーだった。そのフィロソフィは、複雑なパイプを設計するより、高速化にフォーカスすることにあった。しかし、NV30を見ると、その方向性が変わったように見える。Kirk氏は、その理由を次のように説明する。
「今のGPUはもう十分に速い。例えば、GeForce4のフィルレートやジオメトリレートを見てみよう。60fpsで、1フレームごとに100万ポリゴンを処理できる。そして、ピクセルパイプは、実際の画面の50倍の高解像度で描画することができる。それなら、1ピクセルを50回描く代わりに、50倍の時間をかけてきれいなピクセルをひとつ描くことが出来るのでは、と考えた。そうすれば、よりリアルな岩、布、髪などを描ける。これがNV30以降の世代の考え方だ」
つまり、今のGPUは描画できる画面サイズや現実的なポリゴン数以上の処理能力を持っている。だが、その処理能力の多くは、実際にはムダになってしまっている。だったら、余ったパフォーマンスを、同じピクセルや頂点に対して、より複雑な処理をかける方に費やそうというわけだ。
もっとも、この考え方自体は、DirectX 9の基本的なコンセプトだ。しかし、CineFXがDirectX 9と違うのは、どの程度の複雑なシェーダが現在のGPUに必要かという点だ。NVIDIAは、DirectX 9より一段高度なプログラマビリティが必要だと判断したようだ。つまり、一気に極端に走ったわけだ。
●NV30イコールDirectX 9.1?
こうした拡張を加えたCineFXは、DirectX 9の上位互換となる。NVIDIAでは「NV30はDirectX 9のスーパーセット」(NVIDIA、Sunder Velamuri氏、GM、Mobile Business)だと言っている。ではそのフィーチャは、NVIDIA自身の言語以外からはどうサポートされるのだろう。
Microsoftは、おそらくCineFXをDirectX 9.1でサポートすると見られる。7月のSIGGRAPH 2002では、MicrosoftのChas. Boyd氏(DirectX Graphics Architect)がDirectX 9.1のPixel Shaderの仕様を明らかにしたが、そのスペックはNVIDIAのCineFXと同じだった。またNVIDIAも、CineFXのホワイトペーパーの中で、NV30ファミリのVertex ShaderとPixel Shaderのバージョンがそれぞれ「2.0+」である(DirectX 9ではどちらも2.0)と表現している。
DirectX 8.0 | DirectX 9.0 | NV30 | |
---|---|---|---|
Higher Order Surfaces | |||
High Order Surface | ○ | ○ | ○ |
Continuous Tesselation | ○ | ○ | ○ |
Vertex Displacement Mapping | - | ○ | ○ |
Geometry Displacement Mapping | - | - | ○ |
Vertex Shaders | |||
Vertex Shaderバージョン | 1.1 | 2.0 | 2.0+ |
Max Instructions | 128 | 1,024 | 65,536 |
Max Static Instructions | 128 | 256 | 1,024 |
Max. Constants | 96 | 256 | 256 |
Temporary Registers | 12 | 12 | 16 |
Max Loops | 0 | 4 | 64 |
Static Flow Control | - | ○ | ○ |
Dynamic Flow Control | - | - | ○ |
Pixel Shaders | |||
Pixel Shaderバージョン | 1.1 | 2.0 | 2.0+ |
Texture Maps | 4 | 16 | 16 |
Max. Texture Instructions | 4 | 32 | 1,024 |
Max. Color Instructions | 8 | 64 | 1,024 |
Max Temp Storage | - | 12 | 64 |
Dependent Textures | 4 | Unlimited | |
Data Type | 整数 | 浮動小数点 | 浮動小数点 |
Data Precision | 32bit | 96bit | 128bit |
これは、ちょうどDirectX8.1の時と逆の関係になる。DirectX 8.1ではATI Technologiesが仕様を拡張(Pixel Shader 1.4)して他社に差をつけた。Direct X8.1の時の意趣返しを、今回、NVIDIAがやろうとしているようだ。つまり、DirectX 9世代GPUでもまた、DirectX 8.1と同様に非互換性が発生してしまうことになる。
もっとも、Microsoft側から見ると、これはMicrosoftの責任の範疇ではないという。MicrosoftのTed Hase(テッド・ハセ)氏(Director、Third-Party Windows Gaming & Entertainment)は次のように説明する。
「ハードウェア会社は、基本的にはMicrosoftがなにをやろうと、それにはおかまいなく彼らの投資を決定してしまう。そして、市場の中での競争で、優位に立てるポイントを常に狙う。彼らは、互いに競争しており、それはMicrosoftとは関係なく行なわれている。我々は、ただ見ているだけだ。それに彼らの競争は、本質的には機能を高めることにある。だから、Microsoftとしてはどれもサポートする」
NVIDIAの意図は明白で、NV30ファミリが市場に浸透し、CineFXが開発者を惹きつけることができれば、DirectX 9.1が事実上のスタンダードになり。他社のDirectX 9 GPUを引き離すことができるというわけだ。実際にDirectX 9対応ソフトウェアが立ち上がる時に、DirectX 9.1仕様が主流になってしまえば、ATIのリードを無効にできることになる。
●野心的なCineFXのアーキテクチャ拡張
特にCineFXで目立つのは、サポートするシェーダ命令数だ。例えば、DirectX 9ではVertex Shader(ジオメトリ処理用の演算ユニット)はループを含めても最大で1,024命令しかサポートできないが、CineFXではループを含めれば最大で65,536命令をサポートできる。Pixel Shader(テクスチャ処理用の演算ユニット)も同様だ。DirectX 9ではテクスチャ命令が最大32、カラー命令が最大64だが、CineFXでは最大1,024のシェーダ命令がサポートされる。つまり、CineFXでは1,000以上の命令を含む、非常に複雑なシェーダプログラムの実行が可能になるわけだ。
「例えば、プラスチックのようには見えない、非常にリアルな人間の肌を作りたいとしよう。その場合には、肌の表面に浸透する光を表現する必要がある。サブサーフェイススキャタリングとバウンスによって、(光が拡散して反射することで)肌が明るく照らされる様子を作らなければならない。これを正確に表現するには、1,000以上の命令が必要になる」とKirk氏は説明する。
また、CineFXのPixel Shaderは、依存テクスチャ読み込み(Dependent Texture Reads/Lookup)回数はDirectX 9では4に制限されているのに対して、CineFXでは制約がなく完全にプログラマブルとなっている。
「GeForce3や4ではマルチテクスチャリングを進化させた。DirectX 9では、マルチテクスチャリングをもっと進化させて、16テクスチャをサポートできるようにした。だが、DirectX 9でも、テクスチャリングは基本的にはシングルパイプで、テクスチャルックアップ(参照)は制約されている。そこでわれわれは、テクスチャシェーディングパイプライン全体を割き開いて、ピクセルプロセッサに置き換えた。そして、好きなだけの回数のテクスチャルックアップをできるようにした」(Kirk氏)
CineFXではデータ精度も上がる。64/128bit浮動小数点カラーがサポートされる。つまり、各色16bitまたは32bitの浮動小数点のカラーデータフォーマットをNV30は扱うことができる。そのため、現在グラフィックスワークステーションのCPUを使って行なっているシェーディング処理が、そのままの精度でNV30に移植できるという。
「NV30は、フル浮動小数点で、高度なプログラマビリティを備えるので、どんなRenderManシェーダも、CPUと同様に走らせることができる。全く同じ絵が得られる」とKirk氏は言う。
Shaderの命令セットも拡張された。例えば、Vertex Shaderでは三角関数など新たな演算命令がサポートされたことで、波打つ海面のようなエフェクトをGPU上での演算だけで表現できるようになる(CPU側でジオメトリデータを変化させる必要がない)。
また、Pixel Shaderも大幅に命令セットが拡張され、Vertex Shaderに近づく。
「プログラマブルアーキテクチャで面白いことのひとつは、思いもよらないことができる点だ。例えば、我々のアーキテクチャではピクセルパイプラインがフル浮動小数点なので、ジオメトリ処理をピクセルパイプラインで行なうこともできる。ピクセルパイプラインを使って、ジオメトリとメッシュをディスプレイス(変位)させることもできる。つまり、テクスチャをレンダーしたのと同様に、ジオメトリをレンダーして描画することができるわけだ」とKirk氏は示唆する。
●1,000命令は現実的かどうかが焦点に
このように、CineFXでは、1,000命令以上の複雑なシェーダをGPUで走らせることができる。オフラインのシェーダにかなり肉薄する。だが、この拡張に対しては、注意すべきポイントがあるとする意見もある。例えば、ATIのDavid E. Orton社長兼COOは次のように語る。
「グラフィックスでは、長すぎるプログラムは、リアルタイムに走らせることができないことに注意すべきだ。もし、1つのピクセルに対して1,000命令(の処理)があったとしたら、リアルタイムにレンダリングすることはできない。実際に、高品質のレンダリングアプリケーションでも、非常に短い命令ループを使っている。スピードが必要だからだ」「問題は、何百サイクルもピクセルにかける価値があるのか、20とか50とかで十分なのかということだ。実際に、どんなプログラムが今後Pixel Shaderに対して書かれてくるのか。これは非常に面白い問題で、見ているのが楽しみだ」
つまり、現状のGPUでは1,000命令はまだ長すぎる。ただ、今後どう展開して行くかは楽しみという立場だ。
もっとも、NVIDIAもすぐに1,000命令をリアルタイムに実行しようとは考えてはいないようだ。Kirk氏は次のように言う。
「まず最初はベースアーキテクチャを提供する。次に、それをごく近いうちにより速くし始める。開発者たちは、非常に複雑で非常に美しいシェーダを書いてもらいたい。そうしたら、我々が、それを速く走らせるようにする」
「NV30と次の世代で期待しているのは、数百もの命令をリアルタイムで実行するShaderだ。その後の世代では1,000シェーダをリアルタイムでできるようになるだろう。その時になれば、リアルムービーのようなシェーダが実現できるようになる」
つまり、乱暴に言うと、現状のGPUで対応できる範囲のシェーダの実行をターゲットにしたのがDirectX 9。ある程度先の世代GPUでのリアルタイム実行までを視野に入れたのがCineFXというわけだ。NVIDIAのこの戦略がどんな評価を受けるかは、NV30で、実際にどれだけ複雑で大規模なシェーダをリアルタイム実行できるかどうかにかかっているように見える。
□関連記事
【9月5日】【海外】DirectX 9世代のGPU戦略
http://pc.watch.impress.co.jp/docs/2002/0905/kaigai01.htm
【9月4日】【海外】プロセッサ化へと向かうシェーダアクセラレータ時代のGPU
http://pc.watch.impress.co.jp/docs/2002/0904/kaigai01.htm
【7月31日】【海外】NVIDIA、DirectX 9世代のGPU「NV30」を今秋発表
http://pc.watch.impress.co.jp/docs/2002/0731/kaigai01.htm
【7月26日】NVIDIA、Cgコンパイラをオープンソース化
http://pc.watch.impress.co.jp/docs/2002/0726/nvidia.htm
(2002年9月6日)
[Reported by 後藤 弘茂]