◇ detachbug : シェーダデタッチ動作検証 2012/10/29 Hiroaki GOTO as GORRY. ======================================================================== ICONIA TAB A500で発生する「シェーダデタッチ動作バグ」の検証を行うための サンプル。 ======================================================================== ■ 概要 ======================================================================== OpenGL ESでシェーダプログラムのリンクを行うときは、以下のようにします。 programId = glCreateProgram(); glAttachShader(programId, vertexShaderId); glAttachShader(programId, fragmentShaderId); glLinkProgram(programId); Khronosのドキュメントによると、「glLinkProgram()の後、アタッチした シェーダオブジェクトはデタッチしてもよい」と記されています(*1)。 デタッチする場合、コードは以下のようになります。 programId = glCreateProgram(); glAttachShader(programId, vertexShaderId); glAttachShader(programId, fragmentShaderId); glLinkProgram(programId); glDetachShader(programId, fragmentShaderId); glDetachShader(programId, vertexShaderId); しかし、ICONIA TAB A500ではデタッチを実行してしまうと、対象の シェーダプログラムは動作が保証されません。正常なレンダリングが 行われなかったり、プログラムの異常終了の原因にもなります。 このプログラムは、この現象を再現するためのサンプルです。 *1: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glLinkProgram.xml The program object's information log is updated and the program is generated at the time of the link operation. After the link operation, applications are free to modify attached shader objects, compile attached shader objects, detach shader objects, delete shader objects, and attach additional shader objects. None of these operations affects the information log or the program that is part of the program object. ======================================================================== ■ 使用方法 ======================================================================== detachbugを起動します。プログラムが正常に動いているときは、以下のような 表示が行われます。 ・黒い背景に、丸・四角・星型3つの図形が回転表示される。 メニューボタンを押すと、以下のメニューが表示されます。 ・[No Detach]。シェーダのデタッチを行わない。 ・[Detach Vertex Shader]。頂点シェーダのデタッチを行う。 ・[Detach Fragment Shader]。ピクセルシェーダのデタッチを行う。 ・[Detach both Shader]。両方のシェーダのデタッチを行う。 OpenGL ESが仕様通りに動いている場合は、どのモードで実行しても動作は 変化しません。 ICONIA TAB A500(*2)では、以下のような動作になります。 ・[No Detach]。正常動作する。 ・[Detach Vertex Shader]。正常動作する。 ・[Detach Fragment Shader]。プログラムが異常終了する。 ・[Detach both Shader]。各図形の外側に黒い四角の領域が残った状態で 描画が行われる(透明ピクセルの抜きが行われない)。 *2: A500, Android 3.2.1, Kermel 2.6.36.3+, Acer_A500_7.015.05_AAP_CUS6JP ======================================================================== ■ 余談 ======================================================================== ・ICONIA TAB A500は、NVIDIA Tegra2プロセッサが搭載されています。 同じプロセッサを搭載している端末では、再現するかもしれません。 ======================================================================== ■ ライセンス ======================================================================== 同梱ファイルのライセンスについては、APACHE-LICENSE-2.0.txtを ご覧ください。 ======================================================================== [EOF]