Don’t Starve・Diablo式「Parallax 7」技術
(simonschreibt.de)- 実際の3Dが難しかった2Dゲームの時代にも、開発者たちはパララックススクロールとSNESのMode 7で奥行き感を作り出しており、Diablo 2のPerspective Modeはその系譜を2D ARPGの中で示している
- Don’t Starveは茂み・木・敵を平面アセットとして扱いながら立体的なシーンを作り出し、Diablo 2は2000年製の2Dゲームで床レンダリングとスプライト変形を組み合わせ、似た印象を生み出している
- Diablo 2のPerspective Modeはスプライトを単に移動させる効果ではなく、画面全体が地平線の方向へ傾いたような変形を作り、消失点と遠近感を表現する
- BlizzardはDT1スプライトを32×32pxの断片に分割し、orientation値に応じて壁・柵のようなオブジェクトを異なる形で変形させ、シーンの隙間を減らそうとした
- 後に公開されたGamasutraの内容によると、Perspective Modeには3Dグラフィックカードが必要で、ミニタイルのテクスチャをわずかに回転・スケール・ストレッチすることで奥行き感とパララックス効果を作っており、実装には約1〜2週間かかった
2Dで3Dのように見せた初期の手法
- 1990年代のゲームは2Dから3Dへ移行し始めたが、実際の3D以前にも、開発者たちは3Dのように見える画面を作るためにさまざまなトリックを使っていた
- 代表的な手法はパララックス効果である
- 距離に応じて、ある要素は速く、ある要素は遅く動かすことで奥行き感を作る
- 1982年のMoon Patrolは、複数の平面がそれぞれ異なる速度で動くだけで強い立体感を出していた
- SNES時代のMode 7は実際の3Dではないが、床テクスチャを操作して遠近感のある画面のように見せる
- GBAの説明によれば、実際の3Dハードウェアがなくても、各スキャンラインごとにスケールと移動値を操作することで3Dを模倣できる
- この方式は、高さを奥行き感のように変えるテクスチャ操作に近い
Don’t StarveとDiablo 2の平面アセット活用
- 今日ではすべてのアセットを実際の3Dでレンダリングできるが、すべてのシーンに立体モデルが必要なわけではない
- Don’t Starveの茂み、木、敵は平面アセットだが、視覚的には十分魅力的な結果を生み出している
- Diablo 2は2000年に発売された2D ARPGで、Moon Patrol式のパララックスとMode 7式の床表現を同時に想起させる事例である
- デフォルト設定のDiablo 2は純粋な2D画面である
- 遠近感がない
- パララックス効果もない
- Perspective Modeを有効にすると、同じ床ピクセルを柱がずっと覆い続けることはなく、Don’t Starveのように平面アセットが奥行きのある空間内で動いているように見える
Diablo 2 Perspective Modeを分析した方法
- Diablo 2は公式情報がほとんどないため、MPQとDT1ファイルを抽出・分析するツールでPerspective Modeを調べた
- MPQ EditorはMPQからDT1ファイルを抽出するために使われた
- DT1 ToolsはDT1からPCXファイルを抽出するために使われた
- DT1 TutorialはDT1フォーマットを理解するために使われた
- Perspective Modeはスプライトを少しずつずらすだけの単純な効果ではない
- モードをオンにした画面とオフにした画面を同じ位置で比較すると、すべての要素が地平線方向へ傾いたような変形を示す
- 床テクスチャにチェック模様を入れると、変形がより分かりやすくなる
- シーンは多数のスプライト片で構成されるため、変形過程で境界に隙間が生じやすい
- Diablo 2は断片を合わせながらも、遠近感のある画面を維持している
32×32断片とorientation値
- Blizzardはスプライトを32×32pxの部分に分割した
- 必要な画像部分だけを読み込むための最適化のように見える
- Perspective Modeで変形を適用する際にも有用に見える
- 柱テクスチャに32px間隔の線を描いて疑似ワイヤーフレームのように見ると、垂直線が地面の奥深くにある消失点へ向かっているように見える
- 一部のスプライトでは下側の境界が曲がって見える
- 遠近法だけを考えるなら、そのような曲がりは必ずしも必要ではない
- この変形は、スプライトを見る角度やプレイヤー・カメラ位置によって変わる
- DT1フォーマットでは、スプライトがorientation値を持つことができる
- Paul Siramyの文書によれば、方向値に応じてスプライトの変形方式が変わることがある
- 例にはLeft Wall、Upper Wall、Lower-Left cornerのような壁の方向が含まれる
- 壁や柵のように方向が異なるスプライトは、互いに異なる方法で変形される
- 場合によっては上下の境界が曲がらず、境界線が左側の消失点へ向かっているように見える
- ゲームは隙間を避けるために変形をやや誇張しているようで、柵のスプライト同士はうまく合っている
- 同じ壁を誤ったorientation値に指定すると、スプライト間に隙間が生じる
公開された追加情報と類似事例
- Perspective ModeはDiablo 2でD3Dフルスクリーン時にのみ有効化できた
- Diablo 2はGlideとSoftware Renderingにも対応している
- 古いDirectX文書から追加情報を探そうとしたが、成果はなかった
- その後の更新で、画像歪みに関するリンクが追加された
- image aberrationは、Diablo 2のPerspective Modeで見られる歪みと非常によく似ているように見える
- Diablo 2の開発者が実際にこれを使ったかどうかは分からない
- Paul Siramyが共有したGamasutraの記事には、Perspective Modeの実装方法がより直接的に示されている
- Perspective Modeを有効にするには3Dグラフィックカードが必要だった
- Diablo IIは大きなダイヤモンドタイルを複数の小さなダイヤモンドタイルで構成し、より細かいグリッドを使用していた
- 各ミニタイルのテクスチャをわずかに回転させ、ビデオカードがそれを2つのポリゴンに塗ったうえで縦横に伸ばし、キャラクター位置に応じて大きく、または小さく見えるようにした
- 木や建物は近づいたり遠ざかったりするとサイズが変わって見え、前景・背景オブジェクトとは異なる速度でスクロールし、パララックス効果を生む
- オブジェクトがわずかにきらめく現象は、グラフィックカードのbilinear filteringの結果として説明されている
- キャラクター、アイテム、Act Iの小屋や塔のような構造物まで、Perspective Modeで拡大・縮小される
- Daveの説明によれば、実際の3D数学でグリッドをわずかにスケールしストレッチして奥行き感を作っていた
- 実装には約1〜2週間かかり、壁の整列とライティング処理が必要で、アーティストはオブジェクトを切り直し、異なる形でレンダリングしなければならなかった
- 更新3では、Culturesも似た2D遠近トリックを使った事例として追加された
1件のコメント
Hacker News のコメント
以前から気になっていたリストに入っていた内容なので、これで消せそう。もし World of Warcraft の空がどう作られているのか、そしてそれほどではないにしても Warcraft 3 の地形がどう作られているのか知っている人がいたら教えてほしい
Warcraft 3 の地形は marching squares をうまく使っているのではないかと思ってきた。10年以上気になっていたが、昼/夜/雲/月/星のような機能がすごく、美しく軽量で、1フレームおきに更新されているように見えるのに、とても自然。レンダー・トゥ・テクスチャではなさそうだし、ポリゴンやテクセルが見えないほど滑らかで、2002年のコンピュータでも動いたという点でテクニカルアートの驚異だと思う
https://simonschreibt.de/gat/homeworld-2-backgrounds/
http://simonschreibt.de/gat/homeworld-2-backgrounds-tech/
[1] https://www.hiveworkshop.com/attachments/wc3search-tutorial0...
[2] https://www.hiveworkshop.com/attachments/15-jpg.7734/
要約すると、複数のスカイボックスメッシュを重ねた構造
Project Diablo 2[1] を運営している人たちのおかげで、今でも D2 をプレイしている。遠近法モードは 144fps だと本当に美しく、元の LoD クライアントの 30fps に戻るのはかなり難しい
今でも Pandemonium Fortress で曲がりくねった階段を降りながら、美しい、いや不気味と言ったほうが合うかもしれないグラフィックに圧倒された記憶と郷愁が残っている
[1] https://www.projectdiablo2.com/
Mode 7 は本質的に原始的な 3D アクセラレータに近いと思う。いくつもの変換を適用した単一のテクスチャ平面をレンダリングするので、原理的には現代の GPU と同じくらい「本物の 3D」と言えるが、非常に制限が強く精度が低いだけ
もっとそれらしい 3D ハックはカートリッジの補助プロセッサから来ている。Super Mario Kart のようなゲームは追加チップで各走査線ごとに新しい Mode 7 パラメータを高速に計算し、行ごとに拡大/縮小と移動を変え、回転はそのままにしておくことで、上の行は小さく、下の行は大きく見え、傾いた 3D 感を作り出せる
この「走査線ごとに拡大率を変える」方式は現代の GPU とは大きく異なり、任意の変換でもない。たとえばこの手法では平面を水平軸基準でしか回転できず、垂直軸基準の回転はできない
初期のコンピュータグラフィックスはいつ見ても驚かされる。初期アニメーションとコンピュータグラフィックスの貢献がなければ、ソフトウェアもハードウェアも今より数世代は遅れていたと確信している
NVIDIA を見ると、初期形態の機械学習と「人工知能」に同じアーキテクチャが役立ったのはほとんど幸運に近かったが、会社自体はコンピュータグラフィックスを基盤に築かれた
スプライトの下端がなぜあれほど曲がっているのかは、垂直方向のスプライトに対して地面の「下」にある消失点を模倣するために必要だったのだと思う。3本の杭が上側で外へ広がるように回転するなら、下側もある程度一緒に回る必要があり、単純な傾斜変換では不自然だったはず
3ds Max のシーンではビューポートに正面向きに置かれているうえ正方形テクスチャなので、傾斜が問題なく見えてその違いが出にくかったのだろう。動く例では実際に近い見方をすると、近づくほど3本の杭が視点基準で広がるのが正しく、3ds Max のレンダーはそれをうまく示せていない
この記事はゲームの視差に焦点を当てているが、視差効果はアニメーションで長い歴史を持つ
Disney のマルチプレーンカメラとその前身は、ほぼ100年前から存在していた。2D画像でも奥行きのあるシーンを構成するさまざまなトリックが可能
https://en.wikipedia.org/wiki/Multiplane_camera
開発者は視差効果にかなり満足していたようだが、実際に使った記憶はない。デフォルト設定にすでに慣れたあとだったので、単に変に感じたのだと思う
こういう古いゲームの 3D を「本物ではない」と言うが、現代の 3D ゲームも結局は平面画面上に表示される。だとすれば根本的には同じ意味で本物の 3D ではないのでは?
もう一つ重要な違いは、プリレンダリングされたスプライトであること。Roller Coaster Tycoon や Diablo のようなゲームでは、高価な専用コンピュータでモデルを作り、それをスプライトシートにレンダリングしていた。オブジェクトが 3D に見えても、たいていは平面アセットとして配布されていた。一部の現代のピクセルアートゲームは、2D スプライトに動的ライティングを適用するためにノーマルマップも一緒に入れることがある
現代ゲームの視差効果は、3D シーン内で平面オブジェクトをレンダリングするだけでも簡単に実装できるが、20年前のグラフィックスパイプラインは大きく異なっていたので、3D 効果を出すにはずっと賢い工夫が必要だった
それは Mode 7 システムがレンダリングできる 3D 状況の制限にすぎず、レンダリング可能なもの自体がより偽物だという意味ではない。結局、すべての 3D レンダリング方式は画面の2Dピクセル格子を操作して、仮想物体を見ているかのような錯視を作るものだ