西川善司の3Dゲームファンのためのグラフィックス講座
台頭するDirectCompute技術
DICEは「Battlefield 3」向けにDirectComputeベースのハイブリッドレンダリングエンジンを発表
「Advanced Visual Effects with DirectX 11」セッションの様子 |
今年も世界最大級のゲーム開発者会議、GDC(Game Developers Conference)が開幕した。開幕初日は例年通り、各テーマごとに基礎から応用までをコース形式にその道のエキスパートが登壇する「チュートリアルセッション(TUTORIAL SESSIONS)」が中心に執り行なわれた。
■ DirectX“12”のロードマップは示されず
毎年、最新の3Dグラフィックス技術が取り扱われるチュートリアルセッション「Advanced Visual Effects with DirectX ○○」は、○○の部分に最新のDirectXのバージョンが入ることが多いのだが、多くの来場者の期待をよそに、今年も“11”が入ることとなった。
Windows 7が発売されたのは2009年10月。その年の春に行なわれたGDC 2009では「夢に満ちあふれた未だ見ぬ新DirectX」という感じでDirectX 11の話題が取り扱われたのだが、今年は「DirectX 12はまだなのか」という空気の中、「Advanced Visual Effects with DirectX 11」が行なわれた。
ちなみに、筆者が取材した限りでは、短期的にDirectX 12(Direct3D 12)の提供はなさそうで、立体視に対応したり、KINECTに対応したりするマイナーチェンジはありうるかもしれないが、グラフィックスパイプラインに新ステージが追加されるようなアップデートは短期的には(年内には)ないと見て良さそうだ。
その意味では、短命に終わったDirectX 10時代とは異なり、DirectX 9同様に、DirectX 11時代は比較的長く続くことになるのかも知れない。ちなみに、余談だが、過去を振り返るとDirectXは奇数番号バージョンが長命に、偶数番号が短命に終わるというジンクスがある(DirectX 2、6、8、10はいずれも短命に終わり,4は欠番であった。DirectX 1、3、5、7、9は比較的、長きにわたって現役を務めた)。
■ 応用活用が進みだしたDirectCompute
「DirectX 11」(≒ Direct3D 11。厳密には異なるが、以下、一般認識にならってほぼ同義という扱いにする)というと新設されたシェーダーステージのテッセレーションステージが目玉機能と言うことでアピールされてきたわけだが、「Advanced Visual Effects with DirectX 11」セッションでは(そうした話題がなかったわけではなかったが)、そのあたりは語り尽くされたと言うこともあってか、DirectX 11のそれ以外の応用テーマについての取り扱いが中心となった。
1日、通して多く取り扱われたのは、DirectX 11のテッセレーション機能の陰に隠れてあまり目立っていなかった感のある「DirectCompute」について、だ。
DirectComputeとは、DirectX環境下で利用できるGPGPUソリューションのことで、DirectCompute利用時にはGPU内部のシェーダーユニットは頂点シェーダーやピクセルシェーダーのようなグラフィックスレンダリング用途のシェーダーではなくComputeShaderとして起用される。以前、マイクロソフトはComputeShaderを日本語で「演算シェーダー」と呼称していたが、最近はCopmuteShaderの英語読みを奨励しているようだ。用語の定義で言えば「DirectComputeを利用するとGPUのシェーダーユニットがComputeShaderとして起用されて活躍する」という感じになる。
近年、最も名を挙げたGPGPUソリューションといえばNVIDIAのCUDA……ということになるが、これはNVIDIA製GPU専用のGPGPUプラットフォームだった。一方、DirectComputeはGPUベンダーに依存しないGPGPUソリューションになる。
DirectComputeでは、「スレッド」(Threads)と「グループ」(Groups)、「ディスパッチ」(Dispatches)という階層で処理が並列に実行される。
「スレッド」はDirectComputeにおいては、プログラムコードを実行する最小単位となり、このスレッドをいくつか「グループ」化して並列に実行させることができる。「ディスパッチ」は複数の「グループ」からなるもので、その各「グループ」は並列に実行される構造となっている。
ディスパッチとグループでは、ディスパッチの方が階層構造として上位の親ということができる。そして、同一グループ内のスレッド達は、そのグループ内で共有できる高速な32KBのメモリ領域(TGSM:Thread Group Shared Memory)を介してスレッド同士の同期や連携が行なえるようになっている。
NATHAN HOOBLER氏(NVIDIA) | スレッド、グループ、ディスパッチとは? |
ディスパッチの一例 | スレッド間コミュニティサイクルは共有メモリを介して行なえる |
DirectComputeは動画像のエンコード処理やフィルタリング処理などはもちろん、ゲームなどにおいては物理シミュレーションなどへの応用が期待されており、セッションでは実際に剛体物理をDirectComputeで実装した例が紹介された。
AMDが、RADEON HD6900シリーズ向けに開発されたデモ「HK2207」で見ることのできる破壊表現に使われている物理シミュレーションがそれで、このデモでは演出上、限定的にしか使われていないが、このDirectComputeベースの物理エンジンのポテンシャル的には、シンプルな3Dメッシュで表現された3Dモデルであれば、数千個のオーダーで互いに剛体物理シミュレーションができるとのことだ。
原田隆宏氏(AMD) | AMDが実装したDirectComputeベースの剛体物理シミュレーション。これはRADEON HD6900シリーズ用のデモとして公開されたHK2207に採用されている |
■ DirectComputeにおいても最大パフォーマンスが欲しいならば
RADEONとGeForceの違いは意識しなくてはならない
DirectComputeは、確かにGPUメーカーに依存しないで活用できるGPGPUソリューションではあるが、開発者側の立場からみたときに「完全にAMD/NVIDIAを意識しなくていいか」……というとそういうわけでもない。
3Dグラフィックスレンダリングにおいては、グラフィックスリソースを設定して、レンダリングを行なう準備までがDirect3Dとして規格化されているが、実際の描画処理についてはGPUがどう処理するかはブラックボックス化されてきた。
DirectComputeでは、いわば、GPU内部のシェーダーユニットを、開発者側が、かなりの自由度を持ってComputeShaderとして起用することができるので、これまでGPUのブラックボックス化されてきた部分に関して無頓着にはいられなくなってきたのだ。
DirectCompute上では、各スレッドは個別に独立したプログラム実行ができるかのようにプログラムできるが、実際のGPU内部ではSIMT(Single Instruction, Multiple Thread)実行がなされている。つまり、1つの命令を複数のスレッドに並列実行させるという実行形態だ。
AMD RADEON系とNVIDIA GeForce系とで大きく違うのが、このSIMT実行において1度に賄える並列スレッド数だ。この単位をAMDはWAVEFRONTと呼び64個とし、NVIDIAはWARPと呼称し、その個数は32個としている。
セッションでは、「ただDirectComputeベースのプログラムを実行するだけならば意識する必要はないが、最大パフォーマンスを得るためには、この違いを意識する必要がある」ということが指摘された。
DirectComputeではDirect3D以上にRADEONとGeForceの違いを意識しなければならない? |
■ DirectComputeをあえて3Dグラフィックスに応用する理由
なぜDirectComputeを使うのか? |
今回のセッションでは、このDirectComputeが、物理シミュレーションなどの「いかにも」といった感じの応用用途以外に、「実は、3Dグラフィックス処理の高速化にも適している」ということが幾度となく語られた。
3DグラフィックスにはDirect3Dがあるわけで、なぜDirectComputeで3Dグラフィックスを行なう必要性があるのか……そうした疑問を持つ人も少なくないだろう。
実は、最新の3Dグラフィックスレンダリングパイプラインでは、プログラマブルシェーダ技術の進化で自由度が増したといっても、処理系としては一方向の流れ工程のままなのだ。
あるピクセルについて高度なシェーダープログラムを実行することはできるようになってはいるが、例えばある座標のピクセルに対しての陰影処理の結果を、(基本的には)別の座標の複数のピクセルに対して描き出すようなことはできない。また、あるいは、あるピクセルの陰影処理において、別のピクセルの陰影処理結果を受け渡して利用したりすることもできない。別の切り口で行けば、複数の特定のテクスチャを複数のピクセルで集中的に読み出して利用するケースでは、どのテクスチャが読み出されるのかがあらかじめわかりきっているのに、そのテクスチャデータ群がキャッシュに載ってくれるかどうかの確証はシェーダープログラム側からは全く期待できない。
DirectComputeは、DirectXファミリーの一員であり、Direct3Dのリソースは全て利用することができて、3Dグラフィックスパイプラインに縛られないデータ並列コンピューティングができるので、前出の制約を超えた3Dグラフィックス処理ができるはず……という期待感が生まれつつあるのだ。
Holger Gruen氏(AMD) |
セッションでは、Screen Space Ambient Occlusion(SSAO)や、被写界深度シミュレーション、各種ブラー処理など、レンダリング結果や深度値などを組み合わせた画面座標系のポストプロセスにおいては、ピクセルシェーダーで実装するよりも遙かに高速になるという実験報告をAMDが行なっていた。
AMDによれば、カーネル直径(画面座標系ポストプロセスを行なう際に、1度に処理するデータ数)が“7”以上ならば、DirectComputeの方がパフォーマンスが高くなる……とのことだ。もちろん、同一処理系で比較すれば、カーネル直径が大きければ大きいほどパフォーマンス向上率は高くなる。
これは、DirectComputeで利用できるTGSMが、マネージャブルキャッシュやスクラッチパッドメモリ的に活用できるためだ。かみ砕いて言えば、画面座標系のポストプロセス時に大量に発生するメモリアクセスをTGSMを用いて劇的に高速化できることが大きくパフォーマンス向上に結びついているのだ。
どういう条件のとき、DirectComputeによる実装の方が高速になるのか | 被写界深度のシミュレーション | その処理系の概念 |
実行結果(被写界深度シミュレーションOFF) | 実行結果(被写界深度シミュレーションON) | パフォーマンス比較 |
■ DirectComputeを本格的にレンダリングエンジンに応用した「Battlefield 3」
3DグラフィックスにおけるComputeShader活用は、画面座標系ポストプロセスのようなワンポイントリリーフ的な活用法だけでなく、レンダリングパイプラインの根幹にDirectComputeを取り込んだ実例も紹介された。
Johan Anderson氏(DICE、Rendering Architect) |
「Battlefield 3」の開発元として知られるゲームスタジオのDICEは、自社ゲームエンジンのレンダリングエンジン部において、ライティング処理をDirectComputeで実装したことを報告した。
DICEの最新ゲームエンジンは「FROSTBITE 2」エンジンと呼ばれ、早期からDeferred Shading(Deferred Rendering)パイプラインベースで開発されていることが告知されていた。DirectX 10.1ベースのAMD GPU、RADEON HD4000シリーズが発表された時にも断片的にそのエンジンデモが公開されたことがあったが、あれから開発が進み、DirectX 11ベースのレンダリングエンジンに設計が改良されたようだ。なお、FROSTBITE 2エンジンは、プレイステーション 3、Xbox 360にも対応するが、これは当然DirectX 9ベースの設計となる。
Deferred Renderingのアルゴリズムの詳細についての詳細は本連載の「KILLZONE 2編」を参照して欲しいが、最大のメリットは、シーンに適用できる動的な光源数に制限が(ほとんど)無いという事が挙げられる。しかし、光源の数が多かったり、複数の光源が特定箇所に著しく集中したりするととてつもない反復描画が重なることになり、かといって同一画面内において全く反復描画が起こりえない箇所も発生する。
そこでDICEは、この不均衡を是正してパフォーマンスを向上させるために、このDeferred Renderingをタイルベースで行なう実装に踏み切ったのだ。具体的には1タイルを16×16ピクセルとして、各タイル内のピクセルに対してのライティングをDirectComputeで並列実行させる処理系を実現している。
この実装により、3Dグラフィックスパイプラインのピクセルシェーダー仕様制限を遙かに超越した大量の動的光源を用いつつ、複雑な材質表現を行なうことができる。
グラフィックスパイプラインで実装した一般的なDeferred Renderingでは、単一のシェーダーにて様々な材質表現を行なわなければならないが、DirectComputeのこの実装ではタイルごとに個別のシェーダーが利用できるし、また各種テクスチャ処理についても、TGSMを利用したメモリアクセス高速化の恩恵も得られる。
DICEでは、このDirectComputeを用いて実装したレンダリングエンジンをハイブリッドパイプラインと呼称しているが、確かに新しいレンダリングエンジンの形としてユニークだ。今後、注目を集め、様々な改良形や亜流の実装なども台頭してくるかも知れない。
DICEは、「Battlefield 3」のために全く新しいレンダリングエンジンを設計した |
Deferred Shading(Deferred Rendering)をタイルベースにし、さらにDirectComputeに実装したDICE |
Deferred Renderingのライティング部分をDirectComputeで実装 | 「FROSTBITE 2」のテクノシローデモから。球に映り込んでいるハイライトは環境マップではなく、動的光源からのライティングの結果として出ているものだ |
□Game Developers Conference(GDC)のホームページ(英語)
http://www.gdconf.com/
(2011年 3月 1日)