0

この問題により、私はまったく無知になりました。正射投影でいくつかの 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 を使用するかもしれませんが、まだシェーダーの準備ができていません :)

4

1 に答える 1

1

問題は、シミュレーターでの PROJECTION_MATRIX と MODELVIEW_MATRIX の切り替えにあることが判明しました。何らかの理由で、シミュレーターはフラグ「GL_TEXTURE_2D」をクリアします。3D 描画用に有効にし、正射投影に切り替え、オーバーレイを描画し、遠近法に戻しました --- その時点で GL_TEXTURE_2D は無効になりました。各フレームで有効にすると問題が解決しました。

于 2013-11-13T15:44:25.997 に答える