4年ほど前に、サターンのハードウェアに関して…いや、ハードに限らず周辺の噂話まで含めて、長大な記事を書いた。
嬉しいことに、今でも時々反響がある。
で、先日 Twitter で、「たしかに、プレステは大きく歪むが、サターンは歪まなかった」と言っている方がいた。
その言葉を読んで、ハッとしたのだ。
しまった。
サターンの大バグで、わざわざ「歪めて表示しないといけない」場合があったことを書いていない。
セガラリーチャンピオンシップは、サターンのプログラムがこなれてきたころに発表されたビッグタイトルだ。
非常によくできている。僕も当時、レーシングコントローラーまで購入してやり込んだ。
このゲームを遊んだことがある人なら、ゆっくりと走った際に、コースを表現するポリゴンの、一番「手前」…
説明しずらいが、画面の一番こちら側に来る部分が、妙に歪んで表示されていたことを覚えているかもしれない。
あの歪み、ソフトウェアでわざわざ歪めて表示している。
そうしないと、ハードウェアの別のバグにぶつかり、表示がおかしくなってしまうためだ。
サターンのテクスチャは方式上歪みが少なく、プレステのようには歪まない。
しかし別の部分のバグを回避するために、状況によってわざわざ歪ませるように表示しないといけない場合があった。
サターンのスプライト表示 LSI …VDP1 には、クリッピングウィンドウ機能というものがあった。
画面内の「上下左右」の辺の座標を指定することによって得られる四角形の中でだけスプライトを描画し、その外側には描かない、という機能だ。
通常は、この四角は画面の最大サイズになっている。
その外側にはメモリが無いから書き込んではいけないためだ。
でも、例えば画面を分割して対戦できるようなゲームでは、ウィンドウサイズを変えることで、それぞれのプレイヤーの画面の中だけを描くことができる。
車のバックミラーの中だけ別描画、というようなこともできるし、ゲーム内の背景にテレビ画面があってその中に別のものが表示されているような効果も出せる。
工夫次第でいろいろ使える便利な機能だ。
スプライトは「四角」で定義されていて、4つの頂点を自由な位置に指定することで変形表示できた。
これがいわゆる「ポリゴン」だ。
変形表示の際には、元の画像定義の「横1ライン」ごとに画像が転送され、このラインを重ねていくことで面が作られる。
南京玉すだれみたいなものを想像してもらえるといいだろう。
実際には、この「ライン」が送られる直前に、クリッピングウィンドウの処理が入る。
ラインの始点と終点がウィンドウの外にあるかどうかがチェックされ、外にある場合は、ウィンドウの辺とラインの交点を算出する。
交点はつまり「ウィンドウ内に表示される端の点」なので、ここからウィンドウ内だけを描けばよいわけだ。
始点側がウィンドウ外なら、交点を求めるとともに、テクスチャの読み出し開始アドレスをずらす。
終点側がウィンドウ外なら、交点を求めるが、テクスチャ読み出しアドレスは変えない。
(いずれも、テクスチャの読み出しスピードは、クリッピングしない際のラインの長さに依存する)
始点も終点もウィンドウ外なら?
その線は、全部がウィンドウ外だろう。描画の必要はなく、捨てられる。
…ここにバグがある。
おそらく、この処理は System32 の家庭用を作っていた際の名残で、スプライトは四角いまま拡大縮小する程度の前提だったのだろう。
変形しない、四角いスプライトを前提にすれば、始点も終点も描画外なら全体が描画外、は正しい。
しかし、サターンの変形スプライトでは、ラインの一部だけがウィンドウ内に入る、ということがあり得る。
ウィンドウの「角」の部分にかかるように、始点と終点が違う辺(例えば下辺と左辺)をはみ出して描画される場合だ。
この場合、先に書いたクリッピングアルゴリズムだと、ラインの描画全体が捨てられてしまうため、本来必要な描画が行われなくなる。
結果として、サターンで作ったポリゴンゲームの、画面の角の部分は描画が行われないことが多くなり、「穴が開く」状態となる。
レースゲームでは、コースを構成するポリゴンが画面の下左右角にはみ出る、という状況は当たり前に発生する。
そこで、セガラリーチャンピオンシップでは、2次元変換させた後のポリゴンの座標をさらに加工する。
具体的には、「左右」からはみ出さないようにプログラム内でクリッピングしてしまえばよい。
厳密に言えば、クリッピングによって表示が6角形になる場合があるのだけど、セガラリーではおそらくそのような状況にはならない。
クリッピングで5角形になる場合に限定すれば、外側の2頂点を適切に移動してやれば、見た目の上でポリゴンの「辺」の形状を変えないようにできる。
ただし、内部のテクスチャは大きく歪む。
これをどう誤魔化すかは、作る側のテクニックだ。
セガラリーの場合、路面のテクスチャは工夫されていて、多少歪んでもわからなかった。
また、極端に斜め線を作らなければ問題の状況は起きないので、ガードレールなどはポリゴン面が縦に分割されるようになっていたのだと思う。
そもそも、歪んでも十分に高速で動いていれば、一瞬で通り過ぎるためにあまり気にならない。
しかし、崖の斜面などの形状が歪んだ部分にぶつかり、ゆっくり動いたりすると、歪むのがわかった。
このゲーム、そんな下手なプレイしているようじゃダメなので、慣れるにしたがってそういうことは起きなくなるのだけど。
他のゲームでも、よく見ると画面端は歪んでいる場合が結構あった。
描画が破綻するというのは最悪の状況なので、回避のために工夫したのだろう。
初期の SGL には、自動的にゆがめることで破綻しないようにする機能、というのはなかったように思う。
でも、もしかしたらバージョンアップの過程でつけられていたかもしれない。
申し訳ないが、この辺りはちゃんと覚えていない。
この記事、書き上げてからネットで SS のセガラリーの動画探してみたのだけど、思ったような歪みが見つけられない。
記憶で書いているので多少違っている部分もあるかもしれない、と断っておく。
本当は、自分で実機でセガラリー動かして検証すればいいのだけど、そこまでやっていない。
この話はサターン記事の中に追記するのが適切なのだけど、個別論に入った長い話を追記すると話の腰を折ってしまう。
なので、日記に書いたうえで、記事内からリンクしておくことにする。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
16年 iOSでtextのコピー・ペーストができないバグの回避
申し訳ありませんが、現在意見投稿をできない状態にしています。 【獣】 歪まないけど汚いっていう印象でしたね~デイトナなんかでは一番手前側にくる道路が、下に落ちていくような感じになっていましたが、あれも表示がおかしくならなくするための対策だったのでしょうか (2018-01-24 13:01:05) |