5

Ho un'app OpenGL ES2.0 che funziona su dispositivi che eseguono varie versioni di Android da 2.2 a 4.1. Tuttavia mi è stato detto che quando lo si esegue su un Nexus 7 con Android 4.2, la grafica 3D nell'app è completamente nera. La barra delle azioni e i dialoghi funzionano bene però. L'ho provato su un Nexus 7 emulato con processore Intel Atom, HAX e GPU abilitati alla versione 4.2.2 e funziona perfettamente. Avrei preferito eseguire l'immagine ARM ma non sembra includere Open GL ES2.0GLSurfaceView che visualizza nero su Nexus 7 con Android 4.2

Qualcuno ha qualche idea su cosa potrebbe causare questo problema sul Nexus 7 e su come aggirarlo?

Una possibilità è che la versione corrente dell'app abbia il livello API di destinazione impostato su 15 mentre il 4.2.2 è livello 17. Potrebbe essere un problema? Comunque funziona bene sull'emulatore.

Di seguito è riportato il codice che uso per impostare le trame nel renderer onSurfaceCreated() nel caso in cui vi sia qualche aiuto.

/** 
* 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

Se la superficie è completamente nera, penso che il problema fosse più fondamentale del carico di trama. Qual è il tuo rendermode? Come stai impostando il tuo contesto GL? –

+0

@ReubenScratton Grazie per la risposta! Le seguenti righe impostano il mio contesto e rendermode dal costruttore della mia classe derivato da GLSurfaceView. '// Creare un contesto OpenGL ES 2.0. setEGLContextClientVersion (2); // Imposta il Renderer per disegnare su GLSurfaceView mCubeSize = 2; mCubeRenderer = new CubeRenderer (contesto); setRenderer (mCubeRenderer); // Rendering della vista solo quando è presente una modifica nei dati del disegno setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY); ' – tonyw

+0

Oh, ho anche dimenticato di dire che creo un'istanza della mia sottoclasse GLSurfaceView utilizzando un layout XML e quindi utilizzo findViewById() per recuperare un riferimento. – tonyw

risposta

4

Qual è la dimensione delle trame? Dovrebbe essere la potenza di due, ad esempio 16x32 512x512 1024x512 e così via.

+1

Sì, era così. Sorprendentemente alcuni dispositivi ancora non supportano la non-potenza di due trame. – tonyw