セガ・サターン
80年代の画面技術の話の最後に、「セガサターンの話も書きたい」と記していたのですが、思い切って書いてしまうことにします。
ファミコンや MSX の画面技術がゲーム機の「基本」だとすれば、セガサターンは1つの究極形。
セガサターンの発売は1994年。…もちろん今となっては古い技術です。今のハードウェアに比べれば貧弱にみえるかもしれません。
それでも、セガサターンは一つの究極形でした。今でもその性能を超える機種は現れていません。
以下、本稿ではセガサターンをサターンと省略します。
セガサターン以外に、ハイサターン、Vサターンなどがありましたが、すべて同じ扱いです。
目次
サターンの3D性能(別ページ)
サターンのCPU(別ページ)
太陽系の惑星たち(別ページ)
細かな話題(別ページ)
もう一つのライブラリ(別ページ)
次世代ゲーム機戦争(別ページ)
反論紹介(別ページ)
画面技術
書きたいことが非常に多いので、何回かに分けて書きます。今回は画面技術のハード面の話を。
最初にサターンは「究極形」だと書きましたが、より正確に言うなら「究極の2Dゲーム機」です。
メガドライブの後継機として、これ以上ないくらい機能を盛っています。
最初に「今でもサターンの性能を超える機種はない」と書いたのは、現在のゲーム機は3Dを前提に作られているため。
3Dの次元を一つ落とせば2Dですから、もちろん2Dゲームだって作れます。だから、3Dを前提に設計するのは悪いことじゃありません。
でも、ファミコンの時に慣れ親しんだ「背景画面」はもうないのです。
背景がないからラスタースクロールや多重スクロールと言った、ファミコン時代にわくわくした技術もない。
そんなもの、ポリゴンにテクスチャで描いて動かせばいいだけの話。…確かに表現できることは同じなのだけど、それは「スクロール機能がある」のとは話が違う。
プログラマーの立場から言えば、「手間をかければ同じもの作れる」のですが、その手間をかけたくないのです。
プログラムが面倒くさいとかいう話ではなくて、手間をかけると言うことはメモリも計算時間も余計に使うことです。その分ゲーム自体のプログラムに余裕がなくなり、ゲームの面白さが制約を受けるようになります。それが嫌なのです。
サターンは、まだ背景画面がスクロールし、重ね合わせた背景の間にスプライトを挟み込めた、最後の機種です。その後ゲーム機の設計技法が変わったため、この性能を超える機種が現れることはないでしょう。
まずは、この「究極の2Dゲーム機」としての性能の話から始めましょう。
2014.3.11 追記
ニコニコ動画で、サターンの画面構成を解説する動画が公開されていました。
この記事の最後にもリンクを示しておきます。
この記事ではサターンの画面を解説していくわけですが、なにぶん「画面」の話なので、言葉だけでは理解しにくいのは執筆時からの悩みでした。
一方で、動画では細かな技術の解説までは踏み込んでいません。両方合わせてご覧いただけると理解の手助けになるかと思います。
スプライト
サターンは5画面の重ね合わせ機能がありました。
…80年代の画面技術のページで説明しましたが、「重ね合わせ」といえばまずはスプライトです。
スプライトは、背景や他のスプライトと重ね合わせられ、透明部分は「下のもの」が見えました。ファミコンの場合、背景画面にも「透明」が使用でき、背景の奥にスプライトを置くことができました。
80年代のスプライトは、走査線1本づつで処理を行う「ラインバッファ」方式でした。
サターンでは、画面1フレーム(1/60秒で表示される画面全体)ごとにスプライトを処理する、フレームバッファ方式になっています。そして、このスプライト用の「フレーム」は、特殊な背景画面として処理されます。
つまり、背景画面4画面とスプライト、合計5画面の重ね合わせとなります。
1画面分は、後の拡張用として用意されていたようですが、使用されることはなかったようです。
背景同士の重ね合わせ順序は指定できますが、単に順序を付けるだけでなく、「半透明」の指定も可能でした。
スプライト用のフレームバッファは、他の背景とは少し扱いが異なる、特殊な存在でした。スプライトフレームだけが、1ドット単位で「重ね合わせの優先順位」や「半透明」の指定を変更できるのです。
これにより、スプライト画面は1面しかありませんが、任意の背景の間に挟んだような表示が可能になります。
右図は画面のイメージです。詳細は後で書きます。
スプライト面は1面だけですが、ドット単位で他の面との優先順位を指定可能です。このため、1面だけでも「他の面の間に挟まったような」表現ができます。
80年代のラインバッファスプライトでは、スプライトは「表示優先順位」が高いものが一番上に表示されました。横に何枚か並ぶと処理が間に合わず、スプライトが消える場合がありましたが、この場合は優先順位が低いものから消えました。
それに対し、フレームバッファスプライトでは、描画はどんどん「上描き」されます。最初に描画されるものは、後から描画されるものに上描きされます。
表示の優先順位としては一番最後に描かれるものが高いことになりますが、処理が間に合わない場合は、最後に描かれるものから消えていくことになります。
簡単にいえば、表示優先順位が一番高いものは一番消えやすい、という困った問題があるのです。対処としては「描画を絶対に間に合わせる」ようにプログラムを組む必要があります。
ところで、複数ある背景の間にスプライトを挟むことができるのに、実際のスプライト面は1面だけです。
これ、スプライト面が複数あるのだと勘違いすると、表示がおかしくなります。
たとえば、背景の前と後ろに、重なった形でスプライトを置くとしましょう。
背景奥のスプライトを後から描くとします。スプライト面が複数あれば、「背景の奥」と指定しているのだから、正しく重ねあわされた表示になるはずです。
しかし、実際にはそうではありません。後から描かれた「背景の奥」スプライトは、手前のスプライトに上描きされ、手前のスプライトを消してしまいます。
しかも、そのスプライトは背景の奥に表示されるため、背景と重なって一部が見えなくなります。…手前のスプライトには、穴が開いてしまうのです。
まぁ、途中に背景があろうがなんだろうが、スプライトは必ず奥の方から描いていく、と言うルールを徹底していれば何の問題もありません。(わざと使ってスプライトに穴を開ける、という演出も可能でしたが)
でも、重ね合わせ優先順位くらいならともかく、同じ問題は「半透明」でも起きたのですよ…こちらはもっと根が深い問題。
あとで詳細を書きますが、スプライトでは半透明も使えました。この際、半透明は「他のスプライトとの半透明」と「背景画面との半透明」が独立して指定できます。
半透明にしたいのだから、と両方の半透明機能を指定してスプライトを描いたとします。半透明でないスプライトに重なると、あら不思議! 半透明でないはずのスプライトまで半透明に変化して、背景まで透けて見えてしまします。
これはバグではなく、1面しかないスプライト面に描画を行ったうえで別の面と重ね合わせる、という仕組み上、仕方のない「仕様」でした。
ちなみに、「両方の半透明」を使わない場合のことも考えてみましょうか。
スプライトとの半透明だけを指定すると、スプライトと重なった時のみ半透明になりますが、重なっていないときは背景が透けないので半透明感が出ません。
背景との半透明だけを指定すると、普段は半透明感を演出できますが、他のスプライトと重なると、先に書いたのと同じ、見えないはずの背景が見える問題が出てしまいます。
おかしくならないように表示するのはプログラマの責任でした。
とはいえ、半透明の仕様は使いどころが難しい上に、この機能を使うとスプライトの描画処理に時間がかかるようになるのです。
サターンの VRAM は、当時最高速の高価な RAM (SDRAM)を使用していたが、RAM のアクセスと言うのは本来遅いものだ。
書き込むだけでなく、読み込みも行わなくてはならないため、半透明を使うと速度が半減することになる。
さらに、後で書きますが、ポリゴンとして描画する際には半透明には致命的なバグがありました。
…半透明はあまり使われなかった、ということですね。機能としては持っていたのにもったいない。もちろん、上手に使いこなしたゲームもありますけどね。