連載
西川善司連載 / 完全理解「3DMark 11」(前)〜レンダリングエンジンの秘密
2010年12月7日,業界標準3Dベンチマークシリーズとして知られる,Futuremarkの「3DMark 11」がリリースされた。
「動作には,DirectX 11世代,Shader Model 5.0仕様のGPU環境が必須」という思い切った足切り策は,ベンチマーカーやPCゲームファンに,かなり強いインパクトを与えたのではないだろうか。
動作環境や,無償版や有料版など3つ用意されたエディションの詳細は,別途掲載してある3DMark 11紹介記事を参照してほしい。本稿では,数回に分けて,3DMark 11で使用されている3Dグラフィックス技術にフォーカスし,解説していくことにする。
Futuremarkは,3DMarkの開発コンセプトとして,「現在のPCゲームだけでなく,数年先のPCゲームの負荷形態を想定した作りとする」というのを掲げている。
一般的なPCゲームにもベンチマークモードを搭載したものはあるが,それはそのPCゲームを動作させるのに必要なハードウェアスペックを推し量るのに利用されるものである。これに対し3DMark 11では,GPUやCPU,あるいはマザーボード,メモリシステムなどといった最新のハードウェアが登場したとき,「そのハードウェアが『近未来に出てくるかもしれないPCゲーム』をどのくらい高速に動かせるか」がテーマになっている。
これは,新しい3DMarkがリリースされるたびFuturemarkが繰り返す宣言文であり,要するに3DMark 11も,従来の3DMarkと同じ立ち位置にあるということだ。
言い換えると,ここ数年の間に出てくるだろうハードウェアで,スコアが飽和しない程度の“重い”作りにしているということだが,Futuremarkは,「闇雲に無駄な高負荷を掛けるのではなく,ここ数年の間に主流となるはずのPCゲームの構造を模した形で高負荷にしている」と主張している。
DirectX 11ではレンダリングパイプラインに新しいシェーダステージが追加された。それがテッセレーションステージ(Tessellation Stage)だ。
テッセレーションステージとは簡単に言うと,「ポリゴンをプログラマブルに分割したり,3Dモデルを粘土細工よろしく部分的に盛ったり削ったりできるる機能」のこと。「ハルシェーダ」(Hull Shader)と「テッセレータ」(Tessellator),「ドメインシェーダ」(Domain Shader)という,3つのシェーダステージからなっている。
テッセレーションステージは3つのシェーダステージから成る。左は各シェーダステージの処理をイメージ化したものだ。右は,DirectX 11のレンダリングパイプラインにおいて,テッセレーションステージがどこに置かれるかを示したもの(※出典:『ゲーム制作者になるための3Dグラフィックス技術』(西川善司著/インプレスジャパン刊)
3DMark 11では,そんなDirectX 11のテッセレーションステージを活用しているわけだが,Futuremarkによると,その活用方法は2通りに大別できるという。
1つはディスプレースメントマッピング(Displacement Mapping)主導で行われるテッセレーションで,「テクスチャで表現した凹凸情報(ディスプレースメントマップ)を基に3Dオブジェクトを盛ったり削ったりして,ディテールを付加する」ようなものになる。
3DMark11の「Advanced」タブから,「Tessellation Detail」と「Max Tessellation Factor」スライダーを用い,ディスプレースメントマッピングの効果を最大にした状態(左)と最小にした状態(右)を比較したもの。凹凸の付き方に違いが見て取れる
ディスプレースメントマッピングを実行する実質的な主体は通常,テッセレーションステージ中のドメインシェーダになる。しかし3DMark 11では,テッセレータを用いてポリゴンの細分割も行うことで,極力ハイディテールなディスプレースメントマッピングを実践しようとする設計になっているのが特徴だ。
なお,ポリゴン分割を行うときの「新たな頂点位置」は,基本的に,ディスプレースメントマップの解像度基準で選択されるアルゴリズムになっている。盛ったり削ったりといった,ドメインシェーダによる実際の変位操作は,その頂点の法線ベクトルが滑らかになるように行われるという。
さて,3DMark 11におけるテッセレーションステージ,2つめの活用方法は,フォンテッセレーション(Phong Tessellation)のアルゴリズムを用いた3Dモデルのスムージングになる。こちらは,3Dモデルを滑らかに見せるための成形が主目的になるわけだが,アーティストの設定に応じて,ディスプレースメントマッピングも行えるような設計になっている。
3DMark 11のAdvancedタブ,「Tessellation Detail」スライダーから,テッセレーションの適用度を最大にした状態(左)と最小にした状態(右)の違い。体積の違いと輪郭の滑らかさに注目
フォンシェーディングとフォンテッセレーションのイメージ
CEDEC 2010においてカプコンは,PC版「ロスト プラネット 2」をテッセレーションステージに対応させる過程でフォンテッセレーションの採用を検討したが見送ったと明らかにしていた
フォンテッセレーションについて簡単に説明しておこう。これは,独ベルリン工科大学のTamy Boubekeur氏とMarc Alexa氏が考案したテッセレーションアルゴリズムだ。
ベースになっているのはフォンシェーディング(Phong Shading)の考え方。フォンテッセレーションは,フォンシェーディングのジオメトリ版というイメージになる。
フォンシェーディングは,ポリゴンの各頂点にしか与えられていない法線ベクトルを用い,ポリゴン内の全域でピクセル単位の滑らかなライティングを行うものである。具体的には,各頂点の法線ベクトルが滑らかにつながるように線形補間することで滑らかな陰影を作り出すものだった。……物理的な正確性はともかくとして。
フォンテッセレーションでは,テッセレーション対象となるポリゴンの頂点座標から重心座標を求め,これをポリゴン分割点としてテッセレーションを行う。そして,テッセレーション対象となるポリゴン各頂点の法線ベクトルが自然につながる位置に,ドメインシェーダで分割点を変位させる。
その変位量は適当な定数で与えることになるため,生成される曲面の連続性は低くなりがちだ。とはいえ,シンプルであるがゆえに高速という利点もある。
フォンテッセレーションのアルゴリズム解説動画
3DMark 11においては,テッセレーションステージの活用方針が2種類あるわけだが,どちらにおいても,ポリゴンの分割(=テッセレーション)は行われる。そして3DMark 11では,このテッセレーション工程において,LoD(Level of Detail)システム的な適応型のアルゴリズムを介入させている。
LoDシステムとは,視点からの距離に応じて処理精度を適宜切り換えていくテクニックのこと。具体的には,視点から遠く,小さく表示される3Dオブジェクトは低ポリゴンで表現し,視点から近く,アップで表示される3Dオブジェクトについては,そのディテールが伝わるように高ポリゴンで表現するといった処理系を指す。
3DMark 11のテッセレーションにおいて,「どのくらいの分割度数でポリゴンを分割するのか」という分割因子(Tessellation Factor)は,視点からの距離ではなく,「分割対象としているポリゴンの一辺が,画面解像度で何ドットくらいの長さか」に配慮して決定されている。難しく言えば,「画面座標系に配慮した分割解像度決定アルゴリズムを採用している」わけだ。
表現しようとする形状によっては,過剰に分割しても意味がない場合もあるため,3DMark 11では各3Dオブジェクトに対して,Futuremarkのアーティストが「奨励されるポリゴン分割度」をあらかじめ設定してあるとのことである。
分割対象となるポリゴンの一辺が,それほど多くのドット数でないときは,そのポリゴンをさらに分割しても,恩恵は映像として現れにくい。そのため,そういった部分では分割を行わないケースもあるという。また,ポリゴンの一辺が多くのドットからなる場合でも,アーティストが事前に設定している最大分割上限数を超えての分割は行われないそうだ。
AdvancedタブからTessellation DetailとMax Tessellation Factorスライダーを最大に設定したうえで,解像度1920×1080ドット(左)と1176×664ドット(右)とでレンダリング結果を比較したもの。見た目に違いはほとんど分からない
上のシーンをワイヤーフレームで表示させたところ(※一部を切り出し,さらにサムネイルは解像度を揃えるべく1176×664ドットのほうを1920×1080ドットにリサイズしたものを使っている)。同一か所でテッセレーションやディスプレースメントマッピングの精度が違うことがよく分かる
視点から遠いところにある3Dオブジェクトにおけるポリゴンの一辺は,ドット数が減るためポリゴン分割の抑制がかかり,近いところにある3Dオブシェクトにおけるポリゴンの一辺は,ドット数が多くなるために比較的多くのポリゴンに分割される傾向が生まれる。視点からの距離基準で処理する一般的なLoDとは異なるものの,ある意味では,視点からの距離に応じたポリゴン分割が実践されていることに近いと言えなくもない。
ただ「仮にその3Dオブジェクトが視点から遠くにあっても,そのときの画面解像度が高いときには,定められた上限の範囲内で的確にポリゴン分割が行われる」という点では,3DMark 11におけるテッセレーションのほうが優れているといえる。
要するに3DMark 11の場合,画面解像度が上がると,同一のシーンでもより多くのテッセレーションが行われ,いきおいテッセレーションステージに負荷が掛かる可能性が大きくなるわけだ。
3DMark 11のテッセレーション工程には,高速化のための最適化アルゴリズムも盛り込まれている。
それは,「視点から見て裏側に位置するポリゴンは,テッセレーションを省略するだけでなく,カリング(Culling,間引くの意)してしまう」というもの。3Dモデルの裏側にあるポリゴンは通常,後段のピクセルパイプラインにおいて,実際のピクセル描画時の深度(Z)テストでカリングされるが,この工程の一部をテッセレーションステージ側で先行して行ってしまうのだ。半透明オブジェクトが多数登場するようなグラフィックスでは,このテクニックは使えないが,3DMark 11では,そうしたタイプの3Dオブジェクトはほとんど登場しないため,問題はない。
なお,3DMark 11において,このテッセレーションステージにおける隠面除去的な処理は,ハルシェーダが担当する。「テッセレーションにおける隠面除去」にあたっては,視点から見た表裏面判定だけでなく,その3Dオブジェクトが視界に入っているか否かの視界内外判定も同時に行われている。
こうした早期カリング処理をわざわざこの処理系を盛り込んだ理由が,3DMark 11にはある。
というのも,3DMark 11のテッセレーション工程では,入力されたポリゴンの表裏をハルシェーダでチェックし,「視線に相対しているか否か」の判断を行っているのだ。
Advancedタブの「Max Tessellation Factor」から,同一解像度で,テッセレーション処理における分割度数を変化させたショットの比較。上から順に最大(設定値15),中間(同11),最低(同6)だが,より高い設定だと,赤い珊瑚や右奥の柱といった,視線と相対する部分のポリゴン数は,設定値に関わらず分割度数が下がりにくくなるよう調整されているのがよく分かる
「視線のほうを向いていないポリゴン」は裏向きと判断できるため,カリングが行われる。それ以外のポリゴンでは,前述した「ポリゴン一辺のドット長に基づいた分割制御」が行われるのだが,3DMark 11ではここに,「表向きの(=視線の方に向いている)ポリゴンに関しては,なるべく分割度数(=分割頻度)を下げないようにする」という,特殊な制御が1つ入る。
要するに,視線に対して3Dオブジェクトの表面側に現れる部分は,なるべく細かさを維持しようというわけである。
3Dオブジェクトの輪郭に対し,多ポリゴンを維持気味にテッセレーションをかけていくというのは,適応型テッセレーションアルゴリズムにおける定番の手法だが,3Dオブジェクトの表面内部側に対して多ポリゴンの維持を行う制御はあまり聞かない。これには何の目的があるのか。
Futuremarkによると,これは,3Dオブジェクトが目前を横切る場合など,連続的な動きから伝わってくる立体感を表現するとき,重要になるからだという。いわゆる「時間方向の視差効果による立体感表現」に貢献するということだ。
また,表面側における多ポリゴンの維持は,スクリーンスペース・アンビエントオクルージョン(Screen Space Ambient Occlusion)において細かい陰影を作り出すことにもなり,効果が大きいと,Futuremarkは指摘している。
なお,影生成のためのシャドウマップ生成フェーズにおいても,影の生成元となる3Dオブジェクトに対してはきちんとテッセレーションが行われる。ここでテッセレーション工程に手抜きはなく,最終的に見せる映像のレンダリング時に適用されるテッセレーション工程と同一のアルゴリズムを用いて,同一のポリゴン分割度数で行われるという。説得力のあるセルフシャドウを生成するため,妥協できない要素だったようだ。
3DMark 11のレンダリングエンジンは,最近にわかに流行しつつあるディファードレンダリング(Deferred Rendering)ベースとなった。
ディファードレンダリングとは,Deferred(遅らせた)というキーワードが意味するとおり,「ひとまず高度なシェーダを一切動作させずにシーンをレンダリングしつつ,その間にさまざまな中間値を複数のバッファに出力。後段で高度なピクセルシェーダを動かし,それら中間値を基にしてライティング計算を行い,最終的なレンダリング結果を得る」という,一見すると風変わりなレンダリング手法のこと。
一種の「変わり種のマルチパスレンダリング手法」とも言えるこのディファードレンダリングには,GPUでサポートされる動的光源の数の上限を撤廃できるというメリットがある。
一般的な3Dグラフィックスでは,3Dオブジェクト1つ1つに光を当ててその質感をシェーディングするというアプローチとなる。そのため,1つのポリゴン(≒ピクセル)に対して当てられる動的光源数には上限があり,光源が移動している場合は,各3Dオブジェクトが影響を受ける光源数が動的に増減することとなって,ピクセルシェーダプログラムの設計が非常に難しくなってしまう。
一方,Deferred Renderingでは,先にライティングなしでシーンを生成してしまい,これに対して後工程として(ポストプロセス的に)必要な数だけ光源の影響を描き込んでいく。3Dオブジェクトを,ライティングを行いつつ描いていく一般的なレンダリング手法と違って,3Dオブジェクトをいったん全部描いてしまってから,あとで光を当てていく感じになるので,ライティングに利用できる動的な光源数に制約がないのだ。描画負荷に応じて増減することすら可能である。
なお,ディファードレンダリングには,その亜流手法としてライトプリパスレンダリング(Light Pre-Pass Rendering)というものもあり,こちらも,採用例が増えつつある。下で示したような期待のビッグタイトルは,すべてDeferred系のレンダリングエンジンを採用しており,Deferred系のレンダリングテクニックは,近年のレンダリングエンジンの一大潮流となりつつあるのだ。
なので,「近未来の3Dゲームグラフィックスを先取りする」というコンセプトを掲げているFuturemarkにとって,3DMark 11でこのレンダリング手法を選択したのは理にかなった決断だったと言える。
Deferred系レンダリングを採用する最新世代のタイトル。上段は左から順に「Deus Ex」(スクウェア・エニックス),「METAL GEAR SOLID RISING」(KONAMI)。下段は左から順に「KILLZONE 3」(Sony Computer Entertainment),「Crysis 2」(Electronic Arts)
ところでFuturemarkは,3DMark 11におけるディファードレンダリングベースのレンダリングエンジンでは,下に挙げる5つのバッファを用いてレンダリングを行うとしている。コロン(:)の右はそれぞれのフォーマットだ。
- Diffuse:DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- Specular:DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- Normal:DXGI_FORMAT_R10G10B10A2_UNORM
- Ambient Occlusion:DXGI_FORMAT_R8_UNORM
- Depth:DXGI_FORMAT_R32_TYPELESS
全部で5つのバッファがあるが,最初のレンダリングパスで,ここに5種類の中間値を格納していくことになる。DirectX 11では,1回のレンダリングパスで最大8個のバッファへ同時出力レンダリングできるので,これら5個の中間値は一回のレンダリングパスで出力可能だからだ(※ただし,「5MRTを利用している」というFuturemark側の発表はない)。
それぞれのバッファの用途について簡単に解説していくことにしよう。
拡散反射(Diffuse)バッファは,後述する拡散反射モデルのライティング結果を格納するためのバッファになる。最初の中間値生成パスでは,おそらく,画像テクスチャ(=デカールテクスチャ)などを適用した結果が格納されると思われる。
鏡面反射(Specular)バッファは視線方向や光源方向,その面(ピクセル)の向き(法線)のすべてに依存した陰影を格納する用途で用いられる。詳しくは後述。
最初の中間値生成パスでは,各3Dオブジェクトに適用されるスペキュラマップに記録された鏡面反射強度などを格納するものと推測される。
法線(Normal)バッファには,最初の中間値生成パスでピクセル単位の法線ベクトルを格納する。それなりに高い精度を維持すべく,このバッファは10bit×3が割り当てられているため,法線ベクトルのx,y,zは各10bit整数(固定小数点)で記録されることとなる。
3DMark 11におけるスクリーンスペース・アンビエントオクルージョン(Screen Space Ambient Occlusion)は地平線ベースのものが実装されている。資料はCEDEC 2008「NVIDIA 開発の鉄人」より
環境遮蔽項(Ambient Occlusion)バッファは,環境光からの遮蔽状況をピクセル単位に記録しておく用途に用いられる。最初の中間値生成パスではとくに使われないが,後段のレンダリングパスでは,前述した法線バッファの内容と,次に述べる深度バッファの内容とを参照して,「各地点が他の地点にどれくらい遮蔽されているか」を計算し,これを8bitの濃淡値として出力するのに使われるわけだ。ちなみに,このバッファは8bitの1要素バッファとなっている。
最後に深度(Depth)バッファは,そのシーンの視点から見た奥行き情報をピクセル単位で記録する用途で用いられる。なお,このバッファは整数32bitの1要素バッファとして確保されているので,おそらく,Zバッファに格納される非線形の深度値ではなく,線形量の深度値が格納されているはずだ。
ディファードレンダリングでは,前段においてレンダリングした画面座標系の「ライティングしていないシーン」に対して,後段のレンダリングパスで“光源を描き込む”ようなイメージでライティングを行っていくというのは先ほど説明した。
3DMark 11ではこのうち,全方位に光を照射する点光源(Point Light)について,2回の描画発行(Draw Call)で処理する仕掛けになっている。
1回めは,視点位置がその照射範囲内に入ってこない――技術的に言うと「視錐台のNear Planeに交差しない」――光源。2回めは視点位置が照射範囲内に入ってくる光源によって,それぞれライティングを行う。これは,視点の後ろから視界内に差し込んでくる光源などといった特例処理に対応するためだ。
注目したいのは,1回めの描画発行において複数個の光源によるライティングを発行してしまうため,どんなに点光源の数が多くても,描画発行は2回で済むように設計されていること。仮に視点位置と照射範囲のかぶらない光源が100個,かぶる光源が100個あったとしても,発行される描画発行は2回だ。GPUへのオーバーヘッドは最低限になっているのである。
一方,全方位ではなく,一部の方向に光を照らすスポットライト(Spot light)的な光源については,光源1つにつき1回の描画発行が行われる。スポットライトの描画発行準備はマルチスレッド処理されるとのことだ。
また,各スポットライト光源は,動的な影生成にも対応するが,その際の影生成手法はデプスシャドウ(≒シャドウマップ)技法になる。
Futuremarkから,3DMark 11における影生成手法に関する詳しい解説は行われていないが,語られていない以上,「3DMark Vantage」で採用した手法から大きく変化はないと見られる。なお,3DMark Vantageにおける影生成技法の解説は,本連載のバックナンバーとなる3DMark Vantage編を参考にしてほしい。
デプスシャドウ(Depth Shadow)技法では,「当該シーンの遮蔽構造を記録しておくシャドウマップの解像度」が生成された影の品質を決定づけるが,3DMark 11において,シャドウマップの解像度は,スポットライトがどのくらいの解像度,具体的にはピクセル数を占めるかによって動的に決定されるという。つまり,画面内で当該スポットライトがたくさんのピクセルを占める場合にはシャドウマップを高解像度にする一方,そうでなければ低解像度にするといった,適応型の制御を介入させるということだ。
スポットライトによる影は,局所的なものになるため,この実装手法はインテリジェントかつ合理的だといえる。
左は,Advancedタブから,「Shadow Map Size」「Shadow Cascade Count」「Surface Shadow Sample Count」の3項目をいずれも最大に設定したときの画面。右はその状態からShadow Map SizeとShadow Cascade Countの2つを最小設定に切り替えたときのものだ。見た目の違いは最小限
左はShadow Map SizeとSurface Shadow Sample Countを最大に設定しつつ,Shadow Cascade Countのみ最小に振って,影のボカしフィルタを無効化したときの画面。縞々のエイリアシングがひどい。右は3項目すべてを最小にしたカットで,影の生成精度が下がる分,ディテール部のエイリアシングは逆に減る。3DMark 11の場合,影の品質を決定する要素として,ボカしフィルタの影響が支配的だといえそうだ
平行光源(Directional Light)でも,光源1つあたり1回の描画発行で処理が行われる。
平行光源は,太陽光のような,シーン全体を照らすような光源表現で用いられることが多く,その影生成も広範囲に及ぶ。そのため,3DMark 11の平行光源による影生成はカスケード方式のデプスシャドウ技法に対応しているとのことだ。
「カスケード方式のデプスシャドウ技法」についても,詳細は本連載の3DMark Vantage編を参照してほしいと思うが,簡単に説明すると,「影生成に必要な遮蔽構造分布(=シャドウマップ)の生成を,視点からの距離に応じて,複数のテクスチャ(=シャドウマップ)に分けて行う手法」だ。なので,平行光源の描画発行は,そのシャドウマップのカスケード枚数分,行われることとなる。
こうした一連の後段のライティングフェーズ(=光源の描き込み)は,そのポリゴン――厳密にはポリゴン上のピクセル――そのもののライティングと,「視点から当該ポリゴンまでの空間」のライティングとに分けて行われている。3DMark 11のエンジンでは,前者が「Surface Illumination」(サーフェスイルミネーション),後者が「Volumetric Illumination」(ボリューメトリックイルミネーション,Volume Illuminationとも)とそれぞれ呼ばれており,いずれも「R11G11B10_FLOAT」バッファに出力される。
このバッファは,DirectX 10のときに新設された,「R11bit浮動小数点,G11bit浮動小数点,B10bit浮動小数点」という構成の,HDRレンダリング用となるもの。11bitや10bitの浮動小数点というのはピンとこないかもしれないが,指数部がRGBいずれも5bit,仮数部はRGが6bit,Bが5bitという構成になっている(符号なし)。イメージとしては16bit浮動小数点(符号1bit,指数5bit,仮数10bit)の簡易版といったところである。
このフォーマットはPlayStation 3やXbox 360などといったDirectX 9世代のGPUと互換性がないため,いまのところあまり積極的には活用されていないが,PC専用でDirectX 11専用となる3DMark 11では後方互換を意識する必要がないため選択されたと見るべきだろう。
先ほどその名が挙がったSurface Illuminationは,3DMark 11において,拡散反射と鏡面反射,2つのシェーディングモデルが組み合わせた,よくある実装になっている。
一般的な3Dゲームグラフィックスでは今でも,計算負荷の軽いランバート(Lambert)ライティングが拡散反射モデルとして用いられることが多い。しかし3DMark 11では,近未来のゲームグラフィックスを先取りするということで,より計算負荷の高い「Oren-Nayar反射モデル」(Oren-Nayar Reflectance Model)が採用されている。これは,Michael Oren氏とShree K. Nayar氏が1993年に「ランバート・ライティングを拡張した一般化形式」として発表した,拡散反射モデルの一般形だ。
ランバートライティングは,視線の向き(=視線ベクトル)には依存しない反射結果を返すが,Oren-Nayar反射モデルの場合,拡散反射であっても視線の向きに配慮した結果になるのが特徴となる。
「表面の材質は,さまざまな方向を向いた極小面が存在する面『マイクロファセット』(Micro-facet)で構成されている」と仮定し,入射した光が顕微鏡視界レベルで反射や自己遮蔽すると想定して処理する。これがOren-Nayer反射モデルで,視線に依存した反射特性を作り出す理由だ。
Surface Illuminationで組み合わされるもう1つのシェーディングモデルなる鏡面反射では,「Cook-Torrance鏡面反射モデル」が採用されている。
一般的な3Dゲームグラフィックスでは「フォン鏡面反射モデル」が利用されることが多いが,Futuremarkは3DMark 11で,鏡面反射モデルにおいても,マイクロファセットに配慮した反射モデルを採用したというわけである。
鏡面反射はそもそも,視線の向きに依存して異方性のハイライトを返すが,Cook-Torrance鏡面反射モデルでは,マイクロファセット効果により,視線の向きや入射光の向き,ライティング対象となる面/ピクセルの向き(≒法線ベクトル)の位置関係に応じて複雑なハイライトの減衰効果をもたらす特徴を持つ。フォン鏡面反射モデルだと,ハイライトのぼやけ方が一律であるため,いかにも線形補間したような見栄えになるところ,Cook-Torrance鏡面反射モデルなら,光源の位置関係や視線と面の向きの関係によって,ぼやけ感のほとんど生じない,鋭いハイライトを返したりするのだ。
ちなみに,この特性はリアルな金属表現を行うときに有効だとされている。
3DMark 11におけるSurface Illuminationのライティングでは,ピクセルごとに,拡散反射と鏡面反射それぞれの計算結果双方を取りまとめたものが最終的な色として決定されるが,もう1つ,視点までの距離に配慮した減衰効果が付加されることも押さえておきたい。
ここで用いられるのは,「レイリー散乱」(Rayleigh Scattering)と「ミー散乱」(Mie Scattering)のモデル。現実世界でも,霧が出ているときは遠くの光や景色がぼやけて広がって見えるが,ああした現象は,光が大気の中を通る間に,大気中にある大小さまざまな塵や分子に衝突して散乱し,散乱光となって広がるために起きる。3DMark 11では,こうした現象を近似的にシミュレーションすることにも対応しているというわけだ。
3DMark 11ではさらに,「そのライティングしたピクセルが,他者に遮蔽されているか否か」,つまり,影となっているか否かについても吟味される。ここで使われるのは,前述したディファードレンダリング用の環境遮蔽項(Ambient Occlusion)バッファに出力された陰影の値や,影生成のためのシャドウマップ値だ。なおFuturemarkによれば,シャドウマップへの参照は4×4のディザパターンで行われるとのことで,DirectX 11の新設機能である「Gather」命令を利用しているものと推察される。
上でSurface Illuminationと併記したとおり,3DMark 11のレンダリングエンジンは,Volumetric Illuminationと呼ばれるユニークなライティングフェーズを内包している。
3DMark 11におけるVolumetric Illuminationは,以下に挙げる2要素を統合するのが大きな特徴だ。
- 実体のない塊(≒Volume)のレンダリング
- Surface Illuminationによってライティングされたピクセル色が視点に届くまでに散乱して減衰するシミュレーション
ちなみに,1.は一般的に「Volumetric Rendering」(ボリューメトリックレンダリング,Volume Renderingとも)と呼ばれることが多いが,3DMark 11ではそれに加え,実体のない塊を通り越して見えてくる様子もシミュレートしているということになる。
3DMark 11におけるVolumetric Illuminationでは,視点からレイ(ray,線)を飛ばすのではなく,Surface Illuminationによってライティングされたポリゴン上のピクセルからレイを飛ばす実装になっている。レイは,各光源ごとに,ライティングされた各ピクセルから1本ずつ,視点に向けて放たれる。
飛ばされたレイは,視点に向かって空間を突き進んでいくが,3DMark 11のVolumetric Illuminationでは,その過程で起きる光散乱に配慮する設計となっている。なお,この光散乱のシミュレーションには,先ほども登場したレイリー散乱(Rayleigh Scattering)とミー散乱(Mie Scattering)のモデルが利用されている。
飛ばされたレイは,いくつかの深度レベルごとに,ボリュームに潜ったか(=衝突したか)どうかが判定され,潜った場合は該当するボリュームデータがサンプルされる。
別シーンで同じ比較を行ったもの。一部で輪切り状のエイリアシングが見て取れる。ボリューム密度分布テクスチャの配置間隔差か,あるいは,飛ばしたレイのボリュームデータにおけるサンプル頻度の差が生んだアーティファクトだろう
3DMark 11におけるボリュームレンダリングは,密度――正確には反射濃度値(Optical Density)――に配慮したライティングが行えるようにもなっている。反射濃度値とは,煙に喩えるなら,その煙粒子の濃淡分布のようなものだ。
3DMark 11で,この反射濃度値はプロシージャル技術的なノイズ関数によって制御されている。各フレームごとに「ノイズ関数を用いて当該ボリュームの密度分布を複数の2Dテクスチャ配列へと出力する」処理が行われ,それらが,視点から適当な等間隔で配置される流れだ。
つまり,飛ばされたレイは,ボリュームデータをサンプルするときに,この密度分布が記録された2Dテクスチャ配列もサンプルする。さらに,「視点から見た,当該ボリュームにおける光の透過率(Transmittance)」を,別の2Dテクスチャ配列として持たせることもできるように設計されている。
なお,密度分布用の2Dテクスチャ配列には1要素16bit浮動小数点バッファが,透過率分布用の2Dテクスチャ配列にはRGB各10bit+α2bitの整数バッファがそれぞれ用いられているとのことだ。
3Dmark11のレンダリングエンジンには,画像処理的な――あえて喩えるならばフォトレタッチ的な――アプローチで描画結果を加工するポストプロセスフェーズが設けられている。
こうしたポストプロセスの代表的な効果の1つである「ボケ」をもたらす被写界深度のシミュレーションは,3DMark 11だと,ジオメトリシェーダを駆使する,凝った設計になっているのが特徴だ。
まず,レンダリング結果に対して,「想定したピントからどれくらいずれているか」の距離情報を,レンダリングを終えたあとの深度バッファの内容から計算して,1要素の16bit浮動小数点バッファにフル解像度で記録する。Futuremarkはこのバッファを「Circle of Confusion」(許容錯乱円)バッファと命名している。許容錯乱円とは「実用上,ピントが合っていると判断して差し支えない領域」のこと。3DMark 11で用いられいるCircle of Confusionバッファは実質的に,オフセット値を与えた深度バッファのような内容になる。
3DMark 11のエンジンでは次に,レンダリング結果と,そのCircle of Confusionバッファの内容を,それぞれ2分の1,4分の1解像度へ縮小する。そして,この許容錯乱円バッファを吟味して,ピントがズレていると判断されるピクセル位置(座標)をバッファに書き出す。
このバッファは,3DMark 11のレンダリングエンジンでは「Position Buffer」(ポジションバッファ)と呼ばれ,ポストプロセスフェーズにおいて,ポイントプリミティブ(Point Primitive,xyzの頂点1個のデータ)用の頂点データとして扱われる。
そしてこのPosition Bufferを“調理”するのがジオメトリシェーダで,座標データを元ネタにしてポリゴン生成,具体的には,当該画面座標位置に六角形状のボケを生成するわけだ。1つの頂点座標から三角形を6個生成して六角形にしているのか,頂点座標を中心に四角形あるいは三角形を生成して,六角形のテクスチャを貼っているのかFuturemarkは明らかにしていないが,いずれにせよ,レンダリング結果の元位置のピクセル色で,六角形状のボケをRGBα各16bit浮動小数点のHDRバッファへ描画することになる。
なお,このボケ出力用HDRバッファは,複数の領域に分けて利用するためにマルチビューポート出力を利用している。これは「1つのバッファに対し複数のビュー(領域)で出力する」もので,1つめの領域は表示解像度と同解像度のフル解像度で,その隣の領域は隣の縦横半分の解像度とし,これを繰り返して,1×1テクセルにまで小さくした領域に分けて出力する。
要するに,大きいボケ(=半径の大きいボケ)ほど,解像度の低いレンダリング結果のピクセルを読み出して生成し,低解像度のビューポートへと出力するわけだ。
最終的な合成時,各ビューポートにおけるそれぞれ異なる解像度の領域群は,フル解像度にアップスケール(=拡大)され,合成される。
Advancedタブの「Depth of Field Quality」(被写界深度品質)スライダーから,最大(左)と最小(右)とにそれぞれ設定したときの違い。ボケが生じる場所に違いはないが,後者のほうが粗く見える
同条件で別のシーンを切り出したところ。シーンによっては,「ボケ形状の粗さ」は目立たない。低品質設定にするほど,サンプル数は減って負荷が下がるものの,広範囲にボケる効果は欲しいので,早めに低解像度のバッファをサンプルするよう制御されているものと思われる
これは,いわゆる川瀬式や縮小バッファ法と呼ばれるテクニックの応用ということになるだろう。この縮小バッファのテクニックについての基本的な考え方は,やはり本連載の3DMark Vantage編で解説してあるので,そちらも参考にしてほしい。
1つのフル解像度にとりまとめられたボケ結果は,最終レンダリング結果へと合成され,ピントが合っている箇所の外周にボケ味が付加された映像となる。ちなみに,ボケ結果は浮動小数点バッファに出力されていたので,3DMark 11のボケ効果にはHDR効果が残る。
3DMark 11では,HDRレンダリングが持つ醍醐味の1つとなる「光の溢れ出し表現」のブルームエフェクトや,そのほかの光学現象エフェクトをDirectCompute(ComputeShader)ベースで実現している。
わざわざDirectComputeでやるのには理由がある,3DMark 11では,これら光学現象エフェクト用のフィルタを周波数領域で掛ける実装にしているのだ。
「周波数領域」という言葉にピンとこない人もいるかと思うので簡単に解説しておこう。
例えば,録音した音声をサウンド編集ソフトに読み込ませるとギザギザした波形が表示されると思うが,あれは「時間領域」の編集画面で,横軸は時間進行を表している。一方,同じ音声でも,「周波数領域」で編集する機能を持つ装置として,グラフィックイコライザが挙げられる。
なお,音声は一次元データだが,映像は二次元データとなるため,縦軸と横軸,2軸の周波数軸で取り扱うことになる。3DMark 11では,「レンダリング結果としての映像を2軸の周波数領域に変換したデータ」に対して,フィルタ処理を行うのだ。
時間領域での編集をすることになる一般的なサウンド編集ソフト(左)と,周波数領域で調整するグラフィックイコライザ(右)の例。ちなみに左はSony Creative Software製編集ソフト「Sound Forge 9.0」,右はWaves製プラグイン「API-560」のショットだ
話を戻そう。
ブルームエフェクトとは,簡単に言えば,HDRレンダリング結果の高輝度部分を溢れさせてぼやかすこと。画像処理的な観点からすれば,高周波成分が失われ,低周波成分が支配的になるということでもある。さらに,映像を2次元的な信号分布と捉えたときには,ある一定以上の周波数をカットして低周波成分を増強するということにも相当する。
こうした周波数に着目した加工処理を行うのには,計算を周波数領域で行うほうが都合がいい。
信号データを周波数次元に変換する処理として有名なのがフーリエ変換(Fourier Transform)で,その高速版がFFT(Fast Fourier Transform)になるが,3DMark 11ではレンダリング結果を周波数領域に変換するのに,DirectComputeで実装したFFTを利用するのだ。
こうしたぼやかし系のポストプロセスは低解像度で実行しても見栄え的に問題ないため,3DMark 11では,レンダリング結果の縦横サイズを4分の1へと縮小し,さらにこの値に最も近い「2のべき乗」値に丸めた解像度に変換している。これは,FFTを行うには2のべき乗の要素数としなければならないためだ。また,Futuremarkは明言していないが,FFTで処理しやすいよう,縦横同じドット数の正方形に変形させてもいると思われる。
FFTの結果はRGBα各32bit浮動小数点バッファに格納される。そして,格納されたデータに対し,ブルームエフェクトや光芒(Streaks),歪形フレア(Anamorphic Flare),レンズ形状光輪(Lenticular Halo)などといった,各種効果に対応する周波数領域のフィルタを仕掛ける。
そして,フィルタ適用結果に逆FFTをかけて通常の映像次元に戻し,縦横比補正や解像度変換を行って元のレンダリング解像度に整え,最終レンダリング結果と合成するわけだ。
3DMark 11は,DirectX 11専用となったことで,テッセレーション機能の活用だけでなく,レンダリングエンジンの基礎部分におけるDirectX 11最適化も行われている。
Immediate ContextとDeferred Context。Deferred Contextは非同期にマルチスレッドで構築可能だが,実際の実行はImmediate Contextのタイミングに依存する
DirectX 11では,複数のレンダリングコンテクストを生成でき,それぞれを別のスレッド上で処理させることが可能だ。
DirectX 11におけるレンダリングコンテクストには,メインコンテクストとでも呼ぶべき「Immediate Context」(イミーディエイトコンテクスト)と,サブコンテクストといえる「Deferred Context」(ディファードコンテクスト)の2種類がある。Deferred ContextはImmediate Contextと非同期に描画準備が行えるもので,同時に複数個を生成できるが,実際のDeferred Context描画実行はImmediate Context描画実行のときに合わせて発行される。
3DMark 11では,メインスレッドとして管理されるスレッドでImmediate ContextとDeferred Contextの双方を取り扱い,サブスレッドではDeferred Contextのみを扱う設計になっている。
1枚のフレームを描画する際に生成されるスレッド数は,そのシーンに登場するオブジェクト数(=アイテム数)にほぼ等しく,各スレッドは「割り当てられたそのオブジェクトの描画に関連する全タスク」をこなすような設計となっている。例えば,あるオブジェクトの描画を担当することとなったスレッドでは,そのオブジェクトの行列計算や可視不可視判定カリング処理,シェーダパラメータの準備などをこなす,といった具合だ(※実際にGPUへの描画発行が行われるのは,メインスレッドの準備が完了したときである)。
このように3DMark 11では,CPU側で行っている「GPUへの描画タスク発行までの準備の処理」を完全なマルチスレッド設計にすることができたため,CPUの物理もしくは論理コア数が多ければ多いほどパフォーマンスが上がりやすくなっている。
Futuremarkによると,「Graphics Test」では,1スレッドを各物理コアに割り当てているとのこと。つまり,2コアCPUならば,メインスレッドとサブスレッドをそれぞれ1コアずつに割り当て,4コアCPUならば,メインスレッドを1コアに割り当て,すべてのサブスレッドを残る3コアに割り当てるような形になるわけだ。
また,Physics TestとCombined Testでは,1スレッドを各論理コアに割り当てているという。つまり,同一物理コア数のCPU同士で比較した場合は,論理コア数の多いCPUのほうが,Physics TestとCombined Testのパフォーマンスが高くなる可能性が大きいということである。
こうして見てくると,3DMark 11のレンダリングエンジンは,かなり重い設計になっていることが分かるはずだ。しかし同時に,闇雲に高負荷な作りになっているのではなく,DirectX 11世代のGPUやマルチコアCPUのパワーを効果的に活用しつつ,さらに今後の性能強化も見込んだうえでの設計になっていることも理解できたと思う。
次回以降は,各テストや3DMarkスコアの計算式,3DMark 11の設定オプションについて解説を行っていきたい。
- 関連タイトル:
3DMark 11
- この記事のURL:
(C)2010 Futuremark(R) Corporation. 3DMark(R) 11 and Futuremark(R) trademarks and logos, character names and distinctive likenesses, are the exclusive property of Futuremark Corporation.