【Watch記事検索】
最新ニュース
【11月30日】
【11月29日】
【11月28日】
【11月27日】
【11月26日】

西川善司の3Dゲームファンのためのグラフィックス講座
公開されたDirectX 10の仕様の詳細

NVIDIA Kevin Myers氏
3月20日~25日(現地時間) 開催

会場:San Jose McEnery Convention Center

 PCのグラフィックサブシステムは、次期WindowsであるWindows Vistaで劇的な変化を遂げる。そう、D3D10……すなわちDirectX 10のDirect3Dの登場だ。

 GDC2日目はMicrosoftが主催した「Microsoft Game Developer Day」に加え、NVIDIAやATIなどのGPUメーカーが中心になって執り行なった「Direct3D Day」の2つのDirectX 10(D3D10)関連セッションが執り行なわれるという充実振り。全く同日の同スケジュールで異なる切り口の「D3D10講座」が執り行なわれたために、参加者はまさに踏み絵の気分でどちらか一方への参加を決めることとなった。ちなみに筆者は午前中は「Direct3D Day」、午後は「Microsoft Game Developer Day」の方に参加した。

 本稿では、この2つのセッションで語られた「DirectX 10(D3D10)の全容」についてレポートすることにする。なお、DirectXはマルチメディアコンポーネントの総称であり、広義で「DirectX 10=D3D10(DirectX 10のDirect3D)」という使われ方をされることがあるが、本稿では正確性を重んじ、なおかつ発表者のスライドに合わせ、「Windows Vista世代の新グラフィックスサブシステム」を明示的に差す用語となる「D3D10」の表現を用いることにする。



■ DirectX 9(D3D9)からDirectX 10(D3D10)へ
~D3D10はWindows XP以前には提供されず

D3D10はWindows Vista専用
 NVIDIAとATIが執り行なった「Direct3D Day」ではまず、D3D10の概要の解説が行なわれた。

 D3D10はWindows Vistaで供給されるもので、OS側がグラフィックスリソースを仮想化して3Dアプリ側に提供したり、安定性向上のためにドライバがカーネルモードとユーザーモードの2モードで動作する仕組みになるなど、動作設計そのものが変わっている。そのためにD3D10はWindows Vista専用のものとなり、Windows XP以前のOSには提供されないことが強調された。つまり、近い将来(業界の予想では2007年?)、D3D10対応の新世代GPU/ビデオカードが登場した場合、フルスペックで動作させるためにはWindows Vistaが必須となる。

 D3D10対応のビデオカードには、Windows XP向けのD3D9のドライバも提供されるので全く使えないわけではないが、その場合はあくまでD3D9使用の範囲内で動作することになる。これは一種の“足切り”ということができるわけで、この意味でもD3D9→D3D10は大きなステップになるのだ。

 アーキテクチャの面では大きく変わるのはグラフィックスのレンダリングパイプラインに「ジオメトリシェイダー(Geometry Shader)」が追加されるところだ。詳細は後述するが、頂点シェーダ、ピクセルシェーダに続く第3のシェーダとして追加されたもので、D3D10を特徴づける新要素だと言える。

D3D9/SM3.0とD3D10/SM4.0パイプライン比較


CapsがなくなるのはD3Dにおける歴史において待望の偉業
 また、D3D10では、長らく開発者を苦しめてきた(?)、Capsチェックが不要になる。Capsとは、そのGPUが、どんな能力を持っているかを調べること(Capability Set Check)。

 たとえばATIとNVIDIAとでは、同世代のGPUでもサポートされる機能が微妙に異なるため、3Dゲームなどの開発では使いたい機能がそのユーザーの使用しているGPUで使えるかどうか、いちいち判定をする処理系を組み込む必要があった。そしてその判定結果を元に、そのGPUで使える機能のみを使ってゲームエンジンの方を動作できるように設計しなければならなかった。

 とくにフレームバッファやテクスチャのフォーマットの対応度については各社まちまちで、あるGPUでは使えても、別のGPUでは使えないことがあるなど、非常に煩雑な状況であった。D3D10では、主要な機能や全てのフォーマットを標準でサポートするように義務づけられており、こうした混乱が回避できるようになる。

 ただし、グラフィックス技術はまだまだ発展途上であり、D3D10が現役時代にも様々な新技術や新機能が新しいGPUに搭載されてくることだろう。当然、その際、ATIとNVIDIAが異なる技術を実装してくるはずで、この場合はCapsが結局必要になってきてしまうように思える。

 この問題については、そうした各社から登場した新機能仕様をとりまとめて、たとえば「D3D10.1」のような形でアップデートを行なって対応するという。こうすれば機能1つ1つについてCapsをしなくても、D3D10のバージョンチェックだけで済むことになる。ちなみに、新技術を、ある程度、出そろってからとりまとめて標準仕様にしていくというスタイルは、OpenGLの規格策定によく似ている。

 そして、これまで長らくD3Dに存在した様々な固定機能がD3D10では削除される。これも大きなトピックだといえる。たとえば、(深度/距離)フォグ、ポイントスプライト、クリッププレーン、アルファテストといったものがなくなる。こうしたものはD3D10以降はシェーダを駆使して自前の3Dエンジンで実装しなければならなくなるが、Microsoftでは同等の機能をシェーダで実現するエミュレーションシェーダを用意している。

 たとえばポイントスプライトは2Dの画像テクスチャをポリゴンに貼り付けて3D空間の中で表示するもので、草木や煙など様々な表現で利用される。このポイントスプライトは、D3D10では、あるXYZの位置情報を持った頂点をジオメトリシェーダにて2つの三角形(ポリゴン)からなる四角形を生成して、これをスプライトとする代案が用意されている。

ついに3Dグラフィックスに置ける固定機能が完全撤廃 代替アイディアはMicrosoftが提供




■ D3D10のスペックは? ~コモンシェーダ・アーキテクチャとなるSM4.0仕様

Microsoft Sam Z.Glassenberg氏
 Microsoftの「Game Developer Day」では、D3D10のより詳細な仕様が語られた。

 プログラマブルシェーダ仕様は4.0(SM4.0)となり、より高度なプログラミングが可能になる。整数の処理系が強化され、またビット操作(ビットシフトやローテートなどの二進論理演算系)なども行なえるようになり、GPUのCPU的活用のポテンシャルが拡張される。

D3D10のレンダリングパイプライン
 同時にアクセスできるテクスチャ数がSM3.0で16枚だったのが8倍の128枚へと拡張され、さらに同時に複数バッファにレンダリングするマルチレンダーターゲット(MRT)はD3D9の4から8へと拡張される。

 テクスチャフォーマットでは、ハードウェアレベルでRGBE形式がサポートされるようになる。“E”はExponentの略で、RGBに対して共通の指数に相当するもの。正規化された各RGBに対してR=R×2^Eのような形で値が処理される。これは整数テクスチャでHDRレンダリングを行なうときに有用となる。今まで一部の3Dゲームで、αRGBのαに共用指数値を格納して、シェーダが自前でRGBEのエンコード、デコード処理をしてHDRレンダリングを行なうものがあったが、今後はそうした面倒がいらなくなる。

 シェーダはついに念願のコモン(共有型)シェーダアーキテクチャとなる。別名、統合型シェーダアーキテクチャだ。共有型シェーダというよりは汎用型シェーダといった方がわかりやすいかもしれない。

D3D10ではコモンシェーダアーキテクチャとなり、シェーダ群がその都度頂点シェーダとなったり、ピクセルシェーダとなったり、ジオメトリシェーダになったりする


 GPU内の複数のシェーダユニット各自は自分が頂点シェーダかピクセルシェーダかという役割を決めつけられておらず、上位のシェーダマネージャによってその都度、頂点シェーダ、ジオメトリシェーダ、ピクセルシェーダとして働く。テクスチャもビデオメモリ内に格納されたただのデータという解釈で、たとえば6枚のテクスチャがあったとして、それら6枚をキューブマップとして解釈する形でシェーダに与えてやると、キューブマップとして意味を持って来るというような概念になる。

 「GPUはグラフィックス処理に特化したプロセッサ」ではなく、D3D10世代では「GPUはグラフィックス処理も得意なプロセッサ」という扱いに昇格すると解釈するとイメージがつかめるかもしれない。

ビデオメモリ上の任意のテクスチャ素材をバインドして意味を定義して利用できるようになる


 なお、シェーダに具体的な機能種別がなくなるということは、各シェーダユニットのポテンシャルに格差がないということでもある。従って実行可能な命令セットにも格差がなくなり、また全てのシェーダがテクスチャアクセスのポテンシャルを持つことになる。ピクセルシェーダとして起用されたときだけでなく、頂点シェーダとして起用されても、ジオメトリシェーダとして起用されても、テクスチャのアクセス機能を持つことになるのだ。

 SM3.0ではNVIDIAがサポートし、ATIがサポートしなかった頂点シェーダからのテクスチャアクセス機能であるVTF(Vertex Texture Fetching)機能は、D3D10とSM4.0では、ATI、NVIDIAの区別なく両者で必然的にサポートされることになる。

 同様に、ビデオメモリ(テクスチャ)の読み込みだけでなく、ビデオメモリへの出力機能も各シェーダでサポートされるようになる。具体的にはピクセルシェーダではアウトプットマージャー(Output Merger)として、頂点シェーダとジオメトリシェーダではストリームアウトプット(Stream Output)としてサポートされることになる。



■ D3D10の花形「ジオメトリシェーダ」とはなにか? ~そしてその使い道は

 そしてD3D10の最大の特徴とも言える、ジオメトリシェーダという概念の導入もホットトピックとなる。

 頂点シェーダは、「入力された頂点に対して演算を行なって別の値に変換する」ものであった。たとえば、ある頂点を透視投影変換したり、ある関節を中心に回転させたり……といった処理系を頂点シェーダが行なっていた。頂点シェーダは入力された1個の頂点に対し、1個の結果出力を行なうシェーダユニットであったわけだ。

頂点シェーダは1入力1出力の大原則の元に動作するシェーダであった ジオメトリシェーダは複数入力、複数出力を可能にするジオメトリ次元のシェーダ。出力→入力、入力→出力の双方をサポートする柔軟性も兼ね備えている


ジオメトリシェーダで光源方向から輪郭となる頂点を引き出してシャドウボリュームを生成できる
 ジオメトリシェーダはこの制限を打ち破るもので、1個の入力頂点に対して何らかの演算を施し、複数の頂点を生成することができるシェーダなのだ。出力できる頂点数は0~1,024個。出力できるジオメトリは頂点の他、線分、ポリゴンといったものまで。0個はすなわち、入力された頂点を消失させることを意味する。

 活用法としては、ステンシルシャドウボリューム技法による影生成の際の、光源方向からの頂点の引き延ばし工程などがまず挙げられる。従来のGPUでは、頂点を増やすメソッドがなかったために、影を出したいキャラクタには引き延ばし用のダミーの頂点を盛り込むなどの工夫をしていた。ジオメトリシェーダでは、光源から見た輪郭となる頂点から新たなポリゴンを生成して引き延ばしてシャドウボリュームを生成できるようになる。

 法線マップによる凹凸陰影を与えるテクニックは今や3Dゲームの基本表現となってきているが、この法線マップから凹凸のポリゴンを実際に生成して、ディスプレースメントマッピングを行なうこともできる。前述したように、ジオメトリシェーダも当然テクスチャアクセスができるので、凹凸情報をテクスチャから読み出し、その値からポリゴンを生成してやる形でディスプレースメントマッピングができるわけだ。

法線マップでバンプマッピングを行なうのは今や珍しくないが…… 微細凹凸をジオメトリシェーダで実際にポリゴンとして生成してしまえば、ディスプレースメントマッピングが実現できる


 描画するシーンをジオメトリシェーダで複数のレンダーターゲットに対応づけてレンダリングすることで6面からなる動的なキューブ環境マップマップも1パスで生成できるようになる。

ジオメトリシェーダを駆使すれば、キューブマップをシングルパスでレンダリングできるようになる


ストリームアウトプットは、ジオメトリシェーダのビデオメモリへの出力機構に相当する
 そして、ジオメトリシェーダはテクスチャアクセスだけでなく、ストリームアウトプットと名付けられたビデオメモリ出力機能も持っている。なお、1つだけでなく複数のバッファへの出力も可能だとする。

 頂点シェーダやジオメトリシェーダを駆使して3Dキャラクタモデルを変移させてこれを普通に描画するだけでなくストリームアウトプット経由で書き出して、再びレンダリングパイプラインに戻して再入力すればGPUの中だけでアニメーション描画が行なえることになる。どのように活用できるかは未知数な部分もあるが、CPU(ゲームエンジン側)の仲介なしでGPUの中で完結したアニメーションが生成できるのはなかなか興味深い技術だ。

 講演ではこのGPU内完結アニメーションの例として花火のシェーダのデモが紹介された。デモ自体は単純なもので点が上の方に上っていき、ある程度の高さになると破裂して散乱するアニメーションを同時多発的にランダムに繰り返すというもの。

ジオメトリシェーダとストリームアウトプットを駆使して作成された花火のデモ。CPUを介さずにGPUないだけでアニメーションを生成


 これは、まず1つのパーティクル(点)をある高さのところでジオメトリシェーダによって増殖させ(花火の爆発)、その複数となった各パーティクルをさらにジオメトリシェーダでポリゴン化してここで花火のはじけるアニメーションを展開、そして最後にはそのポリゴンをジオメトリシェーダで消失させる(花火が消える)という流れになっている。

 このようにGPUの中だけで打ち上がっては破裂して消える花火のアニメーションを実現しているわけだ。どの程度負荷が掛かるかわからないが、軽いのであればその場を盛り上げるためのバックグラウンド的なアニメーションとして活用ができそうだ。いうなればプロシージャルなアニメーションといった感じだろうか……。

ジオメトリシェーダで点から複数の点へ、さらに複数の点からポリゴンを生成する ジオメトリシェーダを駆使したアニメーションとして有効なのはブラー効果。これは動きに応じて、ジオメトリシェーダで残像ポリゴンを生成することで実現できる




■ プログラマブルシェーダ4.0仕様について

 SM4.0の具体的な命令セット仕様までは公開されなかったものの、おおよその仕様についても語られた。前述したように整数処理系の命令が充実し、ビット操作系の論理演算までが可能になる。動的分岐制御はより高度なものとなる。

 SM4.0では「命令セットの大幅の拡張」よりも、頂点シェーダ、ジオメトリシェーダ、ピクセルシェーダのいずれのシェーダにおいても「ほぼ同じ命令セットが使える」という制限の撤廃の方にメリットがあるようだ。また、パイプラインのどこであっても頂点バッファやインデックスバッファのジオメトリ情報にはシェーダからアクセスが許可される。

 テクスチャサンプラはコンフィギュラブルな比較演算付きで読み出しが可能で、隣接近傍フィルタ(Percentage Closer Filter)などを利用してのテクスチャ読み出しもできるようになるようだ。これは例えるならばNVIDIAのNVIDIA SHADOW機能や、ATIのFetch4テクスチャサンプラの一般発展系といった感じだろうか。

SM4.0ではすでに1個1個のシェーダがCPU並の汎用性ポテンシャルを身につける


定数バッファ(Constant Buffer)はシェーダの切り替えも高速にする。定数バッファの内容とシェーダの対応の管理がやや面倒そうだ
 地味だが「定数バッファ」という概念の導入もプログラマブルシェーダ環境に与える影響は大きい。

 これまでシェーダで利用できる定数の数が決まっており、ボーンスキニングなどの処理においては、これが足かせとなっていたわけだが、SM4.0では定数領域をビデオメモリに定数バッファとして持つことができ、自由にアクセスができるようになったのだ。あらかじめビデオメモリ側に転送しておけば、シェーダが起動されるごとに定数を転送する必要がなくなるという副次メリットもある。定数バッファはテクスチャと同じで最大4,096×4,096テクセルまでが確保できる。



■ D3D10の主役はジオメトリシェーダ

 D3D10の主役はなんといってもジオメトリシェーダだろう。これまでのグラフィックスパイプラインを大幅に拡張することになり、その活用性は無限大であると同時に未知数だ。上手くジオメトリシェーダをプログラミングすればテッセレータ的な動作をさせることもでき、これからの3Dゲームエンジンはジオメトリシェーダの活用のし具合によってかなりユニークな特徴をさせると思わせる。

 SM4.0は命令セットの拡張や仕様制限の撤廃……というよりはよりリッチなSM3.0環境になるというイメージだ。SM4.0では整数や二進論理演算、動的分岐が自在に使えるのでGPUがCPU的な役割を十分こなせるようにもなるはずだ。もしかすれば、AIやシミュレーションを実装することもできるだろう。

 ある日本のゲーム開発者は「入力さえなんとかすれば、SM4.0を駆使することでGPUだけでゲームが作れるかもしれない」と冗談を言っていた。

□Game Developers Conference(英語)のホームページ
http://www.gdconf.com/
□Game Developers Conference(日本語)のホームページ
http://japan.gdconf.com/
□関連情報
3Dゲームファンのためのグラフィックス講座
http://game.watch.impress.co.jp/docs/backno/rensai/3dg.htm

(2006年3月23日)

[Reported by トライゼット西川善司]



Q&A、ゲームの攻略などに関する質問はお受けしておりません
また、弊誌に掲載された写真、文章の転載、使用に関しましては一切お断わりいたします

ウォッチ編集部内GAME Watch担当game-watch@impress.co.jp

Copyright (c) 2006 Impress Watch Corporation, an Impress Group company. All rights reserved.