トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

stencilbug の履歴(No.3)


stencilbug : ステンシルマスク動作検証

Galaxy TAB/Nexusなど、一部のAndroid端末で発生する「ステンシルマスク動作バグ」の検証を行うためのサンプル。

配布

  • 2012.0810.1
    • 最初のバージョン。

コメント

  • ○(正常動作):IS05, xPeria PLAY, Acer A500, P76Ti, S42HW -- GORRY 2012-08-10 10:29:25 (金)
  • △(初期状態では異常動作、Debuggedで正常動作):Galaxy TAB, Nexus S, Galaxy Nexus -- GORRY 2012-08-10 10:31:01 (金)
  • ○(正常動作):galaxy tab 7.0 plus -- わたなへ 2012-08-10 12:21:17 (金)

概要

OpenGL ESでステンシルマスクを作成するとき、カラーバッファへ書き込みを行わないようにするために「glColorMask()」で書き込み禁止を行いますが、Galaxy TAB/Nexusでは「書き込み禁止でもカラーバッファに書き込んでしまう」という現象が発生することがあります。 このプログラムは、この現象を再現することと、その現象を防ぐ動作の検証を行うためのサンプルです。

使用方法

stencilbug.apkをインストールし、起動します。ステンシルマスク作成作業が正常に行われているときは、以下のような表示が行われます。

  • 下地の四角と星が重なる部分は黒く抜ける。
  • 黒く抜けている部分のみ円が表示される。

Galaxy TAB(OS2.3.4)・Galaxy Nexus(OS4.1)では、以下のような表示が行われます。

  • 下地の四角と星が重なる部分は星が表示される。
  • 星と重なっている部分のみ円が表示される。

いずれの場合も、メニューを表示して[Debugged]を選択することで、正常な表示が行われるようになります。もう一度[Debugged]を選択すると、最初の状態に戻ります。

stencilbug_ok.pngstencilbug_ng.png
正常な表示Galaxy TAB/
Galaxy Nexusでの表示

解説

glStencilFunc()で「GL_EQUAL、またはGL_NEVER」以外を指定すると、glColorMask(GL_FALSE)でカラーバッファへの書き込みを禁止している状態でもカラーバッファへの書き込みが行われてしまうのが、描画結果が異なる原因となります。

この現象への対策として、「glDepthFunc(GL_NEVER)」を指定することで「実質的にカラーバッファへの書き込みを禁止する」ことができます。ただし、この方法はデプスバッファを確保しなければならないため、メモリの無駄や描画速度の低下を起こす原因となる可能性があります。

余談

  • このプログラムは、「AndroidでJavaによる簡易的なOpenGL ES 2.0フレームワーク」として書かれています。アプリケーションとしての描画発行は、ほぼ全てMainView.javaに簡潔にまとまっています。
  • OS3.0より前のAndroidでは、「GLES20.glBlendEquation()」が正常に動作していないようです。
  • BitmapFactory.decodeResource()でアルファチャンネル付きPNGファイルを読み込むと、「乗算済みアルファ画像」に変換が行われるようです。この画像は、glBlendFunc()でGL_SRC_ALPHAではなくGL_ONEを使用しないと半透明部分が正しく描画されません。

ライセンス

ライセンスについては、パッケージ同梱のAPACHE-LICENSE-2.0.txtをご覧ください。

counter: today=4, yesterday=5, total=7398