S.F. Page

Programming,Music,etc...

WebGL + GLSLでレトロPCグラフィックスメモリのRGBプレーンの再現ができないか? - PCグラフィックスを懐かしむ。楽しむ。(8)

ようやく8色パレット描画のエミュレートができたが、これで満足したわけではない。今の仕組みではピクセルあたり1バイトを割り当てていて、これの0-7だけ、つまり3ビットだけ使っている。この無駄を減らしたいし、もう少し昔の環境に近づけたい。なのでなんとか1ピクセル3ビットで済ませられないかなと思う。

アイデアとしては前から考えているように昔のRGBプレーン形式を使用することである。1ピクセル1ビットを割り当てて、1バイトで8ピクセルの情報を持たせる。なので画面を埋めるのに必要なデータは340x240/8=9600バイトで済むはずである。これがR/G/B各色必要だから、28800バイトである。でもテクスチャをバッファにするのであれば2のべき乗でなければならないから、512/ 8 * 256 * 3 = 49152バイト必要となる。1ピクセル1バイトであれば512 * 256 = 131072バイトだから、これでも1/2.6のメモリの削減になる。テクスチャをフレームごとにCPUからGPUに転送するから、このバイト数は少ないに越したことはないだろう。

このようなプレーンをシェーダーから参照して、インデックスに置き換え、パレットを参照すればよいのだが、これを行うにはバイト中の各ビットが1か0かを判定しなくてはならない。このような処理は普通ビット演算子を使う。でもWebGL 1.0のシェーダーではビット演算ができない。これをどうすればよいのか今日は考えていたが、ちょっとしたアイデアを思いついた。

なので実際に実装して試してみることにする。