Galaxy TAB/Nexusなど、一部のAndroid端末で発生する「ステンシルマスク動作バグ」の検証を行うためのサンプル。
OpenGL ESでステンシルマスクを作成するとき、カラーバッファへ書き込みを行わないようにするために「glColorMask()」で書き込み禁止を行いますが、Galaxy TAB/Nexusでは「書き込み禁止でもカラーバッファに書き込んでしまう」という現象が発生することがあります。 このプログラムは、この現象を再現することと、その現象を防ぐ動作の検証を行うためのサンプルです。
stencilbug.apkをインストールし、起動します。ステンシルマスク作成作業が正常に行われているときは、以下のような表示が行われます。
Galaxy TAB(OS2.3.4)・Galaxy Nexus(OS4.1)では、以下のような表示が行われます。
いずれの場合も、メニューを表示して[Debugged]を選択することで、正常な表示が行われるようになります。もう一度[Debugged]を選択すると、最初の状態に戻ります。
glStencilFunc()で「GL_EQUAL、またはGL_NEVER」以外を指定すると、glColorMask(GL_FALSE)でカラーバッファへの書き込みを禁止している状態でもカラーバッファへの書き込みが行われてしまうのが、描画結果が異なる原因となります。
この現象への対策として、「glDepthFunc(GL_NEVER)」を指定することで「実質的にカラーバッファへの書き込みを禁止する」ことができます。ただし、この方法はデプスバッファを確保しなければならないため、メモリの無駄や描画速度の低下を起こす原因となる可能性があります。
ライセンスについては、パッケージ同梱のAPACHE-LICENSE-2.0.txtをご覧ください。
「vertex shaderで精度指定する(precision mediump float;)とコンパイラが正常動作しない」とのこと。本件とは関係ないが、不具合再現機種が被っているので一応。