西川善司の3Dゲームファンのための「KILLZONE 2」グラフィックス講座(後編)
~オランダ精鋭部隊がCELLプロセッサで実装した「脅威推測型AI」の秘密


「KILLZONE 2」

4月23日発売予定

価格:6,980円

CEROレーティング:D(17歳以上)


 前編では「KILLZONE 2」の特徴的なレンダリングパイプラインである「Deferred Shading(ディファードシェーディング)」について紹介した。後編では、こちらもまたGDCでの技術セッションをベースに、PS3専用タイトルである「KILLZONE 2」ならではのCELLプロセッサ活用術にまつわる話題をお届けする。



■ 「KILLZONE 2」のゲームスペックとCELLプロセッサの活用方針

Guerrilla Games Technical Director Michiel van der Leeuw氏
「SPUは手強い敵だった」と「KILLZONE 2」チームは回想する

 「KILLZONE 2」の発表は、ちょうどプレイステーション 3(PS3)が発表された2005年のE3で行なわれた。欧米での発売は2008年を予定していた。実際の制作も2005年頃からなので開発期間は約3年と言うことになる。ピーク時の開発メンバーはアムステルダム内で140人、ソニー系の外注先スタジオに50人ほど、平均すると120人ほどだった。プログラマは27人で、1番構成員として多かったのはゲームコンテンツ側で9人。続いてグラフィックス系が7人、AI系が6人、ネットワーク系が5人となっている。

 開発で苦労したのは、やはりPS3のCPUであるCELLプロセッサ内部の128ビットSIMD型RISCプロセッサのSPE(Synergistic Processor Elements、SPUはSPE内部の演算コアだけを指すが、慣例的にSPE=SPUという認識があり、Guerrilla Game提供の資料もSPUとなっているのでこれに従う)の部分だったと開発チームは振り返っている。

 メインCPUの3.2GHz動作のPPE(Power Processor Element、PowerPC970互換。本稿では前述のSPE=SPUと同じ理屈で以降はPPE=PPUとして、PPUと記述する)の他に、3.2GHz動作で6コアのSPUがゲームプログラムで利用できる仕様になっていたが、開発初期は情報がなく開発は困難を極めたという。SPUは汎用プロセッサだというが、当時はすぐに使えるライブラリがなく、SPUの効果的なプログラミングは絶望的だったようだ。

 ともあれ、紆余曲折を経て開発チームはSPU向けジョブとして44種を設計。代表的なものとしては以下のものを挙げている。

    ・アニメーション
    ・危険予測AI
    ・火線回避AI
    ・障害物回避AI
    ・衝突判定
    ・物理シミュレーション
    ・パーティクルシミュレーション
    ・パーティクルレンダリング
    ・シーングラフ(シーン取りまとめ)
    ・ディスプレイ(描画)リスト作成
    ・イメージベースドライティング用光センサー(IBL Probe)計算
    ・グラフィックスのポストプロセッシング
    ・動的音楽演奏システム制御
    ・スキニング処理
    ・MP3展開
    ・Playstation Edgeに含まれる圧縮展開ライブラリ(Zlib)

 最も基本的な処理系といえる、スキニング処理やパーティクル関係の実装から始めたが、逆にSPUで実装したものを不採用としたものもある。それは流体シミュレーションで、これは見た目に優れなかったことを不採用の理由に挙げている。基本フレームレートは30fps。1フレーム辺りのSPUで行なっている処理量も公開している。

 具体的には、

    ・物理シミュレーションは毎フレーム100体まで
    ・IBL Probe生成は最大600程度
    ・レイキャスティングは最大250本(後述)
    ・最大200個分のアニメーションサンプル
    ・最大250個分のパーティクル処理
    ・最大6シーングラフのトラバーサル
    ・最大2,000体のグラフィックスオブジェクトの描画
    ・75個分のスキニングバッチ処理
CPU負荷を示すデバッグモニタ画面

となっており、これは現行機のPS3の実効スペックがわかると共に、逆にまた最新ゲームの負荷トレンドを知る上でも重要な情報だ。開発時は画面に負荷をバー表示する画面を設けてデバッグを行なったとのことで、その時の画面も公開している。

 中央がPPU(上端)とSPU(その下)の活動状況を示したもので、画面キャプチャ時の関係上でPPUのバーしか映っていない。右側にはSPUの活動中のジョブ(SPU TIME)が表示されており、各列について解説すると左側から「ジョブ名」、「ジョブ数」、「毎秒30コマに占める占有時間」となっている。ジョブはおよそデモシーンでも1,000個は走るが、AIやゲームプレイ処理が省略されるため、SPU活動数は1.5程度で低負荷な方だとのこと。逆にゲームプレイ時にはSPUは常時4~5個が使われることになるとのことだ。



■ SPUで実装した「KILLZONE 2」のAI

 PS3開発者がCELLプロセッサをどう活用するかは頭を悩ませるところだが、「KILLZONE 2」では敵のAIロジックをSPUで実装している。しかも、現行の3DアクションゲームのAIとしてはハイレベルな「推論ベース」のAIであり、なかなか高度なものとなっている。

 「KILLZONE 2」のステージマップはウェイポイント・ベースの構造をしている。移動できる箇所がリスト構造になっていてネットワークで結ばれているイメージだ。敵と味方のNPCは、この見えないノードを分岐点にした見えないネットワークの上を歩くことになる。

 ウェイポイントは1ステージにつき数千個にも及び、各ウェイポイントには、そこから見た全方位の深度値を記録した低解像度のキューブマップを仕込んでいる。ここがユニークな点だ。このキューブマップはグラフィックス描画に使うのではなく、このウェイポイントにおける空間の広がり、もっといえば遮蔽構造を端的に表したデータとしてAIによって利用される。

 このキューブマップは、開発チーム内ではCover Map(遮蔽マップ)と命名されており、生成は事前計算でオフラインで行なわれる。その解像度は非公開だが、深度値は6ビットに圧縮されて記録されているとのこと。公開画面ショットを拡大して見る限りは16テクセル×16テクセル×6面という仕様に見える。いずれにせよ、SPUの256KBのローカルストアで取り扱いやすいように、データサイズはコンパクトになっている。

 このCover Mapはウェイポイント移動時に「第三者に自分が隠れて見えるかどうか」、あるいは「ある地点へいくのに、第三者に見られないように移動するにはどうすればいいか」の判断材料に用いる。

【Cover Map】
白は近くに遮蔽物があることを示していて黒は開放されていることを表す。赤が現在自分がいる場所を表している

 具体的な局面として、プレーヤーが遮蔽物に隠れている場合を想定し、「KILLZONE 2」の敵AIの振る舞いを見ていくとしよう。ここで敵AIに望まれる行動とは、敵AIはプレーヤーの居場所を推測し、そこに向かって威嚇射撃をしたり、あるいは次に姿を現わすかもしれないところに先撃ちしたり、あるいは待ち伏せをすることだ。

 「KILLZONE 2」のAIは、プレーヤーと「いつ」、「どのウェイポイントで」遭遇したかを記憶しており、AIは過去のプレーヤーとの遭遇位置のウェイポイントからどのウェイポイントへ移動したかを推測していく。もし、そのウェイポイントがこちらから可視範囲であればそこは捨てる。なぜなら、可視範囲なのにプレーヤーが見えていないというのは論理的に矛盾するからだ。この判定を過去のプレーヤーの位置から、移動先として可能性のあるウェイポイントをドンドン探索していく。

 この探索範囲が広くなりすぎた場合は敷居値を設けて打ち切る。逆に探索範囲が狭く、プレーヤーの移動先が絞れた場合は、各AIに付けられた性格的行動に移行したりする場合がある。例えば、そこから移動せずに攻撃を続けたり、あるいはプレーヤーが隠れていそうな場所が、確認できるところまで、移動するなどだ。

 こうしたAI動作の様子を可視化した画面が下図だ。階上のプレーヤーが階下の敵AIと対峙していて、プレーヤーは階上の遮蔽物に隠れているというシチュエーションだ。敵AIは、最後に襲撃があった場所(今回の例では現在隠れている場所にたまたま相当している)から中心にプレーヤーが移動した可能性の高いウェイポイントの探索を始める。敵AIから見えないウェイポイントは、そこに行けるかどうかを知る術がないので探索は行なわない。

 なお、「KILLZONE 2」の実装では、シーン状況に変化がなくなり、敵AIにとっての「脅威」がなくなった場合は、次の行動をとるためにSPUに最大4ジョブの次の行動をとるための脅威予測(THREAT PREDICITION)スレッドを発行している。この例では、プレーヤーの次の移動先予測探索の結果と、前述の遮蔽マップの情報も参照した結果、遮蔽物の途切れる図中の黄色いウェイポイントに先読み威嚇射撃をすることを決定している。

【推論ベースの敵AI】
階上のプレーヤーが階下の敵AIと対峙していて、プレーヤーは階上の遮蔽物に隠れているというシチュエーション「KILLZONE 2」の敵AIは推論ベース。実際に対峙するとその人間のような知性的行動に感銘を受けるはず



■ 味方への誤射の回避行動AI

 「KILLZONE 2」のような敵味方が入り乱れて戦うFPSでしばしば問題となるのが、プレーヤーやNPCによる誤射だ。代表的なのは、プレーヤーの銃撃先に味方AIが立ちふさがって誤射になる現象だ。あるいはこちらが銃撃している敵に対し、味方AIが背後から加勢してくれるのだが、その銃撃がプレーヤーの背中にも命中してしまうという誤射。

 いずれも味方同士の「火線」(Line of Fire)を遮ってしまうことから発生する問題行動だ。「KILLZONE 2」の味方AIは、移動先を決定する際に、どのウェイポイントが味方の火線を遮ってしまうかに配慮して決定している。具体的には、各軍勢の銃撃の射程が投射されてしまうウェイポイントには「危険」マークを付けて、味方はそこを移動先候補から外している。

 「KILLZONE 2」では、各敵AIはその世界の“神”であるゲームイベントプログラムで駆動されているのではなく、各個人がリアルタイム推論ベースで動作しているところに特徴がある。完全なランダム行動ではなく、かといって常に敵の行動を把握しているインチキ行動でもなく、プレーヤーの行動に対してインタラクティブな行動をとるため、敵に知性すら感じることができるわけだ。

 「KILLZONE 2」では、遮蔽物分布を表したCover Mapを事前計算しているが、このCover Mapを、もしリアルタイムに敵キャラクタ視点で描いていたら、最新のCCD付き自律行動型ロボットのAIのようになり、さらに高度なAIになっていたのかもしれない。さすがにPS3のSPUを持ってしてもそこまで高度なAIの実装は無理だが、いずれそうしたAIがゲームに搭載されるときも訪れることだろう。

【誤射を防ぐ仕組み】
階上に2人の同軍がいて、階下に敵がいるというシーン階上の2人の立場でいくと、2人は階下の敵を射撃することになるので想定される射撃範囲がオレンジと黄色のカプセルのような形状の範囲となるこの射撃範囲カプセルに含まれたウェイポイントが誤射危険地帯となる



■ 「KILLZONE 2」におけるパーティクルシミュレーションはSPUで実装

 30fpsの「KILLZONE 2」でも、パーティクルシステムはとても高負荷なものとして存在している。1フレームあたりのおよその負荷としては、最大250個のパーティクルシステムが稼動し、うち150システムほどが描画される。1フレーム辺り、最大3,000パーティクルの更新があり、最大200個の衝突判定用のレイキャストが発生する。

 「KILLZONE 2」ではこのパーティクルシステムを最初PPUで実装したが、かなり遅かったようだ。パーティクルシステムはマルチコアCPUにとっては悪夢のテーマで、マルチスレッド化してもそのスレッドごとにメモリアクセスが頻発してしまう。こうするとキャッシュスラッシングが起きてパフォーマンスの低下が著しくなる。そこで開発チームは時間を割いて、初期のPPUベースのパーティクルシステムをSPUベースに移植する決意をしたという。

 まず最初の1カ月までにパーティクルの頂点生成をSPUで行なう実装をした。続く2カ月目ではパーティクルのシミュレーションコアをSPUに移植。3カ月目はパーティクルシステムのデータレベルでの最適化、4カ月目ではメモリアロケーションなどの最適化を実施。結果的にはほぼ全てのPPUベースのパーティクルシステムをSPUへ移植でき、ほぼ全てがSPU上で動作できるようになったという。パーティクルシステム関連でPPUに残された処理は描画のためのシーン取りまとめ処理、サウンド制御くらいのものだとのこと。

 このパーティクルシステムのSPU移植によってパフォーマンスが劇的に改善されたが、この理由として「単位時間あたりのパーティクル処理量を劇的に増加できたこと」を第1の理由に挙げている。この他、各SPUで動作しているパーティクルシステムが256KBのローカルストア内で局所的に動作できたことも理由として挙げている。SPUプログラムがローカルストア256KB内でやりくりできるということは、一般的なCPUでいうところの常にデータキャッシュがヒットしていることに相当する。メインメモリとのデータの出し入れも各SPUがDMAで行ない、あるSPUがデータがやってくるまで待たされていても、別のSPUで稼働中のパーティクルシステムがローカルストア内で処理できる状況であれば並行動作できる。

 このSPUパーティクルシステムのおかげで、PPUオーバーヘッドを20分の1にまで減少、すなわちPPU負荷を減らすことができ、一般的なゲームと比較して約3倍のパーティクル量の処理が行なえるようになったとしている。

【パーティクルシステム】
パーティクル量が多い「KILLZONE 2」のエフェクト。その秘密はSPUで実装したパーティクルシステムにあった


 


■ 「KILLZONE 2」はイメージ・ポストプロスもSPUで実装

「KILLZONE 2」の頂点アニメーション処理はPS Edgeで行われている

 PS3のGPUであるRSXは、PC向けのNVIDIA GeForce7800GTXデチューン版で、固定配分シェーダアーキテクチャ世代であり、さらにいえば家庭用ゲーム機専用設計であるため、統合型シェーダーアーキテクチャを他者に先駆けて採用したXbox 360のGPUと比べるとピーク性能は低めだ。しかし、PS3にはCELLプロセッサがあり、そのハンデを、SPUを使って埋めることがPS3ゲームグラフィックスの実装におけるトレンドとなっている。

 もっとも、一般化しているのがSCEが提供するSPUミドルウェア「Playstation Edge」(PS Edge)を活用する方法だ。PS Edgeについては本連載でも取り扱ったことがあるのでそちらを参照して欲しいが、簡単にいうと主にRSXの頂点シェーダの性能不足をSPUで補うものになっている。

 「KILLZONE 2」でもPS Edgeを利用しており、「IK(Inverse Kinematics:逆方向運動学)処理のための独自拡張は施した」としているものの、主に頂点のアニメーション処理の全般を「Edge Animation」にて行なっている。30fpsの毎秒1フレームあたり、最大40個のアニメーションジョブが発行されており、最大200個ほどのアニメーションが参照されている。なお、1体の人型キャラクタに付き2個から50個のアニメーションのブレンディング処理が行なわれるとのこと。

 パフォーマンス的には1基のSPUだけで負荷率12%以下で済んでいるが、PPUベースで実装したときの処理時間の20%以下にまで時間が短縮されたというから、単純に考えてSPUで処理したことで5倍早くなったと言うことになる。

 「KILLZONE 2」はSPUを頂点シェーダのヘルパーとして起用しただけでなく、ピクセルシェーダのヘルパーとしても起用している。それはポストプロセス処理だ。具体的には以下の3つが代表的だ。

    (1)HDRレンダリングの高輝度部からのあふれ出し(ブルーム処理)
    (2)モーションブラー
    (3)被写界深度(DOF:Depth of Filed)

 ポストプロセスとは簡単に言えばレンダリング結果としての映像フレームに対してピクセルシェーダでフォトレタッチみたいな処理を施すこと。こうした処理はもちろんRSXでもできることなのだが、「KILLZONE 2」開発チームの経験則的な手応えとしては、ポストプロセス処理時間がRSXの全処理時間の20%を超えるようならば、それはSPUで実装した方がよいと判断できるのだという。

 「KILLZONE 2」では一部のポストプロセスをSPUで肩代わりし、空いたRSXの処理時間で、もうちょっと別のレンダリング処理を行なえるように配慮した。具体的な処理の流れとして以下のような感じになる。

    (A)RSXがローレゾ版(低解像度)のフレームをレンダリングしてメインメモリ(XDR)に準備
    (B)RSXがSPUに割り込みを発生
    (C)SPUがポストプロセスを実作業する
    (D)RSXは既に次フレームのレンダリングを開始
    (E)SPUのポストプロセスが終了したらその結果をRSX側に受け渡す。RSXは今行なっている次フレームのレンダリングを一時中断して、そのポストプロセス結果を適用した最終フレームを表示
RSXで行なったポストプロセスよりもSPUの処理結果の方が品質が高いことも確認された

 なぜSPUでポストプロセスするフレームがローレゾ版なのかというと、「それはSPUがハイレゾフレームを処理するほどの性能がないため」だと開発チームはいう。しかし、上記の3タイプのようなポストプロセス処理ならば、どうせぼんやりとした内容のエフェクトなのでハイレゾでやる必要性はあまりない。これも大きな理由の1つだろう。

 右図の表は30fps時でのRSXだけでポストプロセスを行なったときと、RSXと5基のSPUで行なったときの負荷を表したものだ。結果を見るとわかるようにポストプロセスをRSXで行なわずSPUに外注することによってRSXの負荷率が6%ながら低減したことがわかる。ただ、処理時間だけに着目するとRSXで行なった時よりもSPUで行なった時の方が掛かっているのだという。ただ、RSXと並列して実行されるため結果的にRSXの負荷率は下がっているので「よし」としている。また、RSXで行なったポストプロセスよりもSPUの処理結果の方が品質が高いことも確認されたそうだ。これは、SPUで行なった時の方が演算精度が高いため、と分析している。


■ SPUで実装したポストプロセス

・ブルームエフェクト

 開発チームがまずSPUで実装したのはHDRレンダリング向けの効果としてよく用いられるブルーム効果(高輝度から光があふれ出す効果)だった。これは1/4の解像出力された結果フレームから高輝度部分を抽出して1/8、1/16、1/32、1/64サイズとさらに低解像度の高輝度フレームを生成し、それぞれに対して7×7のガウシアンブラー(ガウスぼかし)フィルターを16ビット固定小数点精度で適用。1/4~1/64サイズのボカした結果達の解像度を揃えて、α合成用バッファに出力する。実装としては本連載で紹介した「METAL GEAR SOLID 4」のブレンドバッファのテクニックと同じと見られる。

 なお、高輝度部をぼやかす際には深度値も見ており、遮蔽物があればそのあふれ出しに若干の抑制を与えるような工夫も盛り込んでいる。実装の結果、1基のSPUでおよそ13.1%の負荷率で、実行時には5基のSPUで処理させ、それぞれに約2.6%程度の負荷率で処理させているとのことだ。

・モーションブラー

 「KILLZONE 2」ではモーションブラーのポストプロセスもSPUで実装している。ポストプロセスの種(入力)には1/4解像度のレンダリング結果。そして1/16にまで縮小した画面座標系基準に換算した動きベクトル(Motion Vector)バッファを用いる。モーションブラーのポストプロセスは本連載でも紹介したCRYTEKの「CRYSIS」のオブジェクト・モーション・ブラー (OMB) の方法とほぼ同じだ。

 1/16解像度の動きベクトルバッファは1ピクセルが画面上でどの方向に動くかの二次元的な情報を持っている。これは前フレーム時の各頂点の位置と現在フレーム時の各頂点の位置の差分から各頂点単位の速度がわかるので、この情報をもとに、視点から見たピクセル単位の速度情報に変換してテクスチャに書き込んで生成する。なお、プレーヤーの動きが激しい時にゲーム画面全体がブラーだらけにならないように静的オブシェクトについては動きベクトル生成対象外としている。つまり、ブラーがかかるのは動的オブジェクトのみということだ。

 モーションブラーはこの動きベクトルバッファの値を元にレンダリング結果をボカしていくわけだが、そのままだと動き量が小さくて迫力が小さい。そこで、CRYSISの時もそうだったように、動きベクトルバッファの動いているところを膨張させる処理を行なっている。

 この膨張版動きベクトルバッファから1/4解像度のレンダリング結果をボカしていく。ボカしフィルタは8タップのポイントサンプルのみで、「CRYSIS」でのような「ピンポン・ブラー」は行なっていないようだ。これについて開発チームは「ボツボツとした粒子の粗いブラーとなったが、これで十分だと判断した」と振り返っている。

 1/4解像度のブラー・イメージを1/4解像度の元イメージと合成するが、その際のα値は動きベクトルの値に準ずる。つまり、動きがほとんど無い部分はα値がゼロになるため、透明で合成される結果として描画されるという寸法だ。実装結果としては1基のSPUで約9.5%の負荷率。実行時の5基のSPUで動作させた場合の負荷率はSPU1基あたりで約1.9%程度だったという。

【モーションブラー】
1/4解像度のレンダリング結果1/4解像度のデプスバッファ1/4解像度の動きベクトルバッファ。実際の処理時には1/16に縮小して使用

・被写界深度

 開発チームが最後にSPU実装したのが被写界深度のシミュレーションのポストプロセスだった。入力映像はこれもやはり1/4解像度のレンダリング結果映像、そして1/4解像度の深度バッファだ。手法としては、仮想的なカメラで、捉えたシーンに対しての焦点距離と絞り開口率を与え、合焦距離からのズレ幅が大きいほど大きくボケるという典型的な実装となっている。

 ユニークなのは、そのボカしフィルタにSPUによる36点からなる円状ポイントサンプルを採用しているところ。36点というサンプル数の多さだけでなく、さらに計算も浮動小数点精度で行なっていることで高品位な結果が得られたとしている。フォーカスのズレが大きいほど錯乱円が大きくなるが、粗が目立たないように錯乱円半径の抑制が行なわれている。

 また、前後関係を無視したボケの染み出しが起こらないように、深度情報を吟味して後ろから前へサンプルし、前から後ろへブレンドするという複雑なサンプルメソッドを実装したという。これは複雑なロジックが実装できるSPUだからこそできたポストプロセスということができそうだ。

 実装結果としては1基のSPUで約23%の負荷。SPUで実装したポストプロセスの中では負荷率はかなり高めだ。実行時の5基のSPUで動作させた場合の負荷率は約4.6%。開発チームは被写界深度ポストプロセスがSPUでうまくいくかどうか不安だったそうだが、実装した結果、当初はRSXで実装していた8点バイリニアサンプルのときよりも大幅にクオリティも向上したため「SPUによる被写界深度ポストプロセスの実装は成功だった」と振り返っている。

【被写界深度】
1/4解像度のレンダリング結果SPUで処理したブルーム、モーションブラー、被写界深度のポストプロセス結果フル解像度のレンダリング結果とポストプロセス結果を合成した最終映像


■ まとめ~プレイステーション 3はSPUが救う

 PS3は登場から2年以上が過ぎて、やっとCELLプロセッサの本格活用が始まってきた感がある。特にPS3専用タイトル開発者はSPUに大きな可能性を感じているようだ。

 このSPUの活用において、「KILLZONE 2」で注目すべき点は2点。1つは3DグラフィックスのポストプロセスをSPUに実装させたこと。ポストプロセスはフィルレート消費が激しい処理だが、これをSPUで肩代わりすることは、フィルレート性能の低いRSXを支援することに繋がる。

 3Dグラフィックスのレンダリングパイプラインは大まかに考えると「頂点→ピクセル→ポストプロセス」となるが、今や、PS3では「頂点をSPU(≒PS Edge)で」、「ポストプロセスもSPUで」という潮流ができつつある。裏を返すと、RSXがピクセルシェーダーのみの役割しか任せられないということでもあり、なんとも悲しいことだ。

 2点目はSPU実装のAIがトピックだ。ウェイポイントベースではあるが、自律行動で脅威推測を行なうAIをSPUで実装したこと、しかもそれがマルチスレッドで敵の数だけ、NPCの数だけ走らせられるというのが、なんとも先進的だ。こうした設計のAIをXbox 360でやるのはもしかすると難しいかもしれない。PS3の美点が生きたフィーチャーといえる。

 PS3のGPU「RSX」は、いまや、「お荷物的存在」なのかもしれないが、SPUでまだまだ未来は切り開けるはず。PS3の未来はSPU活用が握っている。

KILLZONE 2 (C) Sony Computer Entertainment Europe. Published by Sony Computer Entertainment Inc. Developed by Guerrilla.

(2009年 4月 24日)

[Reported by トライゼット西川善司]