この問題により、私はまったく無知になりました。正射投影でいくつかの 2D オーバーレイを使用して、OpenGL ES シーンを透視投影でレンダリングしています。私の携帯電話 (Galaxy S4) では問題なく動作します。ただし、エミュレーターでは何も表示されません。コードを単純化して、正射投影を設定し、三角形を描画するだけにしました。ここで問題になる可能性のあるものに光を当てることができる人はいますか? 繰り返しますが、電話では、このコードは白い三角形を表示しますが、エミュレーターでは何も表示されません。次の (簡略化された) コードは、フレームごとに呼び出されます。
GLES10.glMatrixMode(GLES10.GL_PROJECTION);
GLES10.glLoadIdentity();
GLES10.glOrthof(0, windowWidth, 0, windowHeight, 0.0f, 1.0f);
GLES10.glMatrixMode(GLES10.GL_MODELVIEW);
GLES10.glLoadIdentity();
GLES10.glDisable(GLES10.GL_LIGHTING);
GLES10.glDisable(GLES10.GL_DEPTH_TEST);
GLES10.glDisable(GLES10.GL_CULL_FACE);
FloatBuffer vertexBuffer = OpenGLUtils.allocateFloatBuffer(4 * 6);
vertexBuffer.put(40);
vertexBuffer.put(20);
vertexBuffer.put(40);
vertexBuffer.put(60);
vertexBuffer.put(80);
vertexBuffer.put(20);
vertexBuffer.position(0);
GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT);
GLES10.glEnableClientState(GLES10.GL_VERTEX_ARRAY);
GLES10.glVertexPointer(2, GLES10.GL_FLOAT, 0, vertexBuffer);
GLES10.glDrawArrays(GLES10.GL_TRIANGLES, 0, 3);
(もちろん、フレームごとに vertexBuffer を再作成するのはばかげていますが、フレームごとに作成しても (視覚的な) 結果は変わりません)。完全を期すために、openGL の初期化コードを次に示します。
GLES10.glViewport(0, 0, windowWidth, windowHeight);
GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GLES10.glShadeModel(GLES10.GL_SMOOTH);
電話の解像度は 1920 x 1080 (windowWidth/windowHeight) ですが、シミュレーターは 1024x600 を使用します。
私が試したいくつかのこと(成功せずに):
- ニア/ファー クリッピング プレーンの変更
- glOrthof の座標を 0..1 に正規化 (それに応じて頂点座標を変更)
- GLES10.glOrthof の代わりに Matrix.orthoM を使用して行列を生成しました
- 三角形に異なるサイズを使用
洞察はありますか?
Ps: はい: これは厳密には GL ES 1.0 です -- 1.1 を使用するかもしれませんが、まだシェーダーの準備ができていません :)