[CEDEC#02]CEDECに併せNVIDIA「開発の鉄人」イベント開催,人魚と海賊の謎が明らかに
2004/09/07 03:35
 ゲーム開発者向けの一大イベントであるCEDECと同時に,NVIDIAの開発者向けイベント「開発の鉄人(NVIDIA Iron Developer 2004)」とマイクロソフトのDirectX開発者イベントである「Meltdown 2004」が併催される。初日の9月6日は開発の鉄人が開催されたので,ここでは開発の鉄人イベントのセッション概要をお伝えしたい。

■人魚と海賊

 最初のセッションは「人魚と海賊:NVIDIAデモ開発チームのさらなる秘密」と題して,GeForce 6800用のデモに関する解説が行われた。デモに使われている技術などについては,すでにかなりお伝えしているが,これまで伝えている内容と若干違った部分もあり,今回の内容のほうが正確と思われるので,食い違う内容があった場合は今回の記事を参考にしてもらいたい。

 最初は人魚Nalu。いくつかポイントはあるが,なんといっても「金髪」「長髪」である。黒髪と違って,金髪ではハイライトを多段階で付けないと自然な感じにならない。黒髪ではハイライトは1段階で天使の輪などを描いておけばそれなりに艶やかな黒髪に見えるのだが,金髪ではこれが3段階は必要になる。また,髪自体の影も髪に落ちる。さらに黒髪ではほとんど考慮しなくていい,髪を透過してくる光の影響もある。金髪を自然に表現するのは,CG的にはチャレンジングな分野でもあるわけだ。



左は黒髪短髪のDawn。自然な髪の毛には違いないが当時は技術的にここまでしかできなかった。現在のNaluでは金髪で長髪が可能になった


髪の毛に必要な3種の光の状況。これら3つの要素によって自然な髪のシェーディングが可能になる
●髪のシェーディング
 さて,髪の毛(とくに金髪)を表現するには3種類の光について考える必要がある。髪の毛に反射してくる光(R:Reflex),髪の毛に透過しさらに透過して外に出てくる光(TT:Transfer-Transfer),髪の中に透過して内部で反射して外に出てくる光(TRT:Transfer-Refrex-Transfer)の三つだ。単純な反射光はそのままレンダリングすればいいのだが,残り二つはちょっと工夫しなければならないところ。
 TTハイライトは普段はあまり意識しなくてもいいのだろうが,逆光になった場合に強く影響が出てくる。Naluのように水中では髪が浮いて広がったり,視点によって光源の影響が多く出るので必須項目ともいうべき処理となっている。
 Naluでは髪を4次元関数の反射モデルとして定義し,これらの処理を行っている。とはいえ,4次元のままでは処理が大変なので,式を低次元へ織り込むことで2次元の処理の組み合わせに変形していく。2次元の式になった途端に,計算部分をテーブルに置き換えることが簡単で,処理は簡単になるのだ。
 GeForce6シリーズでは,16ビット浮動小数点数や32ビット浮動小数点数のバッファがテクスチャとして使える。これを使って演算結果をテーブルとして用意しておけば,複雑な関数も瞬時に答えを得ることができるわけだ。シェーダプログラムからはテクスチャアクセスが自在にでき,MIPMAPや線形補間などが使えるので値のエイリアスも除去できる。
 髪の毛単体のシェーディングはこれでOKなのだが,前述の通り,金髪では影にも工夫がいる。Naluでは「髪から影が落ちるか」ではなく「髪から何%の光が落ちるか」を計算するOpacity Shadow Map(OSM)を採用している。髪というのはラインなのでエッジ成分の塊なわけだが,シャドウマップはエッジのギザギザを出しやすいという特徴がある。これがOSMを使うことで,エッジの影響を抑えた自然な影が実現できるようになるという副作用もある。
 OSMはSIGGRAPH2001でTae-Tong KimとUlrich Neumannの提出した論文を基にNVIDIAでリアルタイム実装を行ったものだ。KimとNuemannの論文では,以下のような(左の図),影なしだと自然な金髪に見えない例が挙げられている。

 NaluのOSMは16段階で,髪の毛全体を覆う包囲球を想定し,光源からの距離ごとにその球を16等分にスライスする平面を設定し,それぞれの平面に落ちる影を合成しているという。頂点シェーダ,ピクセルシェーダの両方を使い髪の毛に影をマッピングしている。その結果,以下の右側の図のような自然な効果が得られている。



それぞれ左半分が影なしでシェーディングしたもの。影がないと自然な質感は出てこないことがわかる


●長髪の処理
 さらに長髪である。実はNaluの髪の毛はそんなに多くない。4095本だそうだ。とはいえ,これを1本1本物理シミュレーションするのはそれなりに重い処理になる。そこでNaluでは制御髪を762本だけ動かし,ほかの髪の毛は制御髪の動きに追従して動くようにしているという。
 まず基本的な頂点でざっと物理シミュレーションを行い,それをもとに頂点補間を行って,滑らかなラインを生成してレンダリングしていく。問題の物理シミュレーションはMass-Spring(ばねと錘)システムを使っている。とはいえ,髪の毛の長さが伸び縮みしてもまずいので,髪の毛はかなり硬いばねとして定義されている。しかし硬いばねだと値が収束しにくいなどの問題があるのだが,これをVerlet積分を使うことで解決している。Verlet積分は,動力学の分野ではリアルタイムシミュレーションなどで広く使われている数値積分アルゴリズムだ。Verlet積分では,次の位置が確定するまで速度が確定しないという欠点があるのだが,Naluでは前の頂点位置を保存しておくことで速度を計算している。

 ということで,黒髪の短髪だった妖精さんと今回の人魚姫では技術的に大きな飛躍があるわけだ。ちなみに,GeForce FXが出た頃に行われたデモ解説で「Venus&Vulcan」というのがあった。その頃はDawnの髪の毛にアンチエイリアスを施すというのは最新のトピックであった。その当時売り出し中だった,DawnちゃんのEvilTwinであるDuskちゃんの髪も,大筋では大差ないものだ。

 そのほか,水中での光の放射「ゴッドレイ」の放射状ブラーは座標系を極座標に変換してから縦ブラーをかけるとか,ソフトシャドウの実現でUVに展開したキャラクターへのセルフシャドウを行うのだが,非連続になる部分がどうしても出てくる(脇の下とか)ので,それは髪で隠すなど目立たないところにしているなど,デモ制作のさまざまなテクニックが紹介された。


上段左は制御髪だけのレンダリングと追従する髪の毛を加えた例。
上段右はUVに展開されたキャラクタ表面へのシャドウ書き込み例と合成例。展開時に切り離しているので不連続になってしまうラインが存在する
下段左からゴッドレイで使われている極座標ブラーの動作を示した図ならびに光源と人魚の陰を書き込んだ元絵。この絵を光源位置からからブラーをかけることで2次元の光の筋を作って最終画像に合成している。3次元的に見える処理だが2次元処理だけで実現されている


光源の方法を向くとシーン全体がシルエットになるAuto Gain Controlの様子。HDRらしさのある絵だ


■Timburyに見る特殊効果

 続いては昆虫学者Timburyのデモだ。ポイントはいくつかあるが,HDR処理と画面のソフト化,キャラクターの適応型メッシュ生成がその主なところだ。

●HDR
 Timburyでは,画面全体をfp16の精度で処理している。整数8ビットでの処理に比べて数値範囲も広く,精度も高く,光の効果や後処理,特殊効果などで威力を発揮する。
 Timburyでは,画面全体の光の量を調整するAuto Gain Control(AGC)が行われている。これは人間の目では自然に行われていることで,カメラ,ビデオなどではいわゆるAE(自動露出)といわれる機能に相当する。太陽の方向を向けば,ほかのものはシルエット気味に見えるとか,そういった自動調整だ。こういった輝度の制御にはHDRが適している。

 こうして画面全体での光の量を同じにするように全体を調整していくわけだが,光学では,こういった場合,トーンを直線で処理するよりも非線型トーンカーブを使用するほうが自然になることが知られている。実際に非線型のデモ画像も提示されたが,それだとコントラストが弱くなるという理由で,Timburyでは直線のトーンマップが使われている。まあ,おそらくは後処理でのソフトブラー合成が効きすぎているのであろう。

●NG集
 オマケでTimburyのデモでの未収録ショットも公開された。メガネの処理を間違えたもの,画面で行われているローパスフィルタ処理をハイパスフィルタにしたもの,サブディブジョン分割を間違えたものなど。おどろおどろしい画面満載でこれはこれで別の特殊効果に使えるテクニックなのかもしれない。

上段左からブラーと合成によるソフト化の様子。右の2点はオリジナルメッシュと自動分割後の滑らかなレンダリング例
下段左は直線的トーンと非線形トーンによる出力例。左の非線形のほうが自然だが,右のハイコントラストな絵作りも捨てがたい。中央と右の2点はNG集。ちょっと怖いレンダリング例が並んでいる


海賊船ことClearSailingのデモ

■海賊船

 最後は,海賊船のデモについて。主に波と船の挙動などについての解説だ。
 海面はピクセルシェーダだけでもそれっぽい水面を作ることはできるのだが,海らしいダイナミックな波を表現するため,バーテックスの次元で処理を行っている。波生成のアルゴリズムにはGerstnerのアルゴリズムが採用されている。映画などではFFTを使ったものが使用されるらしいが,FFTの持つ繰り返し性は切れ目のない海を作るのには向いているが,同じ形の波が繰り返すのが見えては不自然である点などからGerstnerの方法が選ばれたようだ。
 Gerstnerのアルゴリズムでは上下しながら移動するする円を合成して海面を表現する。ClearSailingのデモでは45個の円が使用されている。
 これを150×150のメッシュに対して適応しているのだが,これは画面に見える範囲だけに適応されており,視界外は処理されていない。視点を遠く離してもメッシュの密度は変わらず,常に一定レベルの処理がされるようになっている。これくらいのメッシュであれば,GPUにはまったく負荷にならないという。また画面効果としても十分な波が実現できている。
 ということで,実はそれほど緻密な波ではないわけだが,海面への映り込みの処理でノイズ成分を入れることで,高周波成分があるかのように見せるなどのテクニックも使われている。
 また,シーン全体は8ビット整数で演算されているのだが,オーバーフローを起こした部分をαチャンネルに書き込み,α部分にブラーを入れたものを白く合成することで,ハイライトからの光の拡散など,HDRぽい処理を実現している。

 NVIDIAでは,これらのデモで使われた技術は,即,製品にも適用可能なものと考えているようだ。こういった技術が適用できるビデオカードが普及するのも時間の問題だろう。来年あたりのゲームでは,ここで挙げたような処理が主流になっているかもしれない。今後の新作を見るときには,ここで挙げたような処理に注意しておくと面白いかも?  (aueki)




左は海面のメッシュ分割の様子。視界外は処理していない。
中央は波と映り込みの様子。細かなさざなみがあるように見えるのはノイズを加えたため
右はHDRっぽい光の表現例



友達にメールで教えよう!

この記事へのリンクはこちら
http://www.4gamer.net/news/history/2004.09/20040907033508detail.html