|
会場:KONAMI東京本社
「メタルギア ソリッド(MGS)」シリーズは海外でも人気の高い作品であり、「MGS4」はこの世界の期待に応えるべく世界同時発売を果たしている。その意味では、世界のゲームシーンにおいても、2008年の話題の中心には「MGS4」があったように思う。 そんな、いわばPS3のベンチマーク的作品である「MGS4」にまつわる様々な開発秘話を、小島プロダクションはゲーム開発者会議の「CEDEC2008」において積極的な情報開示を行なった。 今回の本連載では、CEDEC2008の時に発表された情報をベースに、小島プロダクションに追加で取材して得た情報を織り交ぜて、「MGS4」のゲームグラフィックスで用いられた技術について紹介と解説を行なっていきたいと思う。
前編となる今回は、「MGS4」の基本的なグラフィックススペックと「MGS4」で採用されたユニークなレンダリングパイプラインについて解説する。
■ 「MGS4」のゲームグラフィックススペック
両氏によれば、シーンによっても違うものの、1シーンあたりの平均的な背景ポリゴン数は25万から35万程度だとのこと。草が多く生えているシーンでは、草だけで10万ポリゴンを超えるシーンもあったという。 この背景に、キャラクタやその他のエフェクト用のレンダリングまでを加味すると、概算で40万から60万ポリゴンにも及ぶ。さらに影生成などの不可視な素材レンダリング用のポリゴンなどを含めるとGPU負荷的には100万ポリゴンに近いシーンもあるのではないかとのことだ。 1キャラクタあたりのおおよそのポリゴン数は5,000から1万ポリゴン。特に雷電、キャンベル、オタコンといった主要キャラは1万ポリゴン程度だという。 そして主人公のスネークは、PS2版「MGS」の最後期作である「MGS3」では約4,400ポリゴン、PS3版「MGS4」では1万4,000ポリゴンとなっており、約3倍のジオメトリ量になっている。なお、スネークの形状モデルはゲーム中、デモシーン、インストール時のクローズアップで共通だとのこと。
筆者の取材によれば他のゲームスタジオでも、PS3、Xbox 360、Windows-PCといった今世代のハイデフ・ゲーミング・プラットフォーム(以下、「今世代のHDプラットフォーム」と記する)では100万ポリゴンをGPU負荷の1つの目安としているところが多いように思える。「MGS4」も大体この値に近い。キャラクタについては、3人称ゲームだと数千ポリゴン止まりにしている作品が多いのだが、「MGS4」の場合はクローズアップショットが多いので、現在のHDプラットフォームの標準値よりもやや多いという手応えだ。
体の47ボーン中、モーションデータ(アニメーションデータ)で駆動されるのは21本。意外なことに、アニメーション駆動されるボーン数はPS2の「MGS3」より少なくなっているのだという。「MGS4」では少ないボーンで高いクオリティのアニメーション表現ができるテクニックが実現されているのだ。残りの26本(47-21)は肘や膝、腕や脚のような、スキニング時に破綻しやすい部分に挿入されている補助ボーンで、モーションデータからランタイム時に算術的に駆動されるボーンになる。 ボーン数がわかると気になるのはモーション数(アニメーション数)だ。主人公スネークで比較すると「MGS3」のスネークが1,200個、「MGS4」のスネークが1,700個となっている。ここは「MGS4」だけでなく、「MGS3」のスネークのモーション数の多さにも驚かされる。「MGS」のキャラクタはどれも演技派なので、ここは「MGS」シリーズのキャラの突出した部分ということができそうだ。 1ステージあたりのテクスチャ容量はおよそ160MB。これは1ステージあたりのグロスマップ(光沢マップ)、法線マップ、デカールテクスチャ(画像テクスチャ)などの主テクスチャの総量で、影生成用のシャドウバッファ、水面生成用のワークバッファなどのグラフィックスエンジン側で占有するテクスチャメモリ容量は含んでいない値だ。 グラフィックスエンジンの設計上の都合により、動的影生成用のシャドウバッファ関連はビデオメモリ側で、水面関連やその他のそれまでのレンダリング結果を次のレンダリングに活かすような動的生成テクスチャ素材などの一部はメインメモリに置いている。一部のテクスチャをメインメモリ側に置く設計は今世代のHDプラットフォームのゲームエンジンではよく見られるタイプだ。 キャラクタ単位で見ると、メインキャラクタのテクスチャは1体当たり5MB程度、雑魚キャラで3.5MB程度になっているとのこと(DXT1,DXT5圧縮後の値)。サイズとしては顔が512×512テクセル、体が1,024×1,024テクセル程度となっている。この値は決して贅沢ではないが、それでも「MGS4」のビジュアルがリッチに見えるのは、シェーダによる多彩なリアルタイム陰影との相乗効果があるからだ。 表示フレームのレンダリング解像度は1,024×768ドット固定。これをディスプレイ側の出力解像度に合わせ、16:9にスケーリングして表示している。1,280×720ドットでないのは、縦解像度を重視したためだろう。
シーンによって上下する可変フレームレート設計になっているが、ゲーム中のフレームレートは基本的には平均30fpsを維持できるようにチューニングが成されているという。なお、システムの設計自体は60fpsに対応できる設計で、ゲームロジックとレンダリング部は基本的には同期設計なので、どちらかに過負荷があった場合にも非同期で動くことはない。また「MGS4」は、カットシーン(ムービーシーン)においてもリアルタイムレンダリングを採用しているが、カットシーンでは30fpsを死守するよりは、見た目のリッチさを重視したと高部氏は述べている。
■ HDRレンダリングは整数バッファによる疑似実装
「MGS」シリーズの場合は、技術的にどうこうというよりも、メインテーマとして潜入(スニーキング)アクションゲームという看板を掲げているので、どうしても暗いところを正確に表現したいし、今作「MGS4」では日中までを活動範囲として広げているため、真っ暗なシーンとまばゆい明るいシーンとの行ったり来たりが避けられない。これをリアリズムを持って表現するにはHDRレンダリングの導入が不可欠だったといえる。 「MGS4」におけるHDRレンダリングの実装は、開発初期の様々な実験の結果として最終的な仕様が決定された。今でこそ、最新PC向けGPUでは浮動小数点バッファへの機能と性能が充実しているため、「HDRレンダリング=浮動小数点バッファ」という図式が成り立つが、PS3のGPU「RSX」は今から2世代前のNVIDIAの「GeForce 7800 GTX」ベースであるため、浮動小数点バッファへの機能性が低く、理想通りには行かなかったのだ。具体的に理由を挙げれば以下のようになる。 1つは、RSX(≒GeForce 7800 GTX)では、16ビット浮動小数点(FP16)バッファに対してマルチサンプルアンチエリアシング(MSAA)が利用できないという制約があるため。これでは画面にジャギーが残ってしまい、最終映像の美しさを重要視する「MGS4」では採択できなかったのだろう。 2つ目はフィルレートが不足気味になるため。αRGBがFP16のバッファは64ビットサイズとなり、これで高解像度レンダリングをやるには、RSXの128ビットバスでは少々つらいのだ。また、GeForce 6000/7000アーキテクチャはFP16バッファの半透明合成処理が遅いが、この特性はRSXにも受け継がれており、ここの部分もネックだったようだ。
結果的にはαRGBが全て8ビット整数の、従来通りの8888の32ビット整数バッファ(int32)を用いてのレンダリングが採択された。int32バッファではHDRレンダリングができないのでHDRを格納するための工夫が必要になる。これについては各社それぞれに一家言があり、トライエースでは固定小数点の概念を導入して2倍の輝度レンジまでのHDRを圧縮してint32バッファで表現していた(3Dゲームファンのための「ヴァルキリープロファイル2」グラフィックス講座)。
このレンダリングパイプラインで生成されたエンコード済みバッファから値を読み出す場合は、今度は逆にデコードの処理が必要になる。これは、各RGBから取りだした値とαから取り出した値(このRGBで共有される最大輝度の逆数)を掛け合わせることで求められる。
この考え方では、αに格納される値(RGBの最大輝度値の逆数)が1.0に近ければ近いほど表現精度が高くなる(αに格納される値が1.0以下では通常のLDRレンダリングと等価になる)。
この仕組みだとαに格納される値が0に近づくにつれて誤差が大きくなり、1.0に近づくにつれて精度が高くなる特性がある。そこで「MGS4」のシーン特性に合わせ、αに格納される値が1.0になる値を輝度値0.25にチューニングして実装したということになる。高部氏によれば、この方式でも輝度値にして0から50.0くらい程度までは実用レベルで表現できるのではないかという。
32ビットバッファを使ったこのHDRエンコードレンダリング手法の採用で、FP16ベースでは実現できなかったMSAAが実装でき、なおかつ帯域消費を従来の32ビットバッファレンダリングと同等に押さえることができたためパフォーマンス的にも優位となった。しかし、代償もある。 このバッファへのアクセスはエンコード(書き込み時)、デコード(読み込み時)が必要になり、この処理がいくら演算負荷が軽量とはいっても、無償ではない。多量のアクセスを伴う処理ではそれなりの負荷となる。本来はデコード/エンコードしなければならないのはバッファなのだが、バイリニアフィルタ付きでサンプリングして直接処理してしまっても、品質は低下するがそれなりに見える事がわかったため、高負荷な処理に限っては、このバッファへのアクセスへのデコード/エンコード処理を省略している。具体的には後述の被写界深度のシミュレーションなどがこのケースにあたるが、ただし誤差が大きくなった副作用でボケた部分のHDR情報が失われてしまう。ここはゲーム側のパフォーマンスを優先した判断といえる。
■ ブレンドバッファ・レンダリングという最適化発想
これが「MGS4」チーム内で「ブレンドバッファレンダリング」と呼んでいたテクニックだ。まず、前述したような手法で不透明の通常内容をHDRエンコードレンダリング方式でHDRエンコードバッファにレンダリングする。続いて、半透明内容は奥から手前に向かって別バッファ(ブレンドバッファ)にレンダリングする。 このブレンドバッファへの半透明の内容のレンダリングは輝度レンジ0.0から2.0の範囲内に固定させた疑似HDR次元(本連載「ヴァルキリープロファイル2」編参照)で行なう。前述のデコード/エンコード処理を回避したレンダリングになるので負荷低減になる。これが期待される最適化効果の1つだ。
「MGS4」でのブレンドバッファ法で取り扱えるブレンディング手法は、αブレンドと加算ブレンドの2つの方法に限定しており、またブレンドバッファは、あらかじめR=G=B=0,α=1.0で初期化しておく前準備を必要とする。ブレンドバッファへの書き込みには、HDRエンコードレンダリング手法よりは簡単ではあるが、図で表したような計算ルールを適用している。
特徴的なのはα値の内容だ。αブレンドではもともとブレンドバッファのα値に格納されていた内容に「1.0-ブレンドする内容のα値」を書き込んでいる。加算ブレンドの場合は、RGBに対するブレンド処理で完結してしまう計算なのでブレンドバッファのα値は変化しない。
最後に、先にレンダリングしておいたエンコードされたHDR次元の不透明内容と、このブレンドバッファの半透明内容を合成することになる。具体的には「HDRの不透明内容」をデコードし、「輝度レンジ0.0から2.0までの疑似HDRの透明内容」と同輝度基準にしてからシェーダーでブレンド処理を行なって合成している。
理想的には、輝度レンジ0.0から2.0に固定されているブレンドバッファの内容を、HDRバッファの内容の輝度レンジに一致させる必要があるのだが、「MGS4」ではこの処理を省略している。もし、まじめにやるのであれば、前フレームのHDRエンコードバッファの内容の平均輝度から輝度スケールを求めて、この輝度スケールに配慮して合成すると言うアイディアを高部氏は提案する。 不透明内容のHDRエンコードレンダリングはMSAAを適用しながらのレンダリングになるが、半透明のブレンドバッファについてはMSAAを適用していないため、このぶんパフォーマンスが稼げる。これが期待される最適化効果の2つ目となる。 ブレンドバッファへのMSAAがないということはこれについてのジャギーは回避できないことになるわけだが、もともとブレンドバッファの内容は(半)透過するもので向こう側が透けて見えるものなので、元来としてあまりジャギーが気にならない。逆にいうと半透明内容はMSAAの効果自体が現われにくいので問題になりにくいのだ。このあたりの手法はコストのかけ方と得られる効果のバランスがよく考えられたパフォーマンス重視の3Dゲームグラフィックスらしいクレバーな実装だといえる。
高負荷な広範囲のエフェクトについては、ブレンドバッファに対して縮小バッファの概念を導入している。これも「MGS4」の手法の特徴だ。 「MGS4」では、ブレンドバッファとこれに対応するデプスバッファ(Zバッファ)を1/4サイズに縮小して、半透明エフェクトをこの縮小版ブレンドバッファに書き込んでいく。解像度が1/4になる代わりに負荷は1/4へ軽減されることになる。そしてHDRエンコードバッファとの合成は、この縮小版ブレンドバッファを4倍にバイリニア拡大して行なわれる。 縮小版ブレンドバッファに書き込まれたエフェクト達は深度値を用いての前後判定も縮小版デプスバッファをベースに行なっているため、フル解像度版のHDRエンコードバッファと合成したときに前後関係をはみ出してエフェクトが合成されるような弊害が出るが、これもまた元々半透明のものなのであまり粗が目立たない。 「MGS4」では、遠くのエフェクトについては小さく描かれることが多く、高負荷になりにくいしより精細な表現ができるとして、視点から遠い半透明エフェクトについては、前述したフル解像度版の方のブレンドバッファに書き込んでいる。縮小版ブレンドバッファには視点から近い半透明エフェクトを選択的に書き込むようにしている。いわばブレンドバッファのLOD(Level of Detail)的実装も取り入れているわけだ。
縮小バッファと言えば、本連載で取り上げた「ロストプラネット」編でも触れているが、「ロストプラネット」では解像度を下げた縮小版シーンテクスチャに対して半透明エフェクトを描いてこれをフル解像度版のシーンフレームにブレンド合成していた。この手法だと半透明越しに透けている情景の解像度が下がる弊害がある。「MGS4」の手法だと最終的にフル解像度の情景と合成されるのでこの弊害がない。ここは「MGS4」の手法の副次的なメリットだといえる。 画面全体を吹き荒ぶ砂埃、吹雪などのフォグ表現は、レンダリング解像度の16分の1の低解像度のフォグエフェクト専用の縮小版ブレンドバッファに大量描画することで、半透明描画負荷の低減を狙っている。
フォグエフェクトの描画が終わったときにはこの超縮小版ブレンドバッファを拡大して、シーンの深度値(デプス)とフォグエフェクト側の深度値(拡大によってさらに大ざっぱな解像度にはなっている)を比較し、濃度や輝度を調整して合成している。描画順序の兼ね合いから透過のつじつまに多少の矛盾が出るが、もともとフォグエフェクト自体が柔らかく大ざっぱなものなので目立たないのでここは無視している。
■ 物理的正確さよりも映画的演出を重視した環境ライティング
環境光とは、光源からの直接光でなく、相互反射などによって生まれた二次光源(間接光)の総体で、本来ならばレイトレーシングなどを行なって正確に求めなければならないものを簡易的に表した「その空間に立ちこめる光」のこと。「MGS4」では、この環境光に、低負荷ながらも高い効果が得られる「半球ライティング」(Hemisphere Lighting)を実装している。
今世代の3Dゲームグラフィックスで人気の高い環境光は「アンビエントキューブ」(Ambient Cube)、あるいは「放射輝度ボリューム」(Irradiance Volume)と呼ばれる手法だ。これは、事前にレイトレーシングなどを行なって適当な間隔で方向を持った環境光を設定して、実際のライティング時にこれを吟味するという技法になる。
半球ライティングは、本連載「ヴァルキリープロファイル2」編でも紹介しているので詳細はそちらを参照して欲しいが、ここでも簡単に解説すると、環境光を2方向から与える仕組みのこと。地面からの環境光と空からの天球光に環境光を一般簡略化したモデルのことだが、「MGS4」では任意の2方向に考え方を拡張している。
アンビエントキューブ法では、シーンを一定間隔に区切ってオートマチックに環境光を組み入れてしまうが、「MGS4」では、デザイナがシーンごとに任意の方向、任意の影響範囲(バウンディング指定)の設定ができるようになっている。つまり、2方向から照らせる仮想的な照明器具をシーン内に影響範囲の指定を含めてデザイナが配置設計しているということだ。なお、影響範囲は階層指定ができる設計になっているとのことで、例えば設定した半球ライトへ近づくにつれて(または遠ざかるにつれて)影響させる半球ライトを切り換えられるような構造になっているわけだ。
■ 擬似的なラジオシティ表現も可能な分離プリライティングとは?
具体的には、シーンにデザイナーが設定したその分離プリライティング専用の光源からのライティング結果を、事前に背景のポリゴンモデルの各頂点の付随属性に焼き込むテクニックになる。簡単に言えば、いわゆる頂点単位のライトマップに相当する。ライティング結果の焼き込みは、互いに直交する3方向の基準ベクトルに対して行なうのがこの方法の特徴だ。 背景を構成するポリゴンの各頂点にはこの3方向のライティング結果が焼き込まれていることになり、この背景ポリゴンに適用する法線マップなどの陰影処理にもその3方向のライティング結果を利用する。
こうすることで、薄暗い中では陰影に乏しい法線マップによるディテール陰影が非常に豊かになる。これがこのテクニックの実装の最大の恩恵となる。そしてデザイナーが、シーン設計時に設置することになる、その分離プリライティング用の光源の数に制限はなく、その光源の置き方や強さを工夫することでラジオシティライクな表現を背景に対して実現できる。
例えば街灯に灯がともったとして、その街灯の光の影響が出そうなところに新たに分離プリライティング用の光源を新設して、再計算して分離プリライティング情報を更新してやればいい。そうすれば、街灯が灯った後の、動的に相互反射が実現できているような効果が得られる。さらに、この街灯を破壊したときには、逆に分離プリライティング用の光源を削除して分離プリライティング用情報を更新すれば、街灯が消えた後の相互反射を表現できる。
焼き込むライティング結果が頂点単位なので表現精度が粗めだったり、頂点データに付随情報が多いとパフォーマンスが低下するクセがあるPS3のRSXではパフォーマンスインパクトが大きいと言った課題も抱えるが、現時点でなし得る現実的な擬似的相互反射表現としてはリーズナブルな実装だと思う。
(C)2008 Konami Digital Entertainment
□KONAMIのホームページ (2008年12月3日) [Reported by トライゼット西川善司]
また、弊誌に掲載された写真、文章の転載、使用に関しましては一切お断わりいたします ウォッチ編集部内GAME Watch担当game-watch@impress.co.jp Copyright (c)2008 Impress Watch Corporation, an Impress Group company. All rights reserved. |
|