昔FF8のアルティマニアのインタビューを読んでいて、「FF8ではムービの中をポリゴンのキャラが歩けるんですよ!普通ムービって一枚絵と同じで奥行き情報が無いので、柱の後ろを歩くには前方と後方の二つのムービを用意して、後方・ポリゴン・前方って描画しないといけないんですよ!でもそれだとポリゴンがカメラ方向に歩いて来れないし、何よりかっこ悪い実装なんですよ!FF8では一つのムービで、全く違う概念でこれを実装してるんですよ!詳細は秘密です!秘密かよ!」みたいな発言を見て、アルティマニアを投げ捨てたどうやっているのか全く分からなかった記憶があるんですが、今日になって突然実装方法が分かりました。

3Dの描画ではZバッファというのが使われています。昔はZソートっていうのが使われてて、ポリゴンモデルを奥行き順にソートして、奥から描画してたんですが、ソートは頑張ってもO(log(N^2))で重い上に、モデル単位でしか奥行き情報が持てなかったので、モデルとモデルが近距離の場合に表示が乱れるという問題がありました。

これを解決するために考え出されたのがZバッファです。画像を書き出すフレームバッファの他に、奥行き情報であるZ値を書き込むZバッファを用意して、画素値のZ値を書き込んでおき、書き込む時は、書き込もうとしているZ値と書き込まれているZ値を比較して、より手前なら書き込もう、という仕組みです。依然としてアルファブレンドではソートしないといけない問題が残ってますが、それはまた別の話。

そこでFF8ですが、要はムービのZ値に対応するデータを持てばよかったんですよ!で、ムービを再生と同時にムービのZ値をZバッファに書き込むと。その後普通にZテストしながらポリゴンを描けばいいんですよ!いやー、何でこんな簡単なことに気が付かなかったんだろう。

そういえば最近Zムービとかが流行っていますが、FF8はPSの時代に、その先端を行っていたんだなー、と関心します。コンピュータグラフィックスの先端はやっぱりゲーム業界ですね。