[WinHEC 2006#03]DirectX 10の全容判明
関心の高いDirectX関連ということで,早朝8時30分開始のセッションにしては来場者が多かった
|
4Gamer読者の多くにとって,Windows Vista関連で最も気になるキーワードは,やはり「DirectX 10」(正確にはDirect 3D 10)だろう。Windows Vistaの発売を控えたWinHEC 2006では,DirectX 10の最終仕様と,次世代DirectX「DirectX 10.1」の展望が報告された。 本稿ではまず,DirectX 10の最終仕様について,まとめてみたいと思う。DirectX 10.1については,改めてお届けする予定だ。
なお,上でも述べたとおり,ゲーマーにとってより重要なのはDirectX 10というより,Direct 3D 10なのだが,セッションでは“DirectX 10=Direct 3D 10”として扱っていたため,本稿でもこれに従うことを,あらかじめお断りしておく。
■DirectX 10は家庭用ゲーム機の「仕様の一貫性」を見習う!
セッションでは,Microsoftのグラフィックスプラットフォームユニット リードプログラムマネージャーのSam Z.Glassenberg(サム・グラッセンバーグ)氏が,次のようにDirectXの現状を報告した。
Sam Z. Glassenberg氏(Lead Program Manager,Graphics Platforms Unit,Microsoft)
|
「DirectX 9時代まで,グラフィックスチップの仕様はメーカーによって異なっており,場合によっては上位モデルと下位モデルでは提供される機能が異なる場合すらあった。シェーダモデルはもちろん,細かく見れば演算精度にまでばらつきがある。そしてそのためか,映画やCADといったオフラインレンダリングの世界では,CPUベースのレンダリングを好むケースも今なお多く見られる」
より具体的にいえば,現行のDirectX 9世代まではATI Technologies(以下ATI)とNVIDIAとでグラフィックスチップの仕様が異なるということだ。例えば,同じプログラマブルシェーダ3.0(Shader Model 3.0,以下SM3.0)対応グラフィックスチップ一つをとってみても,ATIのRadeon X1000シリーズはHDRバッファへのフィルタリングをサポートしているのに対し,NVIDIAのGeForce 7シリーズは対応していない。逆に,GeForce 7シリーズは頂点シェーダのテクスチャアクセス機能(VTF,Vertex Texture Fetch)に対応しているが,Radeon X1000シリーズは対応していない,といった具合だ。
この違いは,3Dゲーム開発者やユーザーに「ATI派か,NVIDIA派か?」という“派閥”の選択を迫ることになり,マーケティングチャンスを少なからず小さくしてしまっていた。開発者は「ATI仕様とNVIDIA仕様とで重複する機能のみを使う」という“最大公約数的仕様の採択”も可能だが,この場合,グラフィックスチップが持つ,せっかくの最新機能を活用するチャンスを失い,結果としてユーザーに不利益が生じてしまう。
DirectX 10(Direct 3D 10)はDirectX史上初めて,仕様の一貫性を保証する
|
「DirectX 10では,この理不尽を排除し,DirectX 10の仕様の一貫性(Consistency)を保証する。開発者は,どのDirectX 10世代グラフィックスチップを使っても,すべてのフィーチャーを利用できる。Windows Vista世代では,Direct 3D 10グラフィックスは,家庭用ゲーム機のようなコンセプトになったと考えてもいい」とはGlassenberg氏の弁。
そう,DirectX 10世代では3Dグラフィックスの機能面で「ATIにするかNVIDIAにするか」を悩まなくてよくなるわけだ。 「このため,開発者はCapsテストから解放されることになる」(Glassenberg氏)。
DirectX 10ではCapsの悪夢から解放される
|
DirectX 9世代までは,3Dゲーム用のグラフィックスエンジンの始動前に,ハードウェアの仕様の多様性に対応するため,「そのPCシステムが搭載するグラフィックスチップにどんな機能が備わっているのか」をチェックしなければならなかった。この作業をCaps(Capability Set check)テストというが,これはゲームエンジンの互換性の根幹にかかわる部分のテストであり,当該システムでサポートされない機能については代替処理を用意せねばならないなど,非常に苦労する部分なのだ。この作業から解放されるということは,開発者の負担が減り,それと同時に,最新のDirectX 10の機能が積極的に活用されやすくなる。結果として,ユーザーメリットが生まれやすくなるのだ。
さて,ここまで読んで,「ということは,DirectX 10世代だと,すべての機能が搭載された,高価なハイエンドグラフィックスチップしかリリースされないのか?」という疑問を感じた人がいるかもしれない。
いや,ちゃんと今までどおり,ハイエンド以下,ミドルレンジ,ローエンドといったバリエーションはなされる。 DirectX 10世代GPUとして提供される機能は画一化されるが,パフォーマンスやクオリティで格差が与えられるのだ。とあるゲームタイトルを動作させたとき,ローエンドクラスのグラフィックスチップだと解像度を800×600ドットまで落とさないと60fps出ないが,ハイエンドなら1600×1200ドットでも60fpsを維持できる,といった具合である。
また,家庭用ゲーム機のように,3Dゲームにおけるグラフィックス設定オプションがなくなったりはしないかと心配する人がいるかもしれないが,それもないと思われる。RTSを例に考えてみると,コアゲーマーはシェーダ関係の機能を全部無効にしてでも,できる限り高解像度でプレイしようとするだろうし,一般ゲーマーなら,ある程度解像度は妥協しても,美しいビジュアルエフェクトを求めるはずだ。グラフィックスチップの機能が画一化しても,性能にスケーラビリティは残されるため,PCゲームをプレイするに当たっての,こうした設定面の自由度は引き続き残るだろう。
■DirectX 10最大のウリはジオメトリシェーダにあり
DirectX 10のパイプライン概念図
|
さて,DirectX 10のグラフィックスパイプラインは右のようになると発表された。
この図の右側にある水色のブロックはグラフィックスメモリを表しており,左側のフローがレンダリングパイプラインの概念になる。
頂点シェーダ(Vertex Shader)があって,ラスタライザ(Rasterizer)を通ってピクセルシェーダ(Pixel Shader)に渡り,最終的に出力に至るという流れはDirectX 9以前とまったく変わらない。パイプライン的な側面から見ると,この図におけるDirectX 10新要素は薄緑で表された部分になる。
順番に見ていこう。「インプットアセンブラ」(Input Assembler)は,頂点バッファやインデックスバッファに収められた(描画に必要な)入力データを,頂点シェーダへ受け渡すときに自由度をもたらすものだ。イメージとしては「新しいビジュアル効果をもたらすもの」というより,むしろ「3Dグラフィックスのプログラム効率を向上させる機能強化」といったところ。
そして,DirectX 10最大の機能強化点といえるのが,「ジオメトリシェーダ」(Geometry Shader)ユニットだ。 ジオメトリシェーダは「プリミティブシェーダ」(Primitive Shader)ともいわれるシェーダで,簡単に説明すれば「プログラマブルに頂点を増減させることが可能なシェーダ」ということになる。
これまで頂点シェーダは,ある入力頂点に対し,プログラムを実行してやり,その値を変移させて出力するものであった。つまり「1データ入力→1データ出力」の処理系であったわけだ。 これに対しジオメトリシェーダでは「多データ入力→多データ出力」を可能にする。もちろん「1データ→多データ」が可能だし,出力データ数が入力データより少なくなってもいい。機能ブロックとしては,ジオメトリシェーダは頂点シェーダと別ブロック扱いになるが,「頂点シェーダを,より一般化して拡張したもの」と捉えてもいいだろう。
ジオメトリシェーダにおける「1→多」の応用ケースとして代表的なのが,「DOOM 3」の採用で有名となったステンシルシャドウボリューム技法の影生成における,光源方向からの頂点の引き伸ばし処理だ。 DirectX 9世代以前でこの技法を実装しようとすると,あらかじめ引き伸ばし用の頂点を3Dモデル側に仕込ませておく必要があった。これは影を生成しない頂点においては冗長データにほかならず,CPUやグラフィックスチップにおいても,オーバーヘッド,あるいはよけいな負荷としてのしかかっていた。
この点,DirectX 10世代では,ジオメトリシェーダを用いて「影領域として引き伸ばされる頂点」に対し,頂点を動的に増設して引き伸ばしてやればよくなり,ムダがなくなるのである。
左:DirectX 10の花形。それがジオメトリシェーダだ
右:緑色の部分が,光源方向から引き延ばされたシャドウボリューム。ジオメトリシェーダがあれば,このシャドウボリューム生成を効率的に行える
|
|
|
先ほどのパイプライン概念図に戻ると,ジオメトリシェーダユニットの右横に「Texture」とあるのに気がつくだろう。そう,ジオメトリシェーダユニットはテクスチャの読み出しも可能なのだ。
1ポリゴン以下で表現されるような微細凹凸表現において,その微細凹凸面の法線ベクトルをテクスチャ(=法線マップ)化。これに基づいて陰影処理を行うことで,そこにあたかも微細な凹凸があるかのように見せる,「法線マップを用いたバンプマッピング」(あるいは「法線マッピング」)と呼ばれるテクニックが,DirectX 9世代では一般化した。ところが,この手法では,凹凸があるように“見えるだけ”で,実際には平面のまま。このため,視点がその微細凹凸に近づいたときなど,特定のケースでは不自然に見えることがあった。
この場合,ジオメトリシェーダを用いれば,こうした法線マップ(テクスチャ)を読み出して,これを“タネ”に頂点を生成して「本物の凹凸」を作り出す,ディスプレースメントマッピング処理が可能だ。これを応用し,視点からの距離に応じて,遠いときはバンプマッピング,近いときはディスプレースメントマッピングといったようなLOD(Level Of Detail)処理を行えば,リアルな表現を効率的に行えることになる。
左:法線マップテクスチャに基づいて,ピクセル単位の陰影処理を行うことで,微細な凹凸の陰影を再現するバンプマッピング(俗称:法線マッピング)。これがDirectX 9世代
右:ジオメトリシェーダなら,バンプマッピングから一歩進んで,実際に凹凸を伴ったディスプレースメントマッピングが可能になる
|
|
|
ジオメトリシェーダを活用すれば,シーンをキューブマップとしてレンダリングする動的なキューブマップ生成をシングルパスで実行可能
|
ジオメトリシェーダは複数頂点を生成できる。これはいってみればポリゴン(プリミティブ)そのものを生成できることに等しい。これを利用して,6方向の視線からレンダリングするように各バッファ(=レンダーターゲット)をアサインすることにより,シングルパスで動的なキューブマップを生成したり,あるいは3Dモデルの周辺に生成したポリゴンにファー(毛皮)層を生成してファーシェーダをブローシージャル(デザイナの手ではなく,プログラムによって生成すること)に実現したり,ボリュームレンダリングを実現したりもできる。
これまで,相当な下準備やマルチパス(同じモデルを数回描画すること)を駆使しなければならなかったレンダリング技術が,ジオメトリシェーダを1回通すだけで,シングルパスで行えるようになるのだ。
左:キューブマップとは,周囲の情景を6面体構造のテクスチャ化したもので,映り込み表現などに用いれる。これがその例
右:ジオメトリシェーダがあれば,ボリュームレンダリングや積層型ファーシェーダの下準備(ファーポリゴン層の仕込み)が不要になったり,高効率になったりする!
|
|
|
DirectX 10が,コードネーム「WGF」と呼ばれていた時代のレンダリングパイプライン図がこれ。上の図でも示されているように,「テッセレータ」は最終仕様のDirectX 10から排除された
|
再び先ほどのフロー図に戻ってほしいが,ジオメトリシェーダにはもう一つ,「Stream output」と呼ばれる四角が接続されているのに気づくだろう。 これはジオメトリシェーダユニットからグラフィックスメモリに書き出す,新たなデータパスを表している。言い換えれば,ジオメトリシェーダの出力をグラフィックスメモリに書き戻して,もう一度頂点シェーダに戻すことが可能になっているのだ。これは,最近流行となりつつある,グラフィックスチップにグラフィックス描画以外の汎用演算タスクを行わせる「GPGPU」(General Purpose GPU)に有効だとされる。
グラフィックスチップのレンダリングパスにおいて,これまでグラフィックスメモリへの出力権限を持っていたのはパイプライン最下流のROP(Rasterize OPeration,ラスタライズオペレーション)ユニットのみであった。ATI流にいえば「レンダーバックエンド」ということになるが,いずれにせよこれでは,シェーダユニットで算出した結果が得られるまでのレイテンシとオーバーヘッドが大きい。この点,パイプラインの上段にあるジオメトリシェーダユニットでデータ出力が可能となれば,この弱点が低減されるというわけだ。
最後になるが,長らくその搭載が標準となるかオプションとなるかの境目をさまよっていた「テッセレータ」について報告しておきたい。 頂点シェーダ,ピクセルシェーダ,ジオメトリシェーダに続く第4のプログラマブルシェーダユニットであるプログラマブルポリゴン分割ユニット――テッセレータは,DirectX 10世代のグラフィックスチップにおいて,その実装が見送られている。
■DirectX 10世代グラフィックスチップの ■プログラマブルシェーダ「Shader Model 4.0」とは?
DirectX 10世代のプログラマブルシェーダは「4.0」となる
|
DirectX 10世代のグラフィックスチップでは,プログラマブルシェーダ仕様が「Shader Model 4.0」(以下SM4.0)へとバージョンアップする。 いうまでもなく,最もホットなトピックはジオメトリシェーダという概念の導入になるわけだが,それ以外にも拡張部分はある。
一つは,DirectX 8登場とともに始まったプログラマブルシェーダの歴史において,ずっと目標とされてきた「コモンシェーダアーキテクチャ」(Common Shader Architecture)が,SM4.0でついに現実のものとなる点だ。コモンシェーダアーキテクチャでは,頂点とピクセル,ジオメトリという,三つのプログラマブルシェーダの命令セットが共通化される。これによって「シェーダ種別ごとの専用命令」という概念がほぼなくなり,シェーダプログラムの一般化を行いやすくなるというメリットが生まれる。
さて,コモンシェーダは,汎用シェーダを状況に応じて各種シェーダに臨機応変に起用する「統合型シェーダアーキテクチャ」(Unified Shader Architecture)と混同されることが多い。現実に,同義とされることもある。 しかし最近では,コモンシェーダは「プログラミングモデルとしての命令セット共通化」を指し,一方,統合型シェーダは「各シェーダの,ハードウェア上の実装形式」を指すようになっている。簡単にいえば,ソフト的な概念でシェーダ種別の垣根をなくすのがコモンシェーダ,ハード的な側面でシェーダ種別の垣根をなくすのが統合型シェーダということだ。
極端な例を挙げると,非統合型シェーダアーキテクチャでも,コモンシェーダアーキテクチャの実現はありえる。実際に,DirectX 10世代グラフィックスチップの第1弾は,消費電力やトランジスタ規模的な制約から,そうなる可能性が高いというウワサもある。
●充実した命令セットが提供されるSM4.0 二つめは,SM4.0で,CPUにひけを取らない豊富な命令セットが提供される点だ。 とくに,整数演算命令や,ビット操作を含む二進論理計算などがサポートされ,グラフィックス以外のこと――エンコード,デコード,データ解析,データ圧縮,展開――を行わせるGPGPU用途にも有益な拡張がなされる点は指摘しておきたい。
また,構造化プログラミングに役に立つ条件分岐のSwitch命令,サブルーチンコール命令といったところがサポートされ,さらに実行命令数も無制限となる(DirectX 9世代では最大512命令)のもトピック。 同時にアクセス可能なテクスチャ数もDirectX 9の16枚から128枚へと増加,同時に複数バッファへレンダリングするマルチレンダーターゲット(MRT,Multi-Render Target)もDirectX 9の4枚から8枚へと拡張された。前述した「ジオメトリシェーダを活用したシングルパスのキューブマップ生成」は,6枚のMRTを利用しており,SM4.0世代で初めて可能になるものなのだ。
このほか,テクスチャやフレームバッファ関係の機能も拡張がなされている。 例えば,3Dゲーム開発者から切望されていた整数ベースのHDRレンダリングに最適な「RGBEフォーマット」のバッファのサポートが行われる。RGBEバッファとは,RGBの各値に対して共通指数部として提供される「E」(Exponent:指数)を持てるバッファのこと。RはR=R×2Eで与えられるようになり,0〜255以上の値が表現できるようになる(つまりHDRだ)。値の精度は大部落ちるが,RGBが16ビット浮動小数点(FP16)からなる64bitバッファの半分の帯域消費で済むため,特定局面では有用となるはずだ。
また,これまでATI独自仕様として知られていた,法線マップの圧縮に適する3Dc相当の「2要素ベクトルテクスチャの圧縮メソッド」と,HDRテクスチャの圧縮に応用可能な,3Dc+相当の「1要素ベクトルテクスチャの圧縮メソッド」は,(予定どおり)SM4.0標準仕様として盛り込まれるようである。
こうして見てくると,SM4.0の仕様拡張は,何かまったく新しいビジュアル表現に直接結びつくというより,プログラマビリティの向上に力を入れたものになっていることに気がつく。
■DirectX 10はWindows Vista専用 ■〜Windows XPはDirectX 9で打ち止め!
DirectX 10はWindows Vista専用となり,Windows XP以前では提供されない。この点は注意が必要だ。
先日発表されたWindows Vista β2にはDirect3D 10のβも実装されている。もちろん,その機能の多くはソフトウェアエミュレーションされたものになるわけだが
|
また,DirectX 10世代のグラフィックスチップは,Windows Vistaが発売される2007年1月に同時発表&リリースといわれている。当初は,「Windows Vistaリリース後,DirectX 10世代グラフィックスチップ不在の時間が続き,登場するのは結局2007年中旬となる」とささやかれていた。しかし,WinHEC 2006を迎えた2006年5月現在,マイクロソフト関係者は皆,口を揃えて「Windows Vistaと同時リリース」と言っており,何かしらの目処は立ったと見るべきだろう。
また,DirectX 10世代,SM4.0対応のグラフィックスチップ/カードが登場した場合,これをWindows XP環境下で利用すること自体は可能となる。ただその場合,DirectX 9世代,SM3.0対応のグラフィックスチップ/カードとして動作するため,当然のことながら,DirectX 10,SM4.0のフィーチャーは利用できない。あと,これはいうまでもないだろうが,DirectX 9世代,SM3.0対応のグラフィックスカードをWindows Vistaで利用しても,その仕様どおりの動作をするにすぎない。 まぁ,ゲーマーならば,DirectX 10世代のグラフィックスカードが登場するのを待ち,それを契機として,一気にWindows Vistaへ乗り換えるのが正解かもしれない。
ちなみにMicrosoftは,Windows Vista登場後もしばらくはWindows XPユーザーが多数存在し続けるだろうという予測を受け,3Dゲームメーカーに対し,Windows XP用とWindows Vista用,両方のプログラムコードを1枚のROMディスクに入れておくよう推奨している。Microsoftいわく「XPとVistaの両対応は大した手間ではない」「PCゲームユーザーのXP→Vistaの移行にはそう時間がかからないと思う」とのことで,なかなか楽観的な予測だが,このあたりは実際にそのときを迎えてみないと分からない。
もっとも,「Microsoft Flight Simulator X」「Halo 2」「Shadowrun」など,Microsoftからリリースされる予定のWindows Vista対応/専用タイトルは,Windows Vistaとほぼ同時に登場する予定なので,Microsoftが楽観的な気持ちも,分からなくはない。(トライゼット 西川善司)
|
|
|