メモリのパフォーマンスをまったく気にしない場合は、スプライトを圧縮せずに保存して、色0のピクセルが純粋な赤、1が純粋な緑、2が純粋な青、3が純粋なアルファになるようにします。
スプライトをレンダリングするときは、色0、1、2、3に対応する4つのベクトルで構成されるマトリックスピクセルシェーダー定数を設定します。ピクセルシェーダーで、次のコードを実行してスプライトテクセルの色を変更します。
float4 unpaletted = tex2D( texture, uv );
float4 paletted = mul( unpaletted, paletteMatrix );
これは、ピクセルがカラー0の場合、純粋な赤であり、最終的に次のようになるため機能します。
1 * palette[0] + 0 * palette[1] + 0 * palette[2] + 0 * palette[3]
または
1 * palette[0]
同じことがカラー1、2、3にも当てはまります。
メモリパフォーマンスを重視する場合は、必ずNESパレットを256x1 RGB非圧縮テクスチャとして保存し、テクスチャフィルタリングを最近傍に設定し、スプライトを非圧縮8ビットシングルチャネルテクスチャとして保存し、次のようなシェーダーコードを実行します。 :
float palette_index = tex2D( texture, uv );
float4 color = tex1D( palette, palette_index * 255 );