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();
}
}
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? –
@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
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