stencilbug の履歴(No.1)
- 履歴一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- stencilbug へ行く。
- 1 (2012-08-09 (木) 19:23:58)
- 2 (2012-08-09 (木) 19:34:04)
- 3 (2012-08-10 (金) 03:21:17)
stencilbug : ステンシルマスク動作検証†
Galaxy TAB/Nexusで発生する「ステンシルマスク動作バグ」の検証を行うためのサンプル。
配布†
- 2012.0810.1
- 最初のバージョン。
コメント†
概要†
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をご覧ください。