PicoのVGAのマルチプレーン機能を使う

昔のパソコンやゲーム機では、文字とグラフィックス、背景とスプライトの様に複数の描画プレーンを重ねられるものがありましたが、Picoの VGA 出力も複数の描画プレーンを重ねることができます。pico-playgroundに入っているデモでも、これを使っているものがいくつかあります。

この機能は、以下のように設定すれば動作します。

・CMakeLists.txtでプレーン数を指定
・スキャンラインのデータは、各プレーン用のものを個別に作成

注意点は、スキャンラインの描画データで色情報と一緒にアルファマスク値を指定することです。第2・第3プレーンの画像は、マスクビットが1の場合のみ表示されます。ライブラリ内ではマスクの値はPICO_SCANVIDEO_ALPHA_MASK、マスクビットの値はPICO_SCANVIDEO_ALPHA_PINとして定義されています。

この機能の簡単なサンプルを作ってみました。 これは以下の動画のように、背景の上を正方形のオブジェクトを 動かすアニメーションです。正方形は第二プレーンに描画されています。

CMakeLists.txtで、プレーン数を以下のように指定します。今回は2枚ですが、3枚にすることも可能です。 PICO_SCANVIDEO_MAX_SCANLINE_BUFFER2_WORDSはオプションで指定できるスキャンラインバッファのサイズで、標準では第一プレーンと同じですが、個別に設定することができます。(通常、設定しなくても問題ありません)

add_compile_definitions(multiplane PRIVATE
  PICO_SCANVIDEO_PLANE_COUNT=2
  PICO_SCANVIDEO_MAX_SCANLINE_BUFFER2_WORDS=10
  )

描画データを書き込むスキャンラインバッファ関連のメンバ変数名は、第1プレーンでは

struct scanvideo_scanline_buffer *dest;
dest = scanvideo_begin_scanline_generation(true); 
buf = dest->data;
buf_length = dest->data_max;
dest->data_used = ...

となりますが、第2プレーンでは

buf = dest->data2;
buf_length = dest->data2_max;
dest->data2_used = ...

のようになります。メンバ変数の名称のdataがdata2になるだけです。第3プレーンではdata3になります。

描画データに色情報が入るときは、

box_color = (rand() & 0xffff) | PICO_SCANVIDEO_ALPHA_MASK;

のように、PICO_SCANVIDEO_ALPHA_MASKとのORを取ります。上の例はbox_colorにランダムなカラーを設定しています。

今回のコードの全体は以下に置いてあります。

boochow/pico_test_projects
Some projects to test Raspberry Pi Pico unique functionalities, such as interpolators or scanvideo library. - boochow/pico_test_projects

コメント