3Dゲームファンのためのグラフィックス講座
西川善司の3Dゲームファンのための「GRAVITY DAZE」グラフィックス講座(後編)
(2013/2/13 00:00)
「GRAVITY DAZE」ならではの特殊表現(1)~空とフォグ
「GRAVITY DAZE」のビジュアルで非常に印象的な要素の1つとして「空」、「フォグ」がある。本作の世界の空は、緑から黄のグラデーションだったり、黄からピンク、紫から赤へのグラデーションだったりと、我々の住む現実世界とはだいぶ異なっている。フォグも茶、緑、黄など非常にユニークだ。それでいて、独特なリアリティが感じられ、空とフォグには妙な一体感すらある。
本作の世界だけにしか存在しえないような独特な「空気遠近」の表現はどのように作り込まれているのか、興味を持った人も多いことだろう。この独特な空とフォグの表現は、開発チームこだわりのアルゴリズムによって実現されている。
近景に対しては空気層の厚みに応じて、フォグ色が支配的な色あいとなる。しかし、遠景に行けば行くほど、空のグラデーション表現に一体化するような色変化をするようになっている。空の天球から地面に対するグラデーションと、地表の近景から遠景までの奥行き方向のフォグのグラデーションが一体化して見えるようなアルゴリズムが盛り込まれているのだ。
この表現の実現には少々手の込んだ方法が使われている。まず、フォグ色と空テクスチャはシーンの深度値を媒介して決定される。具体的には、近景ほどフォグ色が強く、遠景ほど空テクスチャの色を支配的としている。このまま、シーンのレンダリング結果に合成すると視点から見た空気層の厚みが無視されるので、合成の際には深度値を見て空気層が厚ければ厚いほどフォグ色が強く出るように合成する。
横川氏:このフォグ・空テクスチャとレンダリング結果の合成にはPS VitaのPowerVR SGX543MP4+ならではの機能を活用しています。PS3にしろXbox 360にしろ、一般的なGPUでは、レンダーターゲットの内容って読み出せないですよね。一般的なGPUでは、一度レンダリングを完了させて、それをテクスチャとして次のパスで参照する…というような2パス手法になるはずです。しかし、PowerVR SGX543MP4+では、レンダーターゲットの内容をそのパスで読み出して描き戻せるんです。
松田圭司氏:シェーダでレンダーターゲットの内容を読んで書き戻せるということは、実質的にプログラマブルなブレンドを実現できることになるんです。この「空」、「フォグ」のシーンへの合成処理、そして背景オブジェクトの輪郭線の合成描き込みはこの機能が効果的に活用されています。
背景オブジェクトは、遠景になればなるほど「フォグ」と「空」のグラデーション色の中に沈むことになり、最遠景の背景オブジェクトに至っては「空」の色が支配的となってしまう。そこで開発チームは、遠景の背景オブジェクトに関してはライティング及びシェーディングを省略し、背景オブジェクトをほぼ“裸”ポリゴンでレンダリングするという大胆な決断をする。
ちゃんとライティングとシェーディングが行なわれた背景が立ち並ぶ領域も、裸ポリゴンでレンダリングされた領域にも、視線ベクトルと背景オブジェクト上の各ピクセルの法線ベクトルとの内積値はαチャンネルに仕込まれるため、背景に対する輪郭線描画は分け隔てなく行なわれる。
映像全体として見ると、最遠景は空色の中に背景オブジェクトの輪郭線だけが際立つという絵画的なビジュアルテイストとなるのだ。その輪郭線だけの最遠景から視点方向に近づいてくるにつれて、背景オブジェクト達は、ライティングとシェーディングによって生成されたディテール表現を露わにし出す。
最遠景から近景に至るまで、輪郭線だけは堅固に描かれるため、まるで作家が中遠景くらいまではしっかり描き込んだが、最遠景だけはペン入れだけで済ませたような、メリハリ感のあるアーティスティックなテイストになるのである。
当然、最遠景の背景オブジェクトに対する「ライティング及びシェーディングの省略」は、GPU負荷低減にも繋がるわけで、パフォーマンスアップにも貢献することになる。いわば、ここは、ビジュアルテイストの実現とパフォーマンス向上のための最適化が見事一石二鳥的に成り立った部分と言える。
「GRAVITY DAZE」ならではの特殊表現(2)~HDR表現の立役者「ブルーム」エフェクト
「GRAVITY DAZE」では、キャラクター達に対してはバンデシネシェーダによるLDRベースの特殊シェーディングを採用しているが、背景に関してはHDRレンダリングを行なっている。そして、LDR、HDR混在のレンダーターゲットに対してステンシルバッファによるマスクを用いた特殊なトーンマッピングを適用している。
このトーンマッピングを経た上で、映像中の高輝度と見なされる部分に対しては、「GRAVITY DAZE」においても、一般的なHDRレンダリングベースのゲームグラフィックスのようなブルームエフェクトを与えている。
筆者は、「GRAVITY DAZE」のゲーム世界が、独特なフォグ色、特異な空色をしているにもかかわらず「こんな世界が本当にありそう」と感じさせてくれるのは、前述の「フォグ・空」効果と、このブルームエフェクトによる効果が大きいのではないかと感じている。
さて、「GRAVITY DAZE」ではブルームエフェクトの手法としては川瀬正樹氏(現シリコンスタジオ在籍)が考案した川瀬式Bloom Filterを採用している。
これは、映像中の高輝度部分を低解像度バッファとして抜き出して、3×3のコーンフィルタカーネルでボカし、その結果を再びカーネル径を広げた3×3のコーンフィルタカーネルでボカしていくことを繰り返すテクニックだ。
川瀬式Bloom Filterは、広範囲に及ぶボカしを広角的に作り出す手法として定番なものだが、「GRAVITY DAZE」では、その実装形式がとてもユニークなものとなっている。まず、ポストエフェクト用のワークバッファとして768×384テクセルのレンダーターゲットを確保する。
ここに、シーンのレンダリング結果内の高輝度部分を256×128テクセルで抽出する(図中の緑の矢印部分。level0)。これを同一レンダーターゲットの別領域に128×64テクセルに縮小してコピーする(level1)。これに対し3×3のコーンフィルタカーネルを用いてぼかす処理を行い、その結果もやはり同一のレンダーターゲットの別領域に出力する(level2)。これを繰り返して異なるボケ具合の映像を複数生成し(図中の赤の矢印部分)、これらを全て1つに集約合成して最終ボカし映像を作成(図中の青の矢印部分)。最後に、これを本作のメインレンダーターゲットの解像度である720×408ドットに拡大して、シーンのレンダリング結果と合成して最終結果とするのだ。
松田氏:1つの大きな(768×384テクセル)のレンダーターゲットを確保し、これをビューポートを細工して切り換えて、ポストエフェクトの入力元ワークバッファとして活用しつつ、同時に出力先ワークバッファとして利用しています。同一のレンダーターゲットの内容を読み出しながら、処理してそのレンダーターゲットの別領域に描き出しているわけです。これも一般的なGPUではできないPowerVR系ならではのテクニックだと言えます。
宮前氏:PowerVR系はレンダーターゲットの切り替えのコストが高いので、この方法がとても効きます。
「GRAVITY DAZE」ならではの特殊表現(3)~ユニークなオリジナルシェーダー表現
「GRAVITY DAZE」では、その独特なアートコンセプトを具現化するために、既存のゲームグラフィックスではあまり見られないようなユニークなオリジナルシェーダーを開発している。
「GRAVITY DAZE」では、敵キャラとして「ネヴィ」と呼ばれる黒い軟体質チックな敵性生物が出現する。その形状は種類によって異なり、人型のようなものもあれば魚介類系、節足動物系のようなものまでが登場する。ネヴィに共通しているのは、外皮がウニョウニョと動き、不気味な異方性反射の陰影を醸しだしてくるところだ。
この表現は開発チーム内で「敵シェーダ」と呼ばれた特殊シェーダによって実現されている。蠢く外皮は、頂点シェーダを用いて、敵モデルの各頂点を法線方向に変移させることで実現される。この有機的な頂点変移は、事前にアーティストが設計したノイズのような変位テクスチャに対し、u、vアニメーション付きで、頂点シェーダを読み出すことで実現している。
そして表皮の異方性反射は視線ベクトルと法線ベクトルを引数にして2Dカラーテクスチャをサンプルして適用することで実現している。
横川氏:PowerVR SGX543MP4+では、頂点シェーダーからテクスチャを読み出すVTF(Vertex Texture Fetching)が利用出来ます。自分としてはVTFをゲームグラフィックスに効果的に使えた珍しい例だと思っています(笑)
「GRAVITY DAZE」では、この他にも印象的な異方性反射の表現がある。それが「ジェム」アイテムの陰影で、周囲の情景を映しつつも、怪しく発光しているように見える。しかもその輝きは視線方向によって見え方が変わるので、自発光なのか反射光なのかよく分からない不思議な見た目となっている。
この印象的な異方性反射は、「ジェムシェーダ」と命名されており、前フレームのレンダリング結果をフィードバックさせるタイプのシェーダーで実現されている。
具体的には、ジェムをレンダリングする際、ジェム上のピクセルからその法線方向(アーティストの感性によるバイアススケール値が設定される場合もある)に向かって、前フレームの映像をサンプルすることでジェム上の疑似映り込みを実現している。前フレームのサンプルのさせ方によっては疑似的な透過材質表現や屈折表現もできるとされる。
宮前氏:このテクニックで用いるサンプル対象の前フレーム映像は、ポストエフェクト等に活用した縦横半分の低解像度映像としています。このテクニックは、透けて見えるような表現が、通常の不透明オブジェクトのレンダリング、1パスで描画できるというメリットもありますね。
「GRAVITY DAZE」では、煙や爆炎のような基本的なものから、必殺技発動時や衝撃描写の際に焚かれる各種閃光など、様々なエフェクト表現が画面上に乱舞する。その際のエフェクトの発現や消失にユニークなアニメーションが付けられているが、これは複数のテクスチャを使ったものかとおもいきや、実は携帯ゲーム機のグラフィックスらしい軽量実装となっている。
「エフェクトシェーダ」と命名されたこのシェーダが参照するのは1枚のテクスチャだけだ。このテクスチャのRGB成分にはベースとなるカラーテクスチャが格納され、αチャネル部には有機的な発現/消失パターンを濃淡で表した値が格納されている。
エフェクトシェーダは、機能としては、与えられたαチャネル部の濃淡値に応じて、既に描画済みの結果と、同じく与えられたベースカラーテクスチャとをα合成するだけのシンプルなものとなる。
そのα合成の際、αテストの閾値を0~255の範囲で与えてやると、αチャネル部の中の閾値条件を満たせなかった箇所は何も描かれず、閾値条件を満たせた箇所だけが描かれる。この閾値を連続的に変化(アニメーション)させてやると、αチャネル部の濃淡階調に沿って、このエフェクト自体を発現させたり、消失させたりができるのだ。
バリエーションを持たせようとするならば、このαチャネル部を数種類用意したり、あるいは閾値の変化にバリエーションを持たせればよいことになる。軽量な実装のわりには情緒豊かな表現ができると言うことで、「GRAVITY DAZE」ではこのテクニックが多用されたようだ。