◇ stencilbug : ステンシルマスク動作検証 2012/08/10 Hiroaki GOTO as GORRY. ======================================================================== Galaxy TAB/Nexusで発生する「ステンシルマスク動作バグ」の検証を行うための サンプル。 ======================================================================== ■ 概要 ======================================================================== OpenGL ESでステンシルマスクを作成するとき、カラーバッファへ書き込みを 行わないようにするために「glColorMask()」で書き込み禁止を行いますが、 Galaxy TAB/Nexusでは「書き込み禁止でもカラーバッファに書き込んで しまう」という現象が発生することがあります。 このプログラムは、この現象を再現することと、その現象を防ぐ動作の検証を 行うためのサンプルです。 ======================================================================== ■ 使用方法 ======================================================================== stencilbugを起動します。ステンシルマスク作成作業が正常に行われている ときは、以下のような表示が行われます。 ・下地の四角と星が重なる部分は黒く抜ける。 ・黒く抜けている部分のみ円が表示される。 Galaxy TAB(OS2.3.4)・Galaxy Nexus(OS4.1)では、以下のような表示が 行われます。 ・下地の四角と星が重なる部分は星が表示される。 ・星と重なっている部分のみ円が表示される。 いずれの場合も、メニューを表示して[Debugged]を選択することで、 正常な表示が行われるようになります。もう一度[Debugged]を選択すると、 最初の状態に戻ります。 ======================================================================== ■ 解説 ======================================================================== 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を ご覧ください。 ======================================================================== [EOF]