WS1--Lights Dancing--は、レンダリング手法としてレガシーモードと
Radeonでのみ動作できるアドバンスドモードを用意しています。
[レガシーモード]とは、GeForceでもRadeonでも動作できる互換モードでピクセルシェーダー2.0、
DirectX9.0は必要ですが、どちらかというと旧来のレンダリング手法の発展系です。
ただし、Radeonの場合はRendering Target Textureとして浮動小数点高精度テキスチャーを
使用して、全体的になめらかに表現されます。
GeForceでも固定小数点ながらビット数を増やす技法は紹介されているのですが、
今回は間に合いませんでした。
[アドバンスドモード]はRadeonのみがサポートしている先進のフィーチャーを用いた
レンダリング手法です。RadeonはMRTをサポートしていますので、一回のレンダリングで
複数の出力画を得ることができます。
今回は、oC0をカラー、oC1を高精度深度、oC2をキラキラマップの3枚の異なる内容を一回の
Renderingで作成し、様々な用途に使用しています。
キラキラマップはビデオポスト処理で光を滲ませたり十字の光点を打ち込むための
元素材として使用していますが、カラーマップと違う専用計算で作成していますから、
レガシーモードの「しきい値を超えた明るい点を滲ませる処理」とは違って
より自然な印象になっています。(なっているつもりなのですが、、、/^^;;; あくまで比較で。)
深度マップは最終処理でダイナミックDOFに使用しています。これは、カメラ対象の
サーファーにピントを合わせ、それ以外の遠近部はピンボケさせる処理です。
複数のサーファーがライドを開始したとき、視線移動がおこりますが、この時ボケ味が
変わっているのが分かると思います。
本当はカメラ対象からもピンが外れてしまうカメラマンのヒューマンさも表現したかった
のですが、今回は間に合いませんでした。
なお、アドバンスドモードを使用するとCATALYST3.2/3.4との組み合わせで
20時間以内に必ずハングアップする事が確認されています。このため、残念ですが
Version1.0ではアドバンスドモードは封印されています。
今回サーファーは非常に手の込んだ方法で描画されています。
ジオメトリは20個以上のボーンでスキニング変形し、レンダリングの都度VSで演算します。
シャドウはシャドウマップです。ライト方向からシャドウマップデプスをオフラインレンアリングし、
セルフシャドウとシャドウリフレクタのルックアップに使っています。
反射と屈折は、それぞれ毎フレームキューブマップをレンダリングしています。
ポイントは反射用は海面から上だけ、屈折用は海面から下だけをレンダリングする点です。
一旦海面のデプスを6方向それぞれにレンダリングし、TEXKILLで不要な部分を除去します。
これらのキューブマップを海面のバンプ反射・屈折ベクトルでLookUpします。
さてさて、WS1を用いてGeForceFXとRadeon9700を比較してみましょう。前述の
「サーファーのレンダリング手法」でも解説しましたように、WS1は一般的なゲームの
手法とは全然違うアプローチで作成されています。ですので、現在雑誌等で発表されている
レビュー結果とは必ずしも一致しないようです。
まずレガシーモードですが、同じ処理(テキスチャはRadeonの方がハイスペックを使用)でも
Radeonが数倍早いです。巷では9700とFX5800は同程度という認識が一般的ですが、
これは次のような理由によるものだと思います。
1.WS1がRadeonをベースに作ったので、GeForce用に最適化されていない。
GDC2003ですでにnVidiaはFP16の方が圧倒的に早くなるから、FP16を積極的に使用しなさいと
言っています。今回は時間切れでFP16は使用していません。
また、移植の段階でMRT用の出力が残ったりしている部分があります。MRTをサポートしていない
FXでoC1に出力するとoC0に上書きされるようですが、冗長な処理となっています。
いずれにしろ今回は移植に手一杯であまり最適化はできていませんので、
やらないとFXに対しフェアじゃないとは感じています。
2.GeForceの苦手な処理がメイン処理。
GeForceに限らず、WS1のようなRenderingTargetをビシビシ切り替えてオフラインレンダリング
しまくる処理というのは、ちょっと変わっています。こんな処理を行うゲームは
現状ありませんから、この処理に関してnVidiaでドライバのチューニングが進んでいなかったり
あるいは他の性能のトレードオフで妥協されているかも知れません。
GDCでも言われたように、やはりGeForceはバッチで大量のデータをムシャムシャ食わせるのが
性能を発揮するコツのようです。
ただ、それでも特筆すべきはRadeonの怪物ぶりです。作者が以前から良く遊んでいるPS1.3の
GeForce3系やPS1.4のRadeon8500系と比較しても隔世の感があり、例えば、海面処理も
PS1.4で同じような画になるように書くと(PS1.4のリミット一杯にコードを詰め込む)それだけで
数FPSになってしまい、まるで使えない感じでした。
それが9700ではPS2.0で簡単に書ける上に、いくら処理をさせても
(PS2.0のリミット一杯まで詰め込む)平気で実行してしまいます。
さらにWS1のオフラインレンダリングを行ってやっと重い感じになります。
WS1のようなオフラインレンダリングしまくるという、サポートチップが少なすぎて
メーカーとしてリスクの高い処理も、9700で一度味わってしまうと
やめられない感じです。
RadeonではRenderingTargetとして浮動小数点高精度テキスチャが選択できます。
32Bit不動少数などが普通に使えるので、特に深度バッファにおいてテキスチャフォーマットを
変更するだけで画質が向上してしまいます。
さらに、厳密に測定したわけではないのですが、高精度テキスチャに
差し替えても、全く速度が低下しない感じです。まさに怪物と言えるでしょう。
この結果を見てWS1では深度バッファは(使えれば)R32Fを標準で使用しています。
(さらに各色32Bit浮動少数カラーテキスチャ、R32G32B32A32F までサポートしています。
もはや呆然とするしかありません。)
nVidia社はハードの発展はもう十分でHLSLなどのソフトウェアを拡充していくビジョンの
ようですが、Radeonの圧倒的なパワーを見せ付けられるとハードもまだまだいけるんじゃない?
と思いました。