オススメ機能
Twitter
お気に入り
記事履歴
ランキング
お気に入りタイトル/ワード

タイトル/ワード名(記事数)

最近記事を読んだタイトル/ワード

タイトル/ワード名(記事数)

いまから始めるオンラインゲーム
募集中
モバイル版4Gamer(β)
※ドコモ旧機種には対応してません
特集記事一覧
注目のレビュー
注目のムービー
印刷2013/02/09 20:35

イベント

[SQEXOC 2012]Agni's Philosophyに見られるグラフィックス技術解説(後編)。ボリュームレンダリングやパーティクル処理の最新動向

ミドルウェア/開発ツール
 2012年11月に行われた「スクウェア・エニックス オープンカンファレンス」の2日め,新世代ゲームエンジン「Luminous Studio」用リアルタイム技術デモ作品「Agni's Philosophy」に用いられたリアルタイムグラフィックス技術についての解説セッションが行われた。掲載まで非常に時間がかかってしまったが,同セッションのレポート後編をお届けする。3回に分けて紹介してきた技術解説も,今回で終了だ。前編と中編の内容を思い出せない人は,以下の記事で復習をしておくとよいだろう。

[SQEXOC 2012]リアルタイムレンダリングデモ「Agni's Philosophy」に用いられた最新グラフィックス技術の全容を見る(前編)

[SQEXOC 2012]「Agni's Philosophy」に用いられたグラフィックス技術解説(中編)。Agniの毛髪表現はいかにして実現されたのか



ボリューメトリックな材質表現とそのライティングについて


ミドルウェア/開発ツール
 Agni's Philosophyの中盤に,得体の知れない注射をされたハイエナ風の動物がモンスターに変異し,身を震わせつつトラックから降りてくるシーンがある。そこでは,トラックの荷台に差し込んだ懐中電灯の光が「光筋」(いわゆるゴッドレイ)を生み出しており,それ自体が上下左右にスポットライト的に動く様子が確認できる。

 この光筋は,懐中電灯の光源から生成したシャドウマップを,視線から画面奥行き方向に向かって放ったレイの軌道でサンプルしていき,「光が当たっているか」「影の中にいるか」の判断結果を累積加算していくことで生成しているという。
 もう少し細かく解説すると,放たれたレイは一定距離ずつ進められていき,その都度(たとえそこが中空であっても)シャドウマップをサンプルして「影か否か」の判断を行って,結果を累積加算していく操作を繰り返す。そう,オーソドックスなボリューメトリックレンダリング手法である「レイマーチング」(Ray Marching)を行うわけだ。
 ちなみに,このセッションの講演者であるRemi Driancourt氏(スクウェア・エニックス テクノロジー推進部)は,Agni's Philosophyでの光筋表現では,各ピクセルから飛ばしたレイを32〜64回のステップ数で縦断させるとしている。
 なお,Driancourt氏によれば,Agni's Philosophyにおける光筋表現はNVIDIA SDK 10の「VolumeLight」とほぼ同じものを採用しているそうだ。

NVIDIA SDK 10の解説文より。Agni's Philosophyでの光筋表現では,このテクニックを採用している
ミドルウェア/開発ツール

レイを進めるごとにシャドウマップからサンプルした「影か否か」の判定が累積加算される
ミドルウェア/開発ツール

 ただ,さすがにフル解像度でこれを実装すると負荷が高すぎるため,この光筋描画は,最終レンダリング解像度の縦横4分の1(面積比16分の1)のレンダーターゲットに対して行われている。
 しかし,16分の1の大きさのレンダーターゲットに描いた光筋入りフレームを,単純に16倍に拡大して最終フレームに合成したのでは,光筋とシーン内オブジェクトとの輪郭部に強いジャギーが出てしまう。
 そこで16分の1解像度で光筋を描画したフレームを最終フレームに合成する際に,最終フレーム解像度の深度バッファに「ソーベルフィルタ」(エッジ検出フィルタ)を適用してエッジを検出し,ステンシルバッファにマーク。後段でこのマークがあるところ(すなわち輪郭部)をブラーをかけながらアップサンプリングして合成する方策で改善をしているとのことだ。

シーンの輪郭部で発生するジャギーを低減するための工夫
ミドルウェア/開発ツール
光筋レンダリングのパフォーマンス
ミドルウェア/開発ツール


 この低解像度バッファを使用したレイマーチング法は,Agni's Philosophyにおいてフォグ(霧,霞)表現にも活用されている。ただ,光筋表現のときとは違い,ライティングされたシーン内オブジェクト上のピクセルから視点に向かってレイを飛ばす実装になっているという。
 レイマーチングにあたっては,シーン内に配置された光源からのライティングを工夫をして,光が鈍くフォグを照らしている表現を実現しているそうだ。ただし,負荷低減のため,このフォグへのライティングについては,視点から遠方においてのみ行うようにしているとのこと(近くではフォグの密度が薄すぎてライティングの効果が出にくいため)。

フォグ表現でもレイマーチング法を実装
ミドルウェア/開発ツール


ミドルウェア/開発ツール
フォグOFF
ミドルウェア/開発ツール
フォグON
ミドルウェア/開発ツール
フォグON+フォグ・ライティングON

ミドルウェア/開発ツール
フォグONとしたシーン描写
ミドルウェア/開発ツール
フォグOFFとしたシーン描写


内壁での屈折にも対応したガラス瓶の屈折表現


ミドルウェア/開発ツール
 Agni's Philosophyには,主人公Agniが水の入ったガラス瓶を取るシーンがある。
 なにげない一コマだが,このガラス瓶の表現にも,かなりの手間が掛かっているようだ。

 透明材質を媒介して見た情景は,視線がその界面で屈折を起こすために,歪んだりズレたりして見える。これは日常でも身近な体験だろう。
 水面などの表現では,シーンをまず水面なしでレンダリングしてテクスチャ化しておき,水面をレンダリングする際に,水面での視線の屈折量に応じてシーンテクスチャをずらしてサンプルすることで屈折を表現することが多い。「屈折」というと小難しいイメージがあるが,実質的には「界面の状態に応じたオフセット」を付けてシーンテクスチャをサンプルすることで実現されている。

画面座標系で実装する屈折効果
ミドルウェア/開発ツール

 Agni's Philosophy開発時に行われた最初の実験では,視線から見たガラス瓶の外側の界面で1回屈折させてみたところ,まったくリアルに見えなかったそうだ。

最初の試行。ガラス瓶の手前表面だけでの屈折処理を行った結果
ミドルウェア/開発ツール

 そこで,視線から見て後面となるガラス瓶の後ろ側もレンダリングして,ここでも屈折させる実験をしてみたところ,画像は改善されたものの,太いガラス棒のように見えてしまったという。

2番めの試行。ガラス瓶の前面と後面での屈折処理を行った結果
ミドルウェア/開発ツール

 得たい表現は中空のガラス瓶なので,このままでは不十分だ。今度は瓶の内壁でも屈折させる実装としてみたところ,だいぶ見映えがリアルになり,十分な手応えが得られることとなった。

3番めの試行。ガラス瓶の前面と後面だけでなく,内壁での屈折処理を行った結果
ミドルウェア/開発ツール

 こうして,最終実装では,視線はガラス瓶で4回屈折することになった。
 ガラス瓶は内壁側もモデリングされており,実際のレンダリングは,以下のような手順で行われる。 

 まず,視線から見て最も遠いガラス瓶の後面は,ガラス瓶の外面をレンダリングした際に得られるZ値(透明なので2つある)のうち大きいほうを取ればよいことになる。一般的なレンダリングルールからすると,視点に向いているのは裏面となるので,そのままでは裏面カリングで描画されなくなってしまう。そこでカリングモードを変えて処理する必要がある(下スライド中の(1))。
 次に,ガラス瓶の後面側の内壁は,ガラス瓶の内面をレンダリングした際のZ値の大きいほうを通常のカリングで描画すればよい(下スライド中の(2))。
 同様に,ガラス瓶の前面側の内壁は,ガラス瓶の内面をレンダリングした際のZ値の大きいほうを裏面用のカリングモードで描画すればよいことになる(下スライド中の(3))。

実はガラス瓶は内壁もモデリングされている
ミドルウェア/開発ツール

Metaaphanon Napaporn氏(スクウェア・エニックス テクノロジー推進部)
 事前パスで,これら3面分をレンダリングしておき,最終パスで視線側に向いたガラス瓶の前面をレンダリングする際には,描画する外壁前面上の点からレイを放ち,屈折率に従って界面で屈折させながら,「外壁前面−内壁前面−内壁後面−外壁後面」の順番で,次の界面の交叉点を求め,そこからさらに屈折角度を算出……を繰り返し,最終的に後面側に出射したレイでシーンテクスチャをサンプルサンプルしているわけだ。

 視線が「外壁前面−内壁前面−内壁後面−外壁後面」の順番で屈折してガラス瓶内部進んでいく処理では,実際にレイをトラバースさせて界面との衝突点を求めている(レイマーチング処理)。この処理はかなり重いのだ。

 最終的には,屈折処理のほかに,当然,鏡面反射効果とフレネル反射に配慮したキューブ環境マップ,そしてデカールテクスチャの適用を行う。
 ただ,講演後にMetaaphanon Napaporn氏(スクウェア・エニックス テクノロジー推進部)に確認したところ,内壁側や後面側にはそうした処理は行っていないとのことだ。
 いずれにせよ,最終的には見映えはかなりリアルなものとなっている。

ミドルウェア/開発ツール
4界面での屈折のみ
ミドルウェア/開発ツール
鏡面反射ライティングを加えた結果
ミドルウェア/開発ツール
キューブ環境マップ適用後
ミドルウェア/開発ツール
デカールテクスチャ適用後



GPUパーティクルシステムの詳細(1)〜衝突判定や力場からの影響に対応


 Agni's Philosophyのパーティクルシステムは,基本的にGPU側で実装されている。
 パーティクルの発生,シミュレーションやアニメーション,消失,そして描画のすべてを,CPUの助けなしに動作できるサブシステムが構成されているのだ。
 こういったものは,最近では「GPUパーティクルシステム」と呼ばれることが多く,直近ではEpic Gamesの「Unreal Engine 4」でもGPUパーティクルシステムを採用したことが明かされている。

 GPUパーティクルシステムが登場した背景には,DirectX 10世代GPUで採用された,GPU内部で自発的にジオメトリの生成が行える「ジオメトリシェーダ」の登場と,CPUとはまったく非同期にGPUから自発的に描画開始を開始できるDrawAuto機能の搭載などがあると思われる(これらの詳細については筆者の過去記事を参照してほしい)。

Agni's PhilosophyではGPUパーティクルシステムを採用している
ミドルウェア/開発ツール

 Napaporn氏の解説からは,Agni's PhilosophyのGPUパーティクルシステムは,非常に多機能で完成度が高いことが分かる。
 まず,すべてのパーティクルは,立体的な「力場」(Force Field)の影響を受けられるように設計されている。
 「力場」というと難しく聞こえるが,例えば「風」などが力場の代表例だ。
 煙が巻き込まれて拡散するような挙動には,プロシージャルノイズの一種である「Curl-Noise」が力場の一つとして実装されている。

プロシージャルノイズの一種である「Curl-Noise」が力場の一つとして実装されている
ミドルウェア/開発ツール

 ここで使う力場は,速度ベクトルの形で表現され,3Dテクスチャとして与えることができる。例えばシーンを3Dグリッドとして分割し,速度力場を格納した3Dテクスチャのテクセルと対応するようにしておけば,パーティクルを立体的な風の流れに翻弄させるような表現が行えるわけだ。Napaporn氏は,「この3Dテクスチャをアニメーションさせれば,時間とともに変化する気流の表現もできるだろう」と述べていた。

場を立体的な速度ベクトルの形で与えれば複雑な気流の表現も行える
ミドルウェア/開発ツール

 また,Agni's PhilosophyのGPUパーティクルシステムは衝突判定にも対応している。衝突判定の基準形状は「球体」「円筒」「直方体」となっており,パーティクルがシーンに登場するオブジェクトに潜り込まないようにするためには,これら三つの基本形状を,適宜,各オブジェクトモデルに仕込んでおく必要がある。

GPUパーティクルシステムは衝突判定にも対応する
ミドルウェア/開発ツール

 Agni's Philosophyで使われたパーティクルシステムでは,パーティクルが衝突していると判定された場合に,「斥力」(Repulsion Force)と「搬送力」(Vector Field)などの力場を与えることができる。
 「斥力」は反発する力。「搬送力」はパーティクルをある程度の力で引きつけて運搬する力になる。搬送力の効果については,下の映像を見ればだいたい理解できるはずだ。


 Agni's PhilosophyのGPUパーティクルシステムで最も特徴的な力場機能と思えるのは「ターゲットメッシュ」(Target Mesh)と名付けられたものだ。
 これはパーティクル達が,標的となる3Dモデル(メッシュモデル)に向かって集まるような動きを与えるもので,作中では,無数の蛍(昆虫)が召喚獣の骨格に群がるようにして飛ぶシーンで採用されている。
 ターゲットメッシュの挙動は,ターゲットとパーティクルを,見えない仮想的なバネで結ぶことで実現されており,ゴール地点から遠ければ遠いほど速く動き,近いほど速度がゆっくりと集まるような振る舞いを作り出している。ただし,遠すぎるパーティクルの速度が異常に速くなることを抑えるため最大速度制限を与えているとのことだった。

パーティクルに対し,与えられた3Dモデルの特定地点に向かって集まるような力場を与える「ターゲットメッシュ」機能
ミドルウェア/開発ツール


GPUパーティクルシステムの詳細(2)〜パーティクルの描画システムとFourier Opacity Mapping


 Agni's PhilosophyのGPUパーティクルシステムで描画できるパーティクルは,一般的な四辺形パーティクル(ビルボード,ポイントスプライト)のほか,3Dモデルそのものにも対応している。さらに,四辺形パーティクルに厚み情報を持たせて描画する「疑似メタボールパーティクル」(Blobby Object)も用意されている。

Agni's PhilosophyのGPUパーティクルシステムが対応するパーティクルバリエーション
ミドルウェア/開発ツール

 Napaporn氏によれば,パーティクルは半透明テクスチャを適用したものが多くなるため,描画前のソートにも対応しているとのこと(奥側から描画しないとおかしくなる)。ソートアルゴリズムには「バイトニックソート」(Bitonic Sort)法を採用しており,これもGPUパーティクルシステム内で実行される(=CPUの手間は借りない)。
 ちなみに,バイトニックソートは,要素交換を並列処理できる点でGPU向きとされているソーティングアルゴリズムだ。GPUでの実装例については,NVIDIAのサイトに詳しいので参照してほしい。

半透明パーティクルのソーティングもGPUで実行される
ミドルウェア/開発ツール

 四辺形パーティクルの最も基本的な活用例は,シーン冒頭の祭壇前に立ち並ぶ蝋燭(ろうそく)の炎で確認できる。
 四辺形パーティクルは,三次元的な速度情報を与えられた場合に変形することにも対応しており,この蝋燭のシーンでは変形機能を活用したうえで,さらに炎テクスチャ自体をアニメーションさせて,かなりリアルな見映えを達成している。

シーン冒頭の蝋燭の炎は実は四辺形パーティクルによるものだ
ミドルウェア/開発ツール

 プリレンダー版Agni's Philosophyでは,煙などの流体系エフェクトは「Maya Fluid」や「FumeFX」などといった「Maya」側の機能プラグインで制作されていた。しかし,リアルタイム版では,これをそのままでは動かせないため,エフェクト発生源となるエミッタの情報やエフェクトの種類,動きにまつわる根幹パラメータ群を受け継いで,このGPUパーティクルシステムで制御・描画している。
 Agni's Philosophyでアート制作を指揮した岩田 亮氏は,「パーティクルの表現部分は,プリレンダー版の意図をよく咀嚼してGPUパーティクルシステムの表現に置き換えていった」と述べていた。
 そうした苦労をして置き換えたパーティクルの描画品質でも,最も目立った品質格差となってしまうのが,パーティクルとシーン内オブジェクトの交叉線のアーティファクトだ。

 Napaporn氏によれば,このアーティファクトは「ソフトパーティクル」法として知られるテクニックで対処したという。
 ソフトパーティクル法は,オブジェクトとしては平面でしかない四辺形パーティクルの描画に際して,仮想的な厚み情報を持たせ,「仮想的な厚みが,他者オブジェクトと交叉する位置」で透明度を決定するパーティクル描画手法となる。分かりやすくいうと,パーティクルと他者オブジェクトが交叉していると透明度が上がり,交差線のアーティファクトを薄くすることができるシステムだ。

 その厚み情報分布をテクスチャで持たせれば,任意の厚み形状での処理も可能だが,一般的には,Napaporn氏が下のスライドで示しているような「球体状の厚み情報」で処理されることが多い。球体であれば,そのパーティクルを構成する各ピクセルで一意に厚み情報を求められるからだ。
 煙などのパーティクルでは,この球体状の厚み情報で十分とされており,PlayStation 3やXbox 360のゲームでも,この手法を採用しているタイトルは多い。

ミドルウェア/開発ツール
Agni's Philosophyにおけるソフトパーティクル描画手法
ミドルウェア/開発ツール
ソフトパーティクル描画なし(左)とあり(右)の比較

 また,パーティクルが落とす影やパーティクル自身のセルフシャドウについては,NVIDIAのJon Jansen氏とLouis Bavoil氏が2010年に発表した「Fourier Opacity Mapping」(フーリエ オパシティ マッピング)を採用したとのこと。
 Fourier Opacity Mappingは,煙に代表される「なだらかに光を減衰させる特性を持つもの」が落とす影を算術的にそれっぽく描き出せる影生成手法だ。

 この手法の基本的な発想はデプスシャドウ法に似た部分が多い。デプスシャドウ法では「光源位置から見た遮蔽物までの距離分布」をシャドウマップとして生成するが,Fourier Opacity Mappingでも光源位置から見た「Fourier Opacity Map」を生成する。
 ここでキモとなるFourier Opacity Mapの概念の説明が難しいのだが,各テクセルには,「光源から出た光がパーティクルの透明度(不透明度)αや,厚みdによってどの程度減衰されるのか」の分布をフーリエ級数の係数a'k,b'kの形で記録するのだ(下スライド上段の式)。
 フーリエ級数の係数とは,「連続関数をサイン波の和の形に変換した際の各波長のサイン波にかかる比重」を意味している。イメージ的には,光源から煙などを経由して減衰していく光の強さの変化を示したグラフを,いくつかのサイン波の和で近似している感じだ。

ミドルウェア/開発ツール
パーティクルの影生成においてはFourier Opacity Mappingを採用した

 シーンやオブジェクトをレンダリングする際の,「当該ピクセルが影になっているか否か」の判断はYES/NOの二値判断ではなく,このFourier Opacity Mapを参照して,フーリエ係数a'k,b'kを取り出したうえで,光源から当該ピクセルまでの距離dも利用して,復元したフーリエ級数から光の減衰量を求めている(上スライドの下段の式)。

ミドルウェア/開発ツール
右下にあるのが生成したFourier Opacity Mapを可視化したものだ
ミドルウェア/開発ツール
Fourier Opacity Mappingによる影生成OFF
ミドルウェア/開発ツール
Fourier Opacity Mappingによる影生成ON

 実際に動いているデモムービーが下になる。余談だが,Fourier Opacity Mappingによる影生成は,「Batman: Arkham Asylum」でも採用されたテクニックだ。


 ここで使われるフーリエ係数は数が多いほど品質は上がるわけだが,Agni's Philosophyでは,7個のフーリエ係数を2個のFourier Opacity Mapに出力しているという(RGBA相当のコンポーネントに最大4つずつのパラメータを保存)。複数枚のFourier Opacity Map生成には,GPUのMRT(マルチレンダーターゲット)を2個使用して効率化を図っているとのことだ。
 ちなみに,NVIDIAは16個の係数を4MRTで実装したFourier Opacity MappingのデモをNVIDIA SDK 10で公開しているので,興味がある人はそちらも参考にしてほしい。

 さて,Driancourt氏は,このFourier Opacity Mappingを髪の影生成にも利用できないか試したそうだ。しかし,結果は下に示した画面ショットから分かるように,コントラスト感に乏しく,負荷的にもデプスシャドウ技法のほうが軽かったために,採用を見送ったとのことだった。

ミドルウェア/開発ツール
セルフシャドウなしの髪
ミドルウェア/開発ツール
セルフシャドウありの髪。影はFourier Opacity Mappingによるもの
ミドルウェア/開発ツール
セルフシャドウありの髪。デプスシャドウ技法×濃淡制御を用いた,実際のランタイム採用方法によるもの


GPUパーティクルシステムの詳細(3)〜10万匹に及ぶ蛍の描画と疑似メタボールパーティクル


ミドルウェア/開発ツール
 Agni's PhilosophyのGPUパーティクルシステムは,立体的なジオメトリ構造を持った3Dモデルをもパーティクルとして描画することができる。
 この3Dオブジェクトパーティクルが効果的に活用されているのが,上でも少し触れたが,Agni's Philosophyの冒頭の,無数の蛍が飛び回っているシーンだ。

 蛍は数十ポリゴンからなる3Dモデルで,4パターンのループアニメーションが適用されるものとしてGPUパーティクルシステムに登録されており,作中のシーンでは約10万匹がそれぞれ個別の軌道で飛翔し,アニメーションしながら飛び回る。
 この描画には,DirectX 9世代から追加された,同一モデルを個別パラメータで駆動して複数描画する「ジオメトリインスタンシング」機能が利用されている。4パターンのアニメーションインデックスは,10万匹の蛍の1匹1匹に対して個別のものを持たせているので,すべての蛍が同じタイミングで羽根を開閉しているわけではない。

 デモでは蛍のお尻が輝いて見えるが,実際にはここに動的光源は置かれていない。輝いてブルーム効果が出ているのは,蛍のお尻にハイダイナミックレンジな輝度情報が置かれているためだ。これにブルームやモーションブラーなどのポストエフェクトによって,ほどよいボケが付加されるため,ぼんやりと光って見えているのだ。

 さて,この蛍の群れは,前述のとおり,召喚獣の骨格に向けて飛ぶ挙動を示すが,これは上でも触れた「ターゲットメッシュ」の挙動制御を適用しているためだ。Napaporn氏によれば,GPUで行われる10万匹の蛍の「ターゲットメッシュ」の挙動更新処理は約1msで完了するというから凄い。GPUパーティクルシステムでなければ,ここまで高速にはならなかったもしれない。

ミドルウェア/開発ツール
蛍モデルは4パターンのループアニメーションで羽ばたく。描画にはジオメトリインスタンシングが利用される
ミドルウェア/開発ツール
10万匹の蛍の挙動更新処理はわずか1msで完了。GPUパーティクルシステムならではの性能といえる


 この蛍達は,召喚獣の骨格に取り憑くと弾けて肉片へと変貌し,隣接する肉片と有機的な合体を繰り返す。
 蛍とは違い,この肉片は四辺形ポリゴンからなるパーティクル(ビルボード)で表現されている。しかし,そのまま描画したのでは隣接するパーティクルとの交差線が顕在化してしまう。
 そこで利用されているのが,Agni's PhilosophyのGPUパーティクルシステムの最後の描画形態である疑似メタボールパーティクルだ。

 結論から言うと,この疑似メタボールパーティクルは,NVIDIAの技術デモ「Screen Space Fluid Rendering with Curvature Flow」をベースにしたものになる。

 まず,パーティクル描画時に同時に深度バッファに半球状の深度情報を描き込み,後段でこの深度バッファにZ方向のブラーをかけて深度情報を整地してやる。そして,実際のシェーディングは,この「整地された深度情報」の法線情報を求めてから行う。そう,この深度の整地効果がメタボール的な有機結合の雰囲気を醸しだしており,いわばこの肉片のメタボール表現は,よくできた2.5D的なフェイクなのだ。しかし,圧倒的な物量効果もあって,非常にリアルかつグロテスクに見える。

ミドルウェア/開発ツール
疑似メタボールパーティクルの実現概念図

 Napaporn氏に確認したところ「深度バッファの整地処理」には,ガウスフィルタではなく,バイラテラルフィルタ(Bilateral Filter)可分二項フィルタ(Separable Binomial filter)を用いているとのこと。バイラテラルフィルタは輝度差の大きいエッジ部をあまりボケさせない特性がある。
 ちなみに,NVIDIAのデモの実装では,丸みを帯びた深度値分布に対して,その曲率を平均化させるフィルタ(Mean Curvature Flow Filter)が適用されていた。

ミドルウェア/開発ツール
疑似メタボールパーティクル
ミドルウェア/開発ツール
深度値の平坦化を推し進めるとこのような見映えになる

 さらに,この疑似メタボールパーティクルは,水しぶきや流水の表現にも応用されている。不透明な「肉片」や「血」と違い,水は透明なので,屈折の効果を適用してやらなければリアルに見えない。

疑似メタボールパーティクルは,流血表現にも活用されている
ミドルウェア/開発ツール
ミドルウェア/開発ツール

 そこでAgni's PhilosophyのGPUパーティクルシステムでは,透明の疑似メタボールパーティクルの描画に際しては,パーティクルの厚み情報を深度バッファにレンダリングする際,視線側に向いた前面だけでなく,後面側もレンダリングしている。これにより,視線から見たときの水(の塊)の表と裏の界面が得られるからだ。

水のレンダリングにも疑似メタボールパーティクルは応用されている。ただし,水は透明なので,正しい屈折効果を得るためには,視線側に向いた表面だけでなく,裏側の界面の取得も必要になる
ミドルウェア/開発ツール

 水の塊をレンダリングする際には,この「水の塊」の表と裏の界面情報を利用する。
 屈折した視線がシーンテクスチャをサンプルする際の処理系は,前出のガラス瓶の屈折処理の際と同じくレイマーチング処理を行って実装される。
 最終的には,この水塊をよりリアルに見せるために,鏡面反射ライティング,フレネル反射に配慮したキューブ環境マップの適用,そして水独特のエフェクトともいえる泡沫のテクスチャも加えている。

ミドルウェア/開発ツール
疑似メタボールパーティクルによる水を透明に描画した場合
ミドルウェア/開発ツール
疑似メタボールパーティクルによる水に対し屈折効果を適用した場合
ミドルウェア/開発ツール
鏡面反射ライティング適用後
ミドルウェア/開発ツール
泡沫テクスチャの適用後
ミドルウェア/開発ツール
キューブ環境マップテクスチャ適用後
ミドルウェア/開発ツール
ポストエフェクトを適用後の最終映像。水滴に映り込んだり,屈折効果で入り込んだハイダイナミックレンジな背景の一部がグレアを起こしてキラキラと輝いて見える。かなりそれっぽい見映えとなった

 ちなみに,このような「パーティクルベースで流体物理シミュレーションを行って,深度テクスチャに出力したパーティクル厚み情報をボカして界面を得る」手法は「Smoothed Particle Hydrodynamics」(SPH:スムースド パーティクル ハイドロダイナミクス)法と呼ばれている。


 Napaporn氏によれば,水の塊のレンダリングは,視線から見て裏面の界面を得たり,屈折効果の処理を実施する必要があるため,レンダリング負荷はそれなりに高いという。例えば,同一量の疑似メタボールパーティクルを不透明なもの(肉片や血)と透明なもの(水)とで描画して比較すると,後者のほうが15%もパフォーマンスが落ちたとのことだ。
 つまり,広範囲に広がる水面をこのSPH法で実装するのは無理があるので,使いどころに気を付ける必要がありそうだ。Agni's Philosophyでの活用のように,水面から飛び出すような水しぶきや流水の表現などには効果的に使えそうなので,今後はそういった表現に使われることが多くなるのかもしれない。

同一量の疑似メタボールパーティクルを不透明なもの(肉片や血)と透明なもの(水)とで描画して比較したところ,後者のほうが15%もパフォーマンスが落ちたとのこと
ミドルウェア/開発ツール


Agni's Philosophyの最適化について


岩﨑 浩氏(スクウェア・エニックス テクノロジー推進部 リード・エンジニア)
 Agni's Philosophy制作におけるパイプラインについて解説した岩﨑 浩氏が,このデモ作成にあたって行ったパフォーマンスチューニングについて述べていたので、最後にその内容を紹介しておこう。

 岩﨑氏が行った最適化で,最も効果的だったのは「分散しているDrawCallをひとまとめにして減らしたこと」だったという。リアルタイム3Dのパフォーマンスチューニングとしては基本的な処理といえる。

冒頭のシーンにおける各要素のレンダリング所要時間
ミドルウェア/開発ツール

ミドルウェア/開発ツール
DrawCall数の削減・最適化が最も効果が高かったという
ミドルウェア/開発ツール

 面白いのは,シーンによっては1000万ポリゴン級のレンダリングが行われているAgni's Philosophyではあるが,ジオメトリ負荷はほとんど問題にならなかったというのだ。なので,プリレンダー版からの移行にあたって,一部の例外は除いて3Dモデルは頂点削減をせず,ほぼそのまま利用しているという(※リアルタイムのスキニングが必要なものを除く。つまり,キャラクターではポリゴン削減が行われている)。
 したがって,背景オブジェクトなどでは視点からの距離に応じてポリゴン数を間引くようなLoD(Level of Detail)システムの導入は見送られている。次世代ゲームグラフィックスでは,ポリゴン数に限ってはプリレンダーCGとほとんど同等でいけるようになるのかもしれない。
 このほか,目立った最適化としては,デプスシャドウ技法による影生成には,影生成用の専用モデルを用意してもらったことが挙げられていた。ここはある意味,LoD的なアプローチが施された部分だといえる。

最適化を行わなかった……というよりも行う必要がなかった要素達
ミドルウェア/開発ツール

1ピクセル以下のポリゴンをマイクロポリゴンというのだが……
ミドルウェア/開発ツール
このシーンのこの部分を拡大すると……
ミドルウェア/開発ツール
こんなにポリゴンが! 頂点削減は行われていないので,これがGPUに入力されていることになる
ミドルウェア/開発ツール
ミドルウェア/開発ツール
続いてここに注目すると……
ミドルウェア/開発ツール
山の中に寺院のジオメトリがあった。さらに細かく見ていくと……
ミドルウェア/開発ツール
寺院の扉の一つ。さらに扉をよく見てみると……
ミドルウェア/開発ツール
縄のようなオブジェクトが巻きついている
ミドルウェア/開発ツール
拡大するとこんなに細かい
ミドルウェア/開発ツール
実は,この縄だけで9万頂点(≒ポリゴン)あったという。当然,最初の遠景の視点状態からGPUにこのジオメトリは入力されている
ミドルウェア/開発ツール
GPUにこれだけの頂点数が入力されても,実際にはGPU内部の早期カリングチェックで弾かれているので,ピクセルの描画は実行されていない。しかし,ジオメトリの演算処理は行われている。最新世代GPUがこれだけのジオメトリ入力に耐えうるパフォーマンスを備えるようになっているとはちょっとした驚きだ
ミドルウェア/開発ツール


おわりに


橋本善久氏(CTO コーポレートエグゼクティブ&テクノロジー推進部)
 Agni's Philosophyの「リアルタイムグラフィックス技術解説」セッションのフルレポートおよび解説を行ってきたわけだが,いかがだったろうか。
 これまでは各GPUメーカーが単発の技術デモとして見せていたような先端技術を,テクノロジー推進部は3Dゲームグラフィックスに利用できる形で実装し,それらをすべて統合的かつ効果的に応用してみせてくれた。Agni's Philosophyの映像の凄さもさることながら,技術デモレベルの研究が実用的に使えるようになっていること自体に驚かされた人も多いのではないだろうか。
 ただ,今回のAgni's Philosophyはすべてのコンピューティングパワーをグラフィックス表現に割り当てた成果物である。
 実際のゲームは,シーン展開制御,入力制御,敵AI制御,ゲーム物理といった各種ゲームロジック要素を統合させたものであるため,今後,新世代ゲームエンジン「Luminous Studio」にはそうした要素に対してどのような機能が実装されていくのかが注目されるだろう。今回のオープンカンファレンスでは,同社の三宅陽一郎氏 が,Luminous StudioにおけるAIアーキテクチャについて語っていた。ゲームを構成する重要な要素であるAIに関しては明確な実装方針が見えてきたようだ。

テクノロジー推進部とLuminous Studioの挑戦はまだ始まったばかりだ
ミドルウェア/開発ツール
 我々を驚かせてくれたAgni's Philosophyプロジェクト。CTOの橋本善久氏率いるテクノロジー推進部にとっては大きなマイルストーンではあったが,彼らにとっては一つの通過点に過ぎず,彼らが目指す「未来のゲーム体験」の実現に向けては,新たなスタート地点に立っただけにすぎないのかもしれない。
 ただ,その新しいスタート地点からの見晴らし(見通し?)はずいぶんといいに違いない。Luminous Studioの完成と,それで作られたゲームが登場する日が楽しみだ。

  • 関連タイトル:

    ミドルウェア/開発ツール

  • この記事のURL:
line
4Gamer.net最新情報
トピックス
スペシャルコンテンツ
注目記事ランキング
集計:09月02日〜09月03日
タイトル評価ランキング
92
Smite (PC)
83
83
80
マリオカート8 (Wii U)
78
FREE JACK (BROWSER)
2014年03月〜2014年09月