2010年9月17日金曜日

CryEngine3

機能一覧
http://www.4gamer.net/games/032/G003263/20090330021/

リアルタイム動的グローバルイルミネーション(Real-time Dynamic Illumination)
ディファード・ライティング(Deferred Lighting)
動的なソフト影生成(Dynamic Soft Shadows)
ボリューム表現と空気遠近(Volumetric Layer & View Distance Fogging)
法線マッピング、視差遮蔽マッピング(Normal Maps & Parallax Occlusion Maps)
スクリーンスペース・アンビエント・オクルージョン
統合された植物生成エンジン
HDRレンダリング
屋外から屋内へ、屋内から屋外へと輝度レベルが全く異なる環境間の往来を行なった時には、そのシーンの輝度レベルに自動的に合わせた階調補正(トーンマッピング)が行なわれる。
モーションブラーと被写界深度
画面全体の動きにブラーを掛けるカメラ・モーション・ブラー(CMB、Screen Based Motion Blur)と、3Dオブジェクトごとの個別なアクションにモーションブラーを付加するオブジェクト・モーション・ブラー(OMB)の両方がサポートされる
動的な日照システム
高品位な水の表現
大海の海原の波はJerry Tessendorf氏のアルゴリズムによる波動シミュレーションを実装

岸辺と泡沫の処理

左が岸辺境界処理と泡沫なし。右が岸辺境界処理と泡沫あり
 水面と陸地の境界線が強く出てしまうのもCGっぽい見た目の原因となっている。

 これを低減するために「CE2」では、水面と岸辺の境界が近くなればなるほど水面の透明度を上げるようにブレンドしている。これは丁度、パーティクルとシーンの交差線を見えにくくするソフトパーティクル処理と原理はまったく同じだ。

 水の上に浮かぶ泡……「泡沫(うたかた)」については2レイヤーのアニメーションの泡テクスチャを水面のさざ波法線マップで摂動させつつ、岸辺境界から水深の深い方向に向かって柔らかく合成していっているだけ。それでも、十分満足のいく結果になったとしている。

「色収差」現象を擬似的にシミュレートしている。

水面に映り込む鏡像には垂直ブラーを施す工夫がなされ、水面下の屈折した情景とはフレネル反射を考慮して合成される。ここまでは比較的よく見られる水面表現だが、
CE3では、水面下の情景のRGBピクセルをずらして見せる疑似的な色収差表現や、
水面の凹凸がレンズ効果となって集光現象を起こして水底に網目模様のようなきらめきを映す「火線」(CAUSTICS)など、徹底したリアルな水底表現を行なっている点がユニークだ
ジオメトリレベルの波の生成
「CE2」の水面表現は「ジオメトリレベルで立体的でリアルあること」をコンセプトとして開発されている。競合の「UE3」も同様の方針を取っているので、これは今後のトレンドとなる可能性が高い。
波動シミュレーションの結果はCPUで計算され64×64グリッドに適用され、
これが64×64テクセルのFP32-128ビット (R32G32B32A32F) テクスチャに転送される。
このFPテクスチャをVTF (Vertex Texture Fetching) を用いてジオメトリレベルの立体的な水面の凹凸へと変換する。
なお、64×64のグリッドは全水面に反復使用されることになり、
反復性がユーザーに露呈する可能性があるが、これを低減する意味合いもあって、
4レイヤーの周波数の違う動的な法線マップアニメーションをこのジオメトリレベルの凹凸の水面に合成している。
「CRYSIS」の水面における反射と屈折
反射マップには異方性垂直ブラーを仕掛けている
の反射マップをレンダリングするタイミングは数フレームに1回という制限を設けることで負荷低減を行なっている
視線が動かないときも反射マップの更新をさぼっている
ユニークな試みとしてこの反射マップには垂直方向のブラー (ぶれ) を仕掛けているという。それも始点から遠いほどブラー量が少なく、近い位置ほどブラー量を多くするという異方性のブラーを適用している。これは映り込みがキッチリしすぎるCG水面のわざとらしさを低減するとともに、低解像度反射マップのジャギー (エイリアシング) を低減する副次的効果もある。

・屈折
「GPU Gems2」の「Generic Refraction Simulation」に記載されている技法をほぼそのまま適用している。
プロシージャル生成された集光効果「火線」

これまでの多くの3Dゲームグラフィックスでは、こうした火線効果はあらかじめ用意したそれっぽく描いた適当なパターンテクスチャを投射するだけであったが、「CE2」では、火線シェーダーを実装してリアルタイム合成している。Sousa氏は「火線のプロシージャル生成」という言葉を使ったが、解説を聞く限りでは「GPU Gems1」に記載されている「Rendering Water Caustics Juan Guardado (NVIDIA) and Daniel Sanchez-Crespo (Universitat Pompeu Fabra / Novarama Technology)」を参考に実装したものと推察される。

 これは水底下の情景の各ピクセルにおいて、このピクセルの法線方向にレイを飛ばし水面のポリゴンと交差して、水面上へどういう角度でこのレイが飛び出すかを計算し、これが太陽方向に向いていれば向いているほど明るい……という陰影処理を行なって求める技法だ。

http://maverickproj.web.fc2.com/pg96.html

水面を真横から見た波の断面

青い矢印が水面の法線ベクトルです。で黄色いところがコースティックにより明るくなります。 輝度を計算する方法は単純で、法線ベクトルと[0.0f, 0.0f, 1.0f]のベクトルとの内積を計算するだけです。その後白黒反転するので、結果的に図の部分が明るくなります。 物理学的にはまったく正しくない、擬似的な方法ですが、結構それっぽく見えると思います


リアルタイム光筋表現(Dynamic Volumetric Light Beams & Light Shaft Effects)
深度値を見て遮蔽マスクを生成して、これを太陽光の位置から放射状にブラーさせる。あとはこのマスクで、同様に引き伸ばし拡大した太陽光を覆えば完成
深度バッファを調査して太陽を遮蔽しているマスクを生成し、これを画面上の太陽位置から放射状にブラーを掛ける。さらに同じ方向に太陽もブラーして拡大し、これを前出のマスクと合成すればできあがりだ。概念的には、逆光の太陽を遮っている遮蔽物の影の広がりが、太陽光を遮蔽する……というイメージだ。この光筋表現は地上の逆光時にだけでなく、水面下で水上を見上げたときにも適用される。


■ 水面下の表現~水中に降り注ぐ光筋の表現

 基本的には火線シェーダーと同じアルゴリズムのものを動かしているという。

 生成した火線を、視点 (カメラ) の前に戸板のように並べた無数のレンダーターゲットに投射していく。レンダーターゲットは画面解像度の1/4の低解像度のものを使用している。

 イメージ的には火線を投射して作り出した無数のどでかい光筋スプライトをカメラから奥行き方向に向かって重ね描きしていくようなイメージのようだ。超大ざっぱなボリュームレンダリングのようなイメージだろうか。

 なお、水面下の奥行き方向の霞んで見える様はZバッファの内容 (深度値) をキーにして濁らせる擬似的な光散乱フォグで表現している。

水面下に降り注ぐ光筋の表現。後述の逆光の光筋とは別の実装法左が光散乱による霞み表現、中央が火線表現を付加したフレーム、右がさらに光筋を付加したフレーム。この図ではわざとわかりやすいように光筋は色濃く示しているが、ゲーム中では実際はもっと薄い



CryEngine3考察
読んでて疑問符が浮かんだ某所のは間違いだらけじゃないか。今に始まった事じゃないけど。ついでに、このblogも正確性なんてものはあてにしないで下さい。

Deferred LightingはForward Shadingと、Deferred Shadingの合いの子みたいな感じで以下のようなパス。
  1. Deferred Shadingと同じようにライティングはしないでG-Bufferをレンダリングする。ただし基本的には、Z値と法線とスペキュラパワーのみ。
  2. 1で描き出したバッファを元にライティングのみを行う。一般的なのはDiffuseとSpecularのみで、各成分を分けて描き出すかはその後の用途次第か。今回の資料ではIBLと同じだとは言ってるが、確かに似たような感じだがDeferred Shadingにも同じことが言えるので言いすぎな様な気もする。ともかくDeferred Shadingと同じような恩恵は受けれる。
  3. Forward Shadingと2のバッファを使って描き出す。深度テストもシェーダでやるなら1も必要か。Deferred Shadingとはここが違う箇所。Deferred Shadingでは使うが1で描き出してないバッファは不要になるし、Deferredであんまりやりたくないようなこと(多分専用のシェーディングとか?)はここで出来るし、半透明も完全別扱いのような扱いはうけなさそう

3でもう一回描画することで、水の表現が可能になっていると思う


0 件のコメント:

コメントを投稿