昔のパソコンやゲーム機では、文字とグラフィックス、背景とスプライトの様に複数の描画プレーンを重ねられるものがありましたが、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にランダムなカラーを設定しています。
今回のコードの全体は以下に置いてあります。
コメント