2014年8月26日火曜日

cocos2d-x Androidプロジェクトの場合はStencilバッファを明示的に有効化しておかないとクリッピングできない事がある

ListViewを使用していた時に気づいたのですが、iOSでは ListView 内の Node はコンテンツエリアで正しくクリッピングされるのに、Android(Nexus 7)ではクリッピングされない現象が起こりました。

まったく予期しないところで問題が起こるので、毎度びっくりします。(・。・;

いろいろ調べてみると、ListView のクリッピングはデフォルトでは Stencil バッファを使用していて、この Stencil バッファが無効になっているのでクリッピングできていませんでした。

問題は、なぜ Stencil バッファが無効になっている事があるのかということになりました。

Androidのcocos2d-xプロジェクトは、デバイス毎のデフォルトGLサーフェース設定をそのまま使用しているっぽいので、デバイスによっては Stencilバッファが無効になっている事があるようです。

描画速度、Stencilバッファ未対応のデバイスなどの問題を意識しての仕様かと思われます。因みにiOS環境では、Stencil バッファは必ず有効にされています。

理由はどうあれ、とりあえず早速 Stencilバッファを有効化してやりました。


テスト環境
  • Mac OS X 10.8.5
  • cocos2d-x v3.2
  • Android NDK r9d
  • デバイス Nexus 7

GLサーフェースの設定は、Androidの場合は Cocos2dxActivity.java 内で行えば良さそうです。
もともとinit()メソッドの中に、エミュレータの場合だけ特別にGLサーフェースの設定を行っていたので、その部分にコードを追加してやりました。
// Switch to supported OpenGL (ARGB888) mode on emulator
if (isAndroidEmulator()) {                                      // これは元からあるコード
  this.mGLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 8);  // エミュレータの時に使用する設定
} else {
  // 強制的にStencilバッファを有効化する
  this.mGLSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
}

setEGLConfigChooser(5, 6, 5, 0, 16, 8)の最後の値 8が、Stencilバッファのビットサイズを指定するところです。
因みに 5,6,5,0 はRGBAチャネルのビットサイズです。こちらはiOSと同じ設定にしています。

Nexus 7では、これで万事うまく行きました。

本来、Stencilバッファ未対応のデバイスがあるかもしれないので、強制的に有効化していいものかどうかという問題がありますが、そもそもクリッピングが正しく行われない時点で、アプリとして意味を成さない場合がほとんどだと思うので、これはこれでオッケーということで宜しいんじゃないかと思います。だめでしょうか?

関連記事

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...