セガ・サターン
目次
背景画面
さて、スプライトばかりではなく、背景画面の話もしましょう。
先にスプライト1面を含む5画面を重ね合わせられる、と書きました。
右図では6面分書いていますが、一番後ろの「グラデーション面」は、走査線ごとの色しか指定できません。何も表示されるものがないときに表示するためのもので、ファミコンなどの「背景色」に相当します。キャラクター表示などの指定はできませんし、表示優先順位も変更できないため、ここでは背景とは異なるものとして扱います。
背景4画面のうち、2面は上下左右にスクロールできる「だけ」の、普通の背景です。以下、「基本BG面」と呼びます。
1面は、拡大・縮小機能を有します。「拡縮BG面」と呼びます。そして、残るもう1面は、拡大縮小を含む「変形」機能を持っていました。あとで詳細を書きますが、一般的な呼称にならって「回転BG面」と呼ぶことにします。
4枚の画面の重ね合わせは、優先順位を自由に変えることができます。説明図では回転面を一番上に書いていますが、一番下にもできる、ということです。
さらに、背景面同士で半透明の処理もできます。優先順位が高い面に半透明を設定すると、下の面が透けて見える、と言う形です。
スプライト面はすでに書いたように特別で、ドット単位で背景面に対する優先順位を変更できます。説明図では一番優先順位が高い場所に書きましたが、他の面の間にスプライトが挟まっているような表現も可能です。
さて、回転BG面には、走査線に従って読み出す VRAM アドレスを不連続にする機能がありました。
先ほど「変形できる」と書いたのはそのためです。一般的に回転面と呼ばれますが、回転だけでなく多彩な表現が可能でした。
まず、話がわかりやすいので単に「回転」させる方法を書きましょう。
テレビ画面は走査線によって描かれます。この時、走査線は横方向に進みます。これはテレビの仕様であり、走査線の向きを変えたりすることはできません。
画面情報は VRAM に収められていて、先頭から順番に読み出していけば、画面が描画できるようになっています。じゃぁ、この時「順番に」読み出すのではなく、読出しアドレスを一定の方法で変えていったらどうなるでしょう?
つまり、VRAM の読み出す方向を傾けるわけです。すると、「傾いた画像」が取り出せます。そして、それを走査線に従って表示すると…画面上には、読出しの傾きとは逆方向に傾いた画像が表示されます。
見えない部分が見えるとはどういうことかと言えば、画面表示は右下がりの状態になっているのです。
これが、逆方向に傾いた画像として表示される理由です。
サターンでは、「走査線ごとの VRAM の読み出し方法」を指定可能でした。画面を回転させるだけでなく、走査線一本ごとに、こまかな指定ができたのです。
指定には、傾きだけでなく、VRAM アドレスの増加速度なども指定できました。これは、拡大縮小ができることに相当します。
走査線ごとの読み出し位置だって変更できます。特に読出しを傾けない場合、これはラスタースクロールの指定に相当します。
この「走査線ごとの指定」は、走査線の本数分のテーブル(メモリ上に作られる表)として用意されました。
回転と言うのは、このテーブルのつくり方の一例に過ぎないのです。いわゆるラスタースクロールも出来ますし、ラスターごとに拡大縮小率を変えたり、回転する画面を向こう側に倒すような表現(2軸回転)もできます。回転ですらない、奇妙な変形画面だって作り出せました。
ただし、そのためのテーブルを作り出す計算は大変でした。簡単に使えるようにするため、後に3Dのライブラリが整備された際には、「拡大縮小付2軸回転」に機能を限定することで、自動的にテーブルを作り出す関数も準備されました。
事実上「2軸回転画面」になっているのはこれが原因ですが、技術力のあるメーカーなどは独自に計算をして、面白い画面効果を作り出していました。
画面モード
さて、画面の解像度はいくつか選択可能でした。320x224~704x512 まで。
描画が細かくなるとメモリを多く使用するのは当然です。先に書いた「背景画面4画面」は最大数の話で、細かな画面モードになると、使える画面は減りました。
スプライト面は常に使えましたが、1ドットごとの情報が減りました。低解像度では1ドットの情報が2バイトですが、高解像度では1ドットの情報が1バイトでした。色数が制限されるため、グーローシェーディングなどは不可能になり、陰影表現ができなくなります。
影響はそれだけにとどまりません。2バイトの中には、背景との表示優先順位や、半透明の指定も入れられていたのです。当然それらの機能も使えなくなります。高解像度モードを使用することの制限は、非常に大きなものでした。
これはもちろんメモリ容量の都合でもあるのですが、それだけではなかったようです。
横の解像度が2倍になると言うことは、1ドットあたりの表示時間が半分になると言うこと。ドットを表示するためには表示のためのデータを読み出す必要がありますが、この時間が半分に減ってしまうのです。低解像度なら1ドットに2バイト読み出せても、高解像度では1バイトが限度なのです。
サターンの画面モードは非常に多く、1600万色を表示できるモードもありました。1600万色ですから、1バイトあたり4バイトの情報が必要です。
サターンは4画面が重ね合わせられる、といっても、当然のことながら1600万色モードで4画面も表示できるメモリ容量はありません。このモードを使用するときは、同時に使用できる画面数は減りました。これもまた、メモリ容量の問題だけでなく、アクセス速度の問題でもありました。
なぜさっきからアクセス速度の話をするかと言えば、サターンでプログラムを作成する際には、「VRAMアクセス速度」が非常に重要な問題だったためです。
話が長くなりすぎるので、80年代の画面技術の「テキスト面」の説明を理解している前提で話をします。
テキストでは、8ドットごとに「文字」を置くことができます。この文字のデータは、大抵8ドットを1byte で表現します。つまり、走査線が8ドットを表示する間に「表示される文字コード」を取得し、その文字コードの「文字データ」を取得しなくては表示が間に合いません。8ドットを表示するわずかな時間に、2回もメモリアクセスが必要なのです。
でも、サターンはバス幅が 16bit ですから 2byte まとめてアクセスできますし、VRAM に使用された SDRAM は、連続したアドレスのアクセスが高速、という特徴があったため、連続データはまとめて扱われました。
そのため「2回のメモリアクセス」で横8ドット分の表示データを読み出す、という考え方は残っていました。
サターンでは4画面の重ね合わせが可能です。つまり、上記メモリアクセスを4倍して、8回のアクセスが必要です。しかも、サターンは低解像モードでも横 320ドットで、ファミコン(横 256ドット)などより「8ドットの表示」の時間が短いのです。
それでも、基本BG面は複雑なことをしないので問題ありません。ファミコンのころよりはメモリの速度も上がりましたし、アクセスは間に合います。
問題は、拡縮BG面や回転BG面を使うとき。
拡大はともかく、「縮小」を行われると、メモリアクセスが増えます。たとえば、半分のサイズに縮小していると、8ドット分のデータは、間引かれて4ドットで出力されてしまうのです。…と言うことは、メモリアクセスがさらに倍に増えます。
回転BG面ではもっと困った事態になります。横8ドットのデータを取得しても、使えるのはそのうち1ドット分だけ、と言うこともあるのです。1ドットごとに2回のメモリアクセスを行う必要が出ます。
…などなど。すみません。さすがに20年近く前のことなので詳細は覚えていません(上に書いたものも間違えているかもしれません)。
ともかく、画面機能を豊富にすると、予定外の VRAM アクセスが頻繁に生じるようになります。しかし、画面表示で「8ドット分」の時間と言うのは非常に短く、できることは限られています。
ここで、プログラマが VRAM のアクセス時間を考慮する必要が出てきました。
たとえば、1600万色モードを使うと、2画面分のメモリ容量を使用します。この時は、必然的に同時に表示できる画面数も1画面減りますから、その分の VRAM アクセスタイミングを割り振れます。1600万色画面が通常の2倍のアクセスを必要としても問題はありません。
でも、画面の縮小や回転の際には、その機能を使うために必要な VRAM アクセスタイミングを、プログラマが指定する必要がありました。
横8ドットを表示する時間内に、最低限必要な VRAM アクセス以外に4回分の VRAM アクセス時間がありました。この4回を何に使うか、サターンに対して指示します。
詳細は覚えていませんが、たしか、最大の4画面を重ね合わせる際にも指示が1つ必要だったように思います。縮小や回転でも当然必要です。タイミングは4つしかないため、特定機能を使うために別の機能を諦める、ということもありました。
…というと、いろいろ制限があって使いにくいように感じられるかもしれません。しかし事実は逆です。
サターンに搭載されていた機能は、普通なら時間が間に合わずにとても実現できないようなものです。それを、「プログラマーが必要機能を選択する」と言う形で多数搭載しているのです。
はっきり言えば、家庭用ゲーム機にはオーバースペックなほどの機能を盛り込んでいて、それが故に「同時には使えない」機能が生じているのです。