オブジェクトの描画モード
VDPポート 0xC0001C
VDPポート 0xC0001C は過去のゲームでは使われていない可能性があります。
それを物語る現実として、この動作が再現されているエミュレーターをまだ見た事がありません。
このVDPポートにアクセスする事で、オブジェクトの描画方法を設定する事が出来ます。
Bit 7 6 5 4 3 2 1 0 (MSB) 0 e2 e1 e0 0 0 0 d (LSB) c b a 0 0 0 0 0 a 全行にスプライトと(正しくないパターンデータの)ゴミを表示します。 b BGとスプライトをオフにします。背景色のみになります。 このビットがセットされている間、CRAMデータは不規則に破損します。 c 背景色をオフにします。 シャドウ/ハイライトが有効の時は高いプライオリティーのパターンも 同様に見えませんが、通常の明るさの背景色で描かれ、 低いプライオリティーのパターンは半分の明るさの背景色で描かれます。 高いプライオリティーのスプライトの通過色は通常の背景色で埋められます。 つまりスプライトはパターンの周囲に輪郭があります。 これはどちらかの背景からの下層のピクセルがスプライトのシャドウ/ ハイライトピクセルを通過するが、色が不正という事の様に伺えます。 (もしこれらがスプライトのピクセルとOR演算されたなら、両方のレイヤー が見えます) このビットがセットされている間、CRAMデータは不規則に破損します。 d ディスプレイの上下の余白にガーベージ (?) を表示します。 プレーンBは無効になり、プレーンAは表示されます。 e 描画モードを設定します。
ビットe0〜e1により設定出来る描画モードは以下の通りです。
0 通常表示。 1 背景Bとスプライトを非表示、 背景Bとスプライトの高いプライオリティーのピクセルは通常色。 2 背景AとBを非表示、 背景Aとスプライトの高いプライオリティーのピクセルは通常色、 スプライトは通常色のパターンの輪郭がある。 3 背景Aのピクセルは背景BのピクセルとOR演算されて見える。 そしてその出力はスプライトのピクセルとOR演算される。 4 背景AとBとスプライトが非表示になる。 5 背景Bとスプライトが非表示になる。シャドウ/ハイライトはオフ。 6 背景AとBが非表示になる。 スプライトは不特定な色のパターンの輪郭がある。 7 背景Aとスプライトが非表示になる。シャドウ/ハイライトはオフ。
OR演算を使った半透明合成
ビットe0〜e1で3を設定した場合、重なり合う全てのオブジェクトがOR演算されます。
これを利用して、オブジェクト同士の半透明合成を行うことが出来ます。
具体的にはまずVDPポート 0xC0001C のビットe0〜e1に3を設定します。
*(uint *)0xC0001C = 0x0180;
例えば1つのパレット (16色) を上位2bit (4色) と下位2bit (4色) に別ければ、 上位2bitを使ったプレーンやスプライトが、 下位2bitを使ったプレーンやスプライトと重なり合った時、 重なり合った2枚のオブジェクトを半透明にする事が出来ます。
以下は1つのパレット (16色) を上位2bit (灰色4階調) と下位2bit (灰色4階調) に別けた場合にCRAMに書き込むパレットデータの例です。
uint paletteSets[14 * 16] = { 0x0EEE, 0x0CCC, 0x0AAA, 0x0888, 0x0CCC, 0x0AAA, 0x0888, 0x0444, 0x0AAA, 0x0888, 0x0444, 0x0222, 0x0888, 0x0444, 0x0222, 0x0000 }
パターンについては上位2bitのみを使ったパターンと、
下位2bitのみを使ったパターンに別けて書いた物を用意します。