# カラーパレット ## 🎨 パレットの種類 SGB/SNESには、16色のパレットが8つ用意されており、パレットの各色として32768色(15bit)の中から選択して使うことができます。 > [!NOTE] > のちに説明する仮想パレットに対して、ここでは実パレットと呼ぶことにします > 単にパレットという場合は、実パレットを指します パレット0~3は**SGBカラーパレット**と呼ばれ、ゲーム画面に使用され、それぞれのパレットの最初の4色のみが使用されます。 パレット4~7は**SGBボーダーパレット**と呼ばれ、SGBボーダーに使用され、各パレットの16色すべてを使用することができます。 ## 🌈 色データのフォーマット パレットが持っている色データはRGB555形式です。RGB888形式の色データをRGB555形式に変換するには、以下のような計算を行います。 ```cpp rgb555 = (rgb888 & 0xF8) << 7 | (rgb888 & 0xF800) >> 6 | (rgb888 & 0xF80000) >> 19; ``` ## ⛓ パレットの色0の制約 パレットは16色を持てますが、最初の色(色0)は透明色として扱われ、色0のところには、代わりに背景色が表示されます。 背景色は通常、色0に割り当てられた直近の色で定義されます。色0の割り当てにはパレット番号は関係なく、全てのパレットのうち最近色0として割り当てられた色データを背景色として使います。 なので、事実上、ゲーム画面のパレットにはそれぞれ3色のカスタムカラーしか設定できず、SGBボーダーのパレットにはそれぞれ15色しか設定できません。 ## 🔲 グレーシェードからの遷移 SGBは、ゲームボーイのビデオコントローラの映像信号を読み取るため、その信号の濃淡をそのままSNESの色に変換しています。 ``` 白 -> 色番号0(パレットの色0) 白灰 -> 色番号1(パレットの色1) 黒灰 -> 色番号2(パレットの色2) 黒 -> 色番号3(パレットの色3) ``` ### ゲームボーイのBGP/OBPレジスタ レジスタ`BGP,OBP0,OBP1`にそれぞれ`0xE4`(`0b1110_0100`)を設定すると、 ``` bit0-1(色番号0) -> 0(白) bit2-3(色番号1) -> 1(白灰) bit4-5(色番号2) -> 2(黒灰) bit6-7(色番号3) -> 3(黒) ``` となるため、GBの色番号0~3をSNESの色番号0~3に直接変換することができます。 ## 🎞 仮想パレット 実際に表示されるパレットとは別に、4色ずつ最大512個のパレットをSNESのRAMに定義することができます。 これをシステムカラーパレットといいます。(便宜上、仮想パレットと呼びます) このパレットは、表示される画像とは無関係にRAMに保存されますが、仮想パレットのデータは、個別のコマンドパケットでパレットデータを転送する場合よりも高速に実パレットに転送することができます。