連載
西川善司の3DGE:GTX 980 Ti用として披露されたDX12ベースの新作デモ「MECH Ti」,その技術に迫る
NVIDIAのデモ開発チームは,そんなGTX 980 Tiのリリースに合わせて,Windows 10&DirectX 12対応の新作技術デモ「MECH Ti」(MECH Ti Feature Demo)を開発し,COMPUTEX TAIPEI 2015の会場近くにあるホテル「Grand Hyatt Taipei」内にある同社プライベートブースにおいて披露していた。
本稿では,このMECH Tiに組み込まれた要素技術を細かく見てみたいと思うが,まずは,下のビデオを見てもらいたい。これは,展示されていたGTX 980 Ti搭載機からHDMI出力された映像を,ビデオキャプチャデバイスで録画したものである。
DX12の「Conservative Rasterizer」を活用する「Ray Traced Shadows」
MECH Tiの影生成には「Ray Traced Shadows」(※リンクをクリックするとpdfファイルのダウンロードが始まります)と呼ばれる技術が採用されている。開発を担当したのはNVIDIAのJon Story氏(Senior Developer Technology Engineer)だ。
ご存じの人も多いと思うが,今日(こんにち)のGPUにおいて,他者からの遮蔽によって生じる「影」は,自動的には得られない。そのため,影を描画するためには,別途,影を描画する処理系を実装して走らせる必要がある。
デプスシャドウ技法では,シャドウマップ解像度に依存したジャギーが描画した影に出てしまう |
解像度が十分に高くできれば鋭い輪郭の影生成を行える一方,広いシーンで品質を保つには,巨大なサイズのテクスチャでシャドウマップを生成する必要が出てくる |
ただ,デプスシャドウ技法では,影生成元となる光源から,シーン内の全オブジェクト(=遮蔽物)までの距離をテクスチャに描画して,遮蔽物までの距離の分布データをシャドウマップ(Shadow Maps)として最初に生成するのだが,影描画にあたっては,このシャドウマップ解像度(≒テクスチャ解像度)に依存したジャギーが出てしまう弊害と闘わなければならなかった。
ステンシルシャドウボリュームではこのジャギーが出ないというのが優位点だったのだが,デプスシャドウ技法が勝っ(てしまっ)た結果として,「ジャギーを淡くボカして,ジャギー感の露呈をごまかす」というのが,ゲームデベロッパにおける定番のやり方になっている。
それに対して,新開発のRay Traced Shadowsは,そうしたジャギーを低減しつつシャープな影生成を行えるようになっており,かつ,必要であれば影の投射距離に比例したボケ具合を実現するような,リアルなソフトシャドウ表現も行えるのが特徴だ。
Ray Traced Shadowsが持つアルゴリズムの概念自体は,デプスシャドウ技法のパイプラインと似て非なるものだ。
まず,影生成元となる光源からシーン全体を見下ろして,シーン内のオブジェクト(遮蔽物)までの距離をテクスチャにレンダリングする。デプスシャドウマップ技法だと,ここで,ピクセル(=テクセル)に分解されたシーン内のオブジェクトのシルエットが,光源までの距離情報と共に書き出されるのだが,Ray Traced Shadowsでは,ピクセルに分解した情報を書き出すのではなく,その遮蔽オブジェクトを構成するのポリゴンの情報を書き出すのである。
この3DテクスチャをRay Traced Shadowsでは「Deep Primitive Map」と命名している。なお,ここでいうPrimitiveは「ポリゴン」という解釈でいい。
Deep Primitive Mapは階層構造になっていて,光源からの光を遮蔽している部位のポリゴンの枚数とそのポリゴンIDを,適当な分解能(N×N)で記録する。そのため,多ポリゴンモデルになると,光を遮蔽するポリゴンの枚数が多くなり,すべての情報を記録できないケースも生じうるため,何枚までのポリゴン情報を記録しておけるかのカウント数(d)も慎重に決定しなければならない。
NVIDIAの実装では,この「N×N×d」を1024×1024×32(128MB)〜1024×1024×64(256MB)で確保していたが,「最適な設定」は,影生成元となる3Dモデルが持つポリゴンの数や,影の投射先となるシーンの大きさに配慮しながら,適宜決定する必要があるだろう。
Ray Traced Shadowsでは,このDeep Primitive Mapを生成する部分で,DirectX 12の機能を採用している。
「遮蔽部位を構成するポリゴン情報がDeep Primitive MapのN×Nにおいてどこに記録されるべきか」は,ラスタライザによってポリゴンをピクセルに分解して判定することになる。そしてここで,ラスタライズ処理によって「ポリゴンの一部が少しでもN×N解像度にかかっていたら,ポリゴン情報をDeep Primitive Mapに記録する」のに,DirectX 12(もしくはDirectX 11.3)の「Conservative Rasterizer」機能を活用するのだ。
具体的には,ライティング対象として着目しているピクセル位置から,影生成元の光源に向かってレイ(ray)を飛ばし,Deep Primitive Mapを読み出して,Deep Primitive Map内にあるいずれかのポリゴンに衝突しているかどうかを,おおざっぱに判定する。そのうえで,衝突していると判定できた場合には,当該ポリゴンの向きや形状を読み出したうえで,レイとの衝突判定をより正確に行って,「影か否か」を判断するという流れだ。
影と判断できる場合は影として描画することになるわけだが,レイがどのくらい空間を旅して衝突したかの情報を基にすれば,影の投射距離も分かる。なので,投射距離が長ければ長いほど淡い影にすれば,投射距離に応じたソフトシャドウも描けるわけである。
仮にゲームで採用するとしても,プレイヤーの視点から近距離にいる主要なキャラクターに対象を限定したり,クローズアップショットが多くなるイベントシーンに限ったりすることになりそうだ。
DX12の「Volume Tiled Resources」を活用する「Sparse Smoke」
PlayStation(以下,PS) 4とXbox Oneが実際に市場へ登場するまでの間,業界では,「PS4&Xbox One世代のゲームグラフィックスではボリュメトリックな流体表現が本格化するはず」と言われ,けっこうな期待感も持って迎えられていたのだが,実際のところはといえば,PS3&Xbox 360世代と同様の,パーティクルベースの表現手法が今もってなお支配的である。
ボクセルで管理するパラメータは圧力や速度,渦度(渦巻運動ベクトル)などで,これらのパラメータからグリッド間で生じる流体の移流度を計算し,グリッド単位の圧力や渦度や速度も更新させる。現実世界の場合,ある単位時間(Δt)内ですべての空間同士が互いに影響し合うが,コンピュータの場合,時間も空間も離散で計算することになるため,少しでも再現の正確性を高めるため,この計算は,性能の許す分だけ,複数回,反復的に実行し,その結果を採用するのが一般的である。
グリッド管理されている流体情報の描画にあたっては,CTスキャンやMRIスキャンでデータの描画に使われることの多い「Maximum Intensity Projection」(最大値投影法)を用いることも多いが,MECH Tiデモでは「Ray Marching」(レイマーチング)を活用している。
レイマーチングというのは,レイトレーシングのようなもので,描画対象となるピクセルから視線方向にレイを飛ばし,流体情報を格納しているグリッドにレイを潜らせる。そのうえで,レイが進むたびに,当該グリッド内の流体密度をサンプリングし,ライティング計算を行っていくことになる。
では,このデモにおける流体表現のどのあたりがDirectX 12的かというと,流体を管理するグリッドの確保法,ということになる。
MECH Tiでは,流体シミュレーション用のグリッドを複数個まとめた固まり――NVIDIAはこれを「Brick」(ブリック,以下カタカナ表記)と読んでいる――を1タイルあたり64KBで管理し,この固まり(=ブリック)を,ローカルのグラフィックスメモリ上で動的に有効化していく仕組みを実装している。
逆に言うと,流体情報を保持していない,空きグリッドだらけの空きブリックは,ローカルグラフィックスメモリから仮想メモリへとオフロードされることになる。いわゆるスワッピング処理に相当する処理が行われるわけである。
この問題に対して,Volume Tiled Resourcesでは,「ブリック出し入れの予測エンジン」をCPU側のスレッドで走らせることによって対応しつつ,メインシーンの描画に対する流体描画の遅延を2フレームほど許容する設計になっている。流体はほとんどのケースでぼんやりとしたものなので,こうした実装でも構わないだろうという判断のようだ。
DX12の機能を活用してはいないが,MECH Tiでアピールされる「Screen Space Reflections」
MECH Tiデモの中頃で,注目の表現技術の1つとしてアピールされる「Screen Space Reflections」(スクリーンスペースリフレクション)は,キャラクター自体の部位がキャラクター自体に映り込んで見える表現だが,結論からいうとこれは,DirectX 12とはあまり関係のないグラフィックス表現技術だったりする。
これは,普通にシーンをレンダリングした後で,映像中の鏡面材質において,視線を反射する方向にレイを放ち,局所的なレイトレーシングを行うことで表現するものとなっている。
描画結果としての映像は平面でしかない。しかし,レンダリングが終わった後でも,当該シーンの奥行き構造を記録した深度バッファの内容は残っているので,その深度バッファを立体空間と見立てて,それに対してレイを放つのだ。放たれたレイが他者に衝突したら,深度バッファの位置に対応する映像フレームのピクセルカラーを持ち帰って,その鏡面材質箇所に描き込んでやる。すると,これが嬉しいことに,局所的な映り込み表現となるのである。
いかにもリアルタイム3Dグラフィックスといった,“2.5D”的なポストプロセステクニックによる鏡像生成は,「Realtime Local Reflections」(リアルタイムローカルリフレクション)とも呼ばれる。もともとはCrytekが「Crysis 2」に実装したのが始まりだったので(関連記事),Realtime Local Reflectionsという名前のほうで覚えている人も多いだろう。
開発者に向けたショウケースとなるMECH Ti
公開はWindows 10の発売前後か
現在,NVIDIAが技術デモ向けに開発・実装した高度なリアルタイム3Dグラフィックス技術は,同社のゲーム開発支援ブランド「GameWorks」のソフトウェア開発キットに,ライブラリとしてどんどん追加されている。
DirectX 12やDirectX 11.3の新機能は,どう便利なのか,一般的な開発者レベルではよく分からないものも多い。それだけに,このような実動デモの形で分かりやすい形で見せてくれるのは,開発者からするとありがたかったりするのだ。
実際,MECH TiにおけるConservative RasterizerやVolume Tiled Resourcesの活用は,「このような使い方があったのか」と気づかせてくれるユニークなものなので,開発コミュニティへの影響も小さくはないだろう。
ちなみにこのMECH Tiデモ,NVIDIAによると,近々一般公開もされる予定とのことだ。DirectX 12ベースである以上,常識的に考えると,7月29日のOS発売以降だとは思うが,楽しみに待ちたい。
NVIDIAのGameWorks公式情報ページ(英語)
- 関連タイトル:
GeForce GTX 900
- この記事のURL: