【GDC2012】西川善司の3Dゲームファンのための「DirectX 11.1」講座

次世代ゲーム機の根幹技術になるといわれるDirectX 11.1の新機能に迫る



3月5日〜9日開催(現地時間)

会場:San Francisco Moscone Center



セッションタイトル

 あまり大きく取り上げられることが少ないが、実は、Windows 8には最新のDirectX 11.1が組み込まれることがアナウンスされている。

 2011年12月には、AMDが早速DirectX 11.1世代プログラマブルシェーダー5.1(SM5.1:Shader Model5.1)対応のRADEON HD7000シリーズを発表しており、静かにそしてゆっくりと、DirectX世代は更新を遂げようとしている。

 GDC2012において2日にわたって開催されたチュートリアルセッションでは、このDirectX 11.1の仕様(実際にはDirect3D、以下同)についての解説が行なわれた。本稿では、これについてまとめてみることにする。





■ DirectX 11.1はWindows 8に搭載され、DirectX 9〜DirectX 11世代のGPUを広くサポートする


Matt Sandy氏(Microsoft,Program Manager)

 結論から言ってしまえば、DirectX 11.1は、「+0.1」のバージョン番号からも察しが付くように、マイナーチェンジバージョンということになる。

 「+0.1」バージョンのDirectXといえば、DirectX 8.1、DirectX 10.1などが思い起こされるが、実際、どれも「そんなのあったけ」という程度の印象しかないが、DirectX 9時代のマイナーチェンジ版である「DirectX 9.0c」はシェーダーモデルのバージョンが「+1.0」された「ビッグマイナーチェンジ」であった。ちなみに、現在の家庭用ゲーム機の現行機であるプレイステーション 3、Xbox 360は、このDirectX 9.0c相当のグラフィックス技術世代になる。

 DirectX 11.1は、果たして、DirectX 9.0cのような輝けるのだろうか。

 まず、紹介されたのは、DirectX 11.1はWindows 8に搭載されるということだ。Windows VistaやWindows 7へも提供されるが、Windows XP以前に提供されないのはDirectX 11.0と同じだ。


DirectX 11.1とはなにか

 そして、DirectX 11.1は、DirectX 11.1世代ハードウェアでフル機能を発揮するが、DirectX 9.0a世代GPU、DirectX 9.0c世代GPU、DirectX 10.0世代GPU、DirectX 10.1世代GPU、DirectX 11.0世代GPU、DirectX 11.1世代GPUの全てのハードウェアをサポートする。ただし、各DirectX世代GPUは、基本的にはそのDirectX世代GPUの機能までしか利用できない。

 例えば、テッセレーションはDirectX 11.x世代GPUでしか利用できない。頂点シェーダーとピクセルシェーダーを活用し、SM3.0相当のシェーダープログラムで構成したレンダリングエンジンはDirectX 9.0c世代GPUからDirectX 11.1世代GPUまでで動作させることができる。こうした広い対応力を持たせたのは、Windows 8のアプリケーションプラットフォームであるMetroのコンセプトがあるためだ。なお、Metroについては筆者のGDC2012レポートの1つ「Microsoft Developer Day」レポートその1〜クロスゲームプラットフォームとしてのWindows 8とMetro」を参照して欲しい。





■ 低精度シェーディングを2〜3倍に加速させる新機能

 Windows 8は、ご存じのようにARM系ハードウェアに対応する。ARM系ハードウェアといえば、Windows Phoneやタブレットなどが連想されるが、ああした機器では、レンダリング結果にそれほどの精度が求められず、むしろパフォーマンス(と低消費電力)の方が重視される。

 そこで、DirectX 11.1では、低精度(Low Precision)シェーダーがサポートされる。


低精度シェーダー

 最低精度保証……という形で宣言して使用することになり、対応精度は16ビット浮動小数点(min16float)、10ビット浮動小数点(min10float)、16ビット整数(min16int)などが用意される。余談になるが、min10floatは指数3ビット、仮数7ビットの7e3形式でXbox 360のGPU「Xenos」で対応された精度だ。

 この低精度シェーダー機能は、対応できる場合はDirectX 9世代ハードウェアから利用することができる。

 メリットはどこにあるのかというと、それはパフォーマンス面にある。

 GPUによっては(あるいは、その処理内容によっては)、1つの演算ユニット(シェーダーユニット)で低精度データの演算を同時に2個ないしは3個行なう事ができる。これが可能な場合、1つの演算ユニットで1個ずつ演算するよりも、パフォーマンス的には2〜3倍に引き上がる。

 具体的な例を挙げよう。例えば、3つの10ビット浮動小数点(FP10)の単チャンネル変数に対して同一演算を仕掛ける際、32ビットレジスタの30ビット分にFP10データを3つ入れて、演算ユニットにSIMD実行を仕掛けられれば、シングルサイクルで3データ分の結果が1度に得られる。これは1つ1つ処理していくときの3倍も効率がよくなったことになる。

 こうした機能がサポートされないGPUでは、普通に1個ずつデータに対して演算が仕掛けられてスループットが上がらないだけだ。互換性には何の影響もない。

 こうした低精度シェーダーの機能はOpenGL ESでは当たり前のようにサポートされてきた経緯がある。Windows 8がOpenGL ESの領域にも目を向けだした……というのは考えすぎだろうか。





■ Tile Based Deferred Rendering(TBDR)と組み合わせて使うと便利?〜Discard / No Overwrite

 Tile Based Deferred Rendering(TBDR)を実践する際に便利な機能も搭載された。

 それがDicardとNo-Overwriteだ。

 TBDRの場合、複数のバッファをタイルとして確保して、それぞれに対してレンダリングを実施していくが、複数のタイルにまたがるようなオブジェクトをレンダリングする際に、レンダラーの実装方法によっては「どのタイルに書き込んでどのタイルには書き込まない」……というような制御があると便利だ。

 そうした要望を受けて実装されたのがこの機能になる。


DirectX 9〜DirectX 11まで広域にサポートされるDiscard / No Overwrite機能





■ サスペンド〜復帰をスムーズに〜Memory offer / Reclaim


Windows 8のための機能という感じか

 使う可能性はあるが、短期的には使わないかもしれない(ビデオ)メモリ領域を確保したり、それを再回収する機能だ。

 この機能で確保したメモリは、解放後、OS側のメモリ管理状態が切迫してきたときには、完全に破棄されてしまうかもしれないが、もし、その領域が破棄されていない時に限っては、この機能によって、もう1度その内容をアプリケーションが取り戻すことができる。

 Metroアプリでは、表示自体はサスペンドしていても、動作は継続している場合があるが、そうしたアプリのサスペンド〜復帰をスムーズに行なうために便利な機能になる。





■ 効率のよいアプリケーションウィンドウの全画面表示〜Swap Effect


Metroアプリが、瞬間的に全画面表示されて、すぐに使えるのはこの機能の恩恵だ

 Swap EffectもWindows 8特有機能と関わりの強い機能だ。

 Windows 8では、全てのアプリケーションウィンドウは、デスクトップウィンドウマネージャ(DWM)を経由して表示される。

 Windows 8では、全てのアプリケーションをスピーディに全画面表示させることができるが、それを司るのがこのSwap Effect機能になる。





■ PCベースの3D立体視機能が統一化


Windows 8/DirectX 11.1での3D立体視はウィンドウモード、全画面モードの双方に対応する

 Windows環境下の3D立体視はNVIDIAの3D VISIONが有名だ。その後、AMDがこれを追いかける形で、HDMIベースの3D立体視をサポートして、両者が共に「我こそが業界標準」を訴えていたわけだが、アプリケーション開発者からすると、NVIDIAとAMDの3D立体視はそれぞれの拡張APIを使って個別にサポートしなければ両対応にならなかった。

 DirectX 11.1は、ついに、この不毛な「3D立体視、どっちが業界標準か」戦争(?)に終結をもたらす。DirectX 11.1では、APIレベルで3D立体視がサポートされ、GPUメーカー間の仕様の違いや、そのためにドライブするハードウェアの相違は、各GPUドライバーの動作側で吸収する。

 よって、アプリケーション側はGPUメーカーごとの個別対応が不要になり、さらに、アクティブシャッターグラス方式、パッシブグラス方式、裸眼立体視方式といった3D立体視の方式にも関与せずに、3D立体視対応化が図れるようになる。





■ 定数バッファのサイズが無制限に

 DirectX 11.1では定数バッファのサイズ制限が撤廃された。

 ただし、各シェーダープログラムからは、この容量無制限の定数バッファに対して、4キロバイト括りを一塊としたアクセスしか1度には許容されない。また、オフセットを与えることで大容量の定数バッファに対して任意の4Kバインド単位の参照ができる。4K括りなのは、GPUにおける定数バッファの取り扱いが、レジスタファイルとの結びつきが強いためだ。ここは、なかなか制限として取っ払いが難しい。


定数バッファに対しては任意の領域範囲に対して更新も行なえる




■ 任意のバッファのブレンド処理に論理演算を使用可能に〜Logic Ops

 DirectX 11.1では、アウトプットマージャーのブレンド処理に任意の論理演算が可能になった。

 グラフィックスレンダリング用途というよりは、大規模データへの探査、解析、あるいは認識処理などに使われそうな機能だ。


何に使うかは……アイディア次第?




■ 全てのシェーダーでランダムアクセスが可能に

 DirectX 11.0では、ピクセルシェーダーとCompute Shaderでのみ許されていたバッファへのランダムアクセス機能「Unordered Access View」(UAV)が、DirectX 11.1では、なんと頂点シェーダー、ジオメトリシェーダー、ハルシェーダー、ドメインシェーダー、ピクセルシェーダーの全てで利用できるようになった。

 DirectX 11.0では、ピクセルシェーダーのUAVスロットは1個だけだったが、DirectX 11.1では、頂点シェーダー、ジオメトリシェーダー、ハルシェーダー、ドメインシェーダー、ピクセルシェーダーの全てで共有する形にはなるがUAVが64スロット持てる。

 同様に、DirectX 11.0のComputeShaderは、8UAVだったが、これがDirectX 11.1では64UAVに拡張されている。

 頂点とピクセルという次元を越えたデータのScatter処理や、シェーダーステージをまたぐような相互のデータのやりとりができるようになるため、全く新しいレンダリングアルゴリズムを構築できる可能性が出てきた。


「UAV機能の大幅な強化」……これこそがDirectX 11.1の目玉機能であると主張する開発者も少なくない




■ 終わりに〜DirectX 11.1はWindows 8 SDKの一部として提供される


DirectX 11.1に関するより詳細な情報はこの画面に記載されているサイトを参照頂きたい

 これまで、DirectXランタイムは単体で提供されてきたが、Windows 8発売前の現時点、それもWindows 8 Consumer Preview版が公開されたばかりの今においては、「Windows 8 SDK」の一部としてのみ提供されている。

 かつてのDirectX 11.0が、Windows 7の発売後にWindows Vistaに単体提供されたことを考えると、DirectX 11.1のWindows 7/Vistaへの単体提供は、Windows 8の発売を待ってから……と言うことになるのだろう。

 その意味では、既に発表済みのAMD RADEON HD7000系の本領発揮は、まだ先になりそうだ。同様に、近々出てくると言われるNVIDIA Keplerも、当面は高速版DirectX 11.0世代GPUとして活用されることになるはずだ。

 なお、本記事以上のDirectX 11.1に関する詳細情報を参照したい場合には、MSDNのDirectX 11.1ページを参照し頂きたい。

(2012年 3月 9日)

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