|
【Game Developers Conference 2004】レポート
GDC2004「Micorsoft DirectX Day」開催 |
講演を務めたのはPRTの使用を熱く推奨するマイクロソフトWindows Gaming & Gaming Technologies Development Lead Jason Sandlin氏 |
しかし、現実世界は、そう単純な話ではなく、部屋の中にいる自分に対して照射してくる光は、天井の蛍光灯の直接光だけでなく、壁に反射してからやってくる反射光もある。家具があればその反射構造はもっと複雑になるし、光を阻害する物があれば、逆に光はやってこない。
こうした複雑なライティングを「大域的な照明」すなわち「グローバルイルミネーション(Global Illumination)」といい、3Dグラフィックスの研究分野として盛んであり、毎年関連新技術の発表がある。
このグローバルイルミネーションを実現する処理系は、これまでは、とてもリアルタイムには行なえるものではなかったのだが、GPUの高性能化とプログラマブルシェーダ技術の進化により、現時点ではかなり限定条件があるものの、リアルタイムにて実現できるようになってきている。
実際の3Dゲームに対しリアルタイム・グローバルイルミネーションを導入することは、懐疑的な開発者も少なくないのだが、昨年リリースされたDirectX 9.0bの時からマイクロソフトはこの限定的なグローバルイルミネーションの採用に力を入れている。今回の「DirectX Day」でも、この実現様式の1つである事前計算放射輝度伝達関数(Precomputed Radiance Transfer:PRT)が紹介された。ちなみに、この技術は2002年のSIGGRAPHにてPeter-Pike Sloan氏らが発表した論文が元になっている。
PRTは、ある意味直接光だけでレンダリングしない……というコンセプトのレンダリング技法ともいえる。だから、影も出るし、相互反射も球面調和関数の次数に応じて配慮される |
ある3Dモデル表面上の各点において、「どのような遮蔽構造になっているか」, 「光がどうやってくるか」を調べ、これをパラメータ化してテクスチャ化する。
遮蔽構造……というと難しく聞こえるかもしれない。たとえば茶碗の3Dモデルを想像してみよう。その茶碗の最底面の一点に自分が小人になって立ってみたとする。真上方向は空が見えるが、角度を低くしていくと茶碗の外郭に到達して、それより下は茶碗の内側の囲いしか見えなくなるだろう。着目している一点において、360°を映すことができる魚眼レンズカメラで写真を撮るようなことを求めるのが「遮蔽構造を調べる」という意味に相当する。なお、この作業を茶碗を構成する全ての点で行なう。
光がどうやってくるか……というのは、丁度下図をみるとイメージしやすい。光は面に当たると光量が減衰して方向が変わる(拡散反射の場合)。着目している点Pにおいて、どの程度光がやってくるかをパラメータ化してテクスチャ化するわけだ。こちらの作業も全ての点について行なう。
そのパラメータ化には球面調和関数(Spherical Harmonics:SH)と呼ばれる、少々難解な数学を使うのだが、DirectX 9.0cでは専用APIが新設され、開発者側に数学的な知識を求めない(ということになっている)。
なお、この作業は膨大な演算量になるが、リアルタイムにレンダリングする前にあらかじめ計算しておくことができるので、ここから「事前計算」の名前が付いている。処理内容を考えると一種のエンコードに近い作業といってもいい。しかしその分、実際のレンダリング時は少ない命令のシェーダーで複雑な反射と遮蔽を配慮した陰影処理が行なえるのだ。ちなみに、実際のレンダリング時のシェーダーもHLSL(マイクロソフトが提供するC言語ライクなシェーダ言語)にて提供される。
PRTの魅力は、レンダリング結果に、
(1)現実世界に近い柔らかいセルフシャドウが見られる
(2)相互反射の効果を出せる
(3)面ににじみ出る光拡散表現もやろうと思えばできる
といった利点にある。(1)のありがたみはもはや説明は不要だろう。(2)は3Dのオブジェクト同士の距離感にリアリティが表れる。白い車と赤と車が近づいたとき、白い車の表面に赤い車の赤色が転写するような状況を想像するといい。(3)は肌の陰影処理のリアリティ向上などに貢献する。ちなみに当たり前だがやろうとすることが増えれば増えるほど処理は重くなる。
下の画面を見て欲しい。
当然、光源の位置が変わったときにも、動的にセルフシャドウまでが出るのだが、その影の付き方がステンシルシャドウボリュームやシャドウマップのような切り抜いたような影でなく、非常に柔らかい影になっている点に注目したい。なお、このデモでは電球のような1つの点光源ではなく、環境マップを光源としたイメージベース・ライティングを行なっているので、室内のような柔らかい光に満ちたライティングになる。現実世界でも、様々なところで反射した光が無数の方向からやってきているから、影が淡くなるのだ。
DirectX 9.0c SDKに含まれるPRTサンプルでは上記(1)~(3)の表現に対応するが、下図は(1)の効果のみを適用した画面を示している。
さて、このセッションでは、難しいイメージのあるPRTがDirectX 9.0c(SDK)ならば、全ての3Dゲーム開発者が簡単に使える……ということをアピールしたかったわけだが、現行PRTには制限も多い。
1つは、動く人体モデルのような、形状が変わるオブジェクトに対して適用できないということだ。これは事前計算した遮蔽構造や、光の伝達模式をパラメータ化したテクスチャが役に立たなくなってしまうからだ。人体が腕を曲げたら、その人体についてもう一度時間をかけて事前計算をしなくてはならなくなる。
現在では、こうした問題を起こさないことを前提に活用するしかないわけで、そうなると、「バイオハザード」などの3Dアドベンチャーゲームのような、固定背景のグラフィックス用途などに限定されてくるだろう。
筆者のRADEON9600PRO搭載ノートPCで実行した頂点単位のPRTのレンダリング結果。一番明るい光は手前から、その他あらゆる方向から無数の光が当たっている様子を示した映像だ。左の板に大きな輪、球体の影が柔らかく投射されているのがわかる | 一番明るい光は手前下から上向きに光が当たっている様子。輪と壁が最も近い位置に一番濃い影が出ている。現実世界の今いる室内で出る影はこんな感じのはずだ |
なお、マイクロソフトは、いくつか考案されているPRT実現法のなかでもGPUリソースの消費が比較的軽微な頂点単位のPRTの使用を推奨している。頂点単位のPRTでは、そのライティング処理が頂点単位になってしまうのではっきりしたセルフシャドウや相互反射を出しにくいのだが、これについてはSDKに含まれる「PRT SIMULATOR」というツールを用いて、取り扱う3Dモデル形状にどうPRTが適用されるかを配慮した形で、そのポリゴンを分割(テッセレート)する方策で対応している。
事前計算に結構な時間が掛かるものの、(1)程度の表現を求めるだけならばリアルタイムレンダリング時はそれほど重くはない。つまり、プログラマブルシェーダー2.0アーキテクチャの現行GPUでも、PRT自体はまあまあ現実的に動かすことができるのだ。
たしかにリアリティには問題はないが、動かないキャラクタにしか適用できないという制限は大きい。これをどう3Dゲームに活かしていくかというアイディアの方が難しそうだ。また、(2)、(3)までをやると現行GPUではかなり重くなる。
今後、PRTがPC-3Dゲームグラフィックスにどう活用されていくのか(あるいは全く活用されないのか……)非常に興味深いところだ。
(2004年3月26日)
[Reported by トライゼット西川善司]
GAME Watchホームページ |
|