5

我有一個OpenGL ES2.0應用程序,該應用程序正在運行各種Android版本從2.2到4.1的設備上工作。不過,有人告訴我,當使用Android 4.2在Nexus 7上運行它時,應用程序中的3D圖形都是黑色的。操作欄和對話框雖然工作正常。我已經在模擬的Nexus 7上使用了英特爾凌動處理器,HAX和GPU啓用運行4.2.2,並且工作正常。我本來希望運行ARM映像,但似乎沒有包含Open GL ES2.0GLSurfaceView在Android 4.2上顯示Nexus 7上的黑色

有沒有人有任何瞭解Nexus 7上可能導致此問題的原因以及如何解決此問題?

一種可能性是當前應用程序版本的目標API級別設置爲15,而4.2.2級別爲17.這可能是一個問題嗎?它在模擬器上正常工作。

下面是我用來設置渲染器onSurfaceCreated()中的紋理的代碼,以防有任何幫助。

/** 
* Sets up texturing for the object 
*/ 
private void setupTextures(String[] texFiles) { 
    // create new texture ids if object has them 
    // number of textures 
    mTextureIDs = new int[texFiles.length]; 

    GLES20.glGenTextures(texFiles.length, mTextureIDs, 0); 

    for(int i = 0; i < texFiles.length; i++) { 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIDs[i]); 

     // parameters 
     GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, 
       GLES20.GL_NEAREST); 
     GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_MAG_FILTER, 
       GLES20.GL_LINEAR); 

     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
       GLES20.GL_REPEAT); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
       GLES20.GL_REPEAT); 

     int ID = mContext.getResources().getIdentifier(texFiles[i], "raw", "com.antonymsoft.slidixcube"); 
     InputStream is = mContext.getResources().openRawResource(ID); 
     Bitmap bitmap; 
     try { 
      bitmap = BitmapFactory.decodeStream(is); 
     } finally { 
      try { 
       is.close(); 
      } catch(IOException e) { 
       // Ignore. 
      } 
     } 

     // create it 
     GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle(); 

    } 
} 
+0

如果表面完全是黑色的,我認爲這個問題比紋理加載更重要。你的渲染模式是什麼?你如何設置GL環境? –

+0

@ReubenScratton感謝您的回覆!下面的代碼從我的類的構造函數中設置我的上下文和rendermode從GLSurfaceView派生。 '//創建一個OpenGL ES 2.0上下文。 setEGLContextClientVersion(2); //設置渲染器在GLSurfaceView上繪圖 mCubeSize = 2; mCubeRenderer = new CubeRenderer(context); setRenderer(mCubeRenderer); //僅在繪圖數據發生變化時渲染視圖 setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); ' – tonyw

+0

哦,我忘了說我使用XML佈局創建了我的GLSurfaceView子類的實例,然後使用findViewById()來檢索引用。 – tonyw

回答

4

你的紋理大小是多少?它應該是2的冪,例如16x32 512x512 1024x512等等。

+1

是的,就是這樣。令人驚訝的是,有些設備仍然不支持兩種紋理的非功率。 – tonyw

相關問題