日別アーカイブ: 2015年2月14日

Raspberry Pi 2 OpenGL ES のレイヤー合成

大幅に強化された CPU と違い、GPU 周りは Raspberry Pi 1 とほとんど変わっていないようです。
以前移植したコードが Raspberry Pi 2 でもそのまま動いています。

Raspberry Pi 2 の Desktop (Raspbian) から起動できる Minecraft は、
一見 Windows 内で動いているように見えますが他のウィンドウの下に隠れることができません。
3D Rendering 自体は別のレイヤーに描画されており、
スクリーンに対して Overlay で表示されているようです。

raspberry_pi_201.jpg

↑ 上のように半透明が描画されているシーンだけ下のウィンドウが透けて見えます。
フレームバッファに alpha 値が入るとレイヤー同士の合成とみなされてしまうため。

この辺りの挙動は Window 無しのフルスクリーン描画と違いがないようです。
自分が移植したプログラムでも最初は下記のようになっていました。

raspberry_pi_202.jpg

↑背景を alpha = 0.0f でクリアしていたため console と合成されてしまっています。
うっすら見えているのは alpha 値が入っているところだけです。

OpenGL で常に Alpha=1.0 を書き込んでも良いのですが、
VideoCore の API でも指定できるようです。
下記のように alpha に固定値 255 を指定することで layer が不透明になりました。

static VC_DISPMANX_ALPHA_T alpha= {
  DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS,
  255,
  NULL
};

dispman_element= vc_dispmanx_element_add(
  dispman_update,           // DISPMANX_UPDATE_HANDLE_T
  dispman_display,          // DISPMANX_DISPLAY_HANDLE_T
  0,                        // layer
  &dest_rect,               // VC_RECT_T*
  0,                        // DISPMANX_RESOURCE_HANDLE_T
  &src_rect,                // VC_RECT_T*
  DISPMANX_PROTECTION_NONE, // DISPMANX_PROTECTION_T
  &alpha,                   // VC_DISPMANX_ALPHA_T
  NULL,                     // DISPMANX_CLAMP_T*
  DISPMANX_NO_ROTATE        // DISPMANX_TRANSFORM_T
);

↓不透明になったもの

raspberry_pi_203.jpg

他にも位置の指定や拡縮、90度回転や反転等の指定もできるようです。

↓ ありもののケース(旧型)

raspberry_pi_1b.jpg

関連エントリ
Raspberry Pi 2 で速くなったコンパイル時間の比較