2012-12-05 19 views
15

Ho visto più riprese su questo argomento e il suo incomincia a confondermi. Spero davvero che qualcuno possa darmi una risposta definitiva! :)Supporto OpenGL ES 2.0 per Android?

Immagino di essere sincero: l'emulatore Android supporta OpenGL ES 2.0? Ho visto alcune persone dire "Sì, ma devi modificare alcune impostazioni". e ho anche visto "No, non lo supporta, punto". Ecco cosa ho fatto per provare e correggere il problema, inclusi alcuni messaggi di errore che ho ricevuto.

In primo luogo, ho modificato l'AndroidManifest.xml per contenere il seguente codice:

<uses-feature 
    android:glEsVersion="0x00020000" /> 

<uses-sdk 
    android:minSdkVersion="15" 
    android:targetSdkVersion="17" /> 

Poi, quando voglio istanziare la mia GLSurfaceView, io uso questa sequenza di codice per istanziare:

super(context); 

setEGLContextClientVersion(2); 

setRenderer(new MyRenderer()); 
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 

Poi, dappertutto ho visto che devi entrare in AVD Manager, selezionare l'emulatore, andare su "Hardware", aggiungere "emulazione GPU" e impostare il booleano su "sì". Tuttavia, qui è quello che vedo quando guardo la mia:

Screenshoot of my Android 4.2 emulator window.

Che cosa è singolare è che ho un altro emulatore nel mio AVD Manager che io ho il "Hardware" tavolo:

What does my Android 2.2 emulator have the hardware table?

E proprio per mostrare esattamente quello che sto facendo, ecco qualche codice che fa alcune cose che voglio fare in OpenGL ES 2.0 (I principalmente ricevuto questo da proprio tutorial di Android):

int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); 
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); 

program = GLES20.glCreateProgram(); 
GLES20.glAttachShader(program, vertexShader); 
GLES20.glAttachShader(program, fragmentShader); 
GLES20.glLinkProgram(program); 

Non voglio cambiare il mio codice per funzionare con OpenGL ES 1.0 perché questo richiederà un sacco di mal di testa e se posso evitarlo, lo farò.

Infine, quando provo a eseguire il mio programma, il programma si chiude con la finestra: "Sfortunatamente, si è fermato." Questo è ciò che LogCat mi ha detto:

12-05 06:16:27.165: E/AndroidRuntime(936): FATAL EXCEPTION: GLThread 81 
12-05 06:16:27.165: E/AndroidRuntime(936): java.lang.IllegalArgumentException: No config chosen 
12-05 06:16:27.165: E/AndroidRuntime(936): at android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:874) 
12-05 06:16:27.165: E/AndroidRuntime(936): at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1024) 
12-05 06:16:27.165: E/AndroidRuntime(936): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1401) 
12-05 06:16:27.165: E/AndroidRuntime(936): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

Dirò io non un esperto su questo a tutti e questa è la mia prima esperienza con OpenGL. Se qualcuno ha qualche idea su cosa posso fare per risolvere questo problema, sarei per sempre grato. :) Grazie!

risposta

16

Posso dire Sì sulla tua domanda. L'emulatore Android supporta OpenGL ES 2.0. Ho creato un'app con cocos2d-x v.2 (che utilizza OpenGL ES 2.0). Ho avuto la stessa ECCEZIONE FATALE: errore GLThread 81 con lo stesso stack. Ho risolto questo problema aggiungendo

gLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0); 

prima di impostare renderer setRenderer:

gLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer()); 

Ora posso correre la mia applicazione su emulatore di Android.

Vedere le mie domande e risposte allo https://stackoverflow.com/a/13719983/307547. mio post su questo link contiene screenshot con le impostazioni AVD:

http://www.cocos2d-x.org/boards/6/topics/12563?r=19274#message-19274

+2

Si prega di notare che l'accelerazione hardware della GPU funziona solo su AVDS con Android 4.0 e superiori. AVD con Android 2.2 non ha accelerato OpenGL ES 2.0 – keaukraine

+1

Cercherò di testare questo codice su dispositivi Android oggi. Voglio essere sicuro che questo codice funzionerà su dispositivi reali. – Petr

+0

Ho testato questo codice sul dispositivo Fly e funziona. Le persone al forum cocos2d-x hanno detto che questo codice dovrebbe essere eseguito solo su emulatore, non sul dispositivo. Vedi http://www.cocos2d-x.org/boards/6/topics/12563?r=19457#message-19457 – Petr

4

avuto lo stesso problema. Originale Codice Buggy:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d(this.getClass().getName(), "Into onCreate Draw triangle"); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    if (detectOpenGLES20()){ 
     Log.d("GLES20", "GL ES 2.0 Supported..............!"); 
    } else { 
     Log.d("GLES20", "GL ES 2.0 Not Supported...............!"); 
    } 

    view = new GLSurfaceView(this); 
    view.setEGLContextClientVersion(2); 
    view.setEGLConfigChooser(true); 
    view.setRenderer(new TriangleRenderer(view)); 
    setContentView(view); 
} 


stato inviato da:.

a) Sostituzione questa riga di codice

view.setEGLConfigChooser(true); 

con

view.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 


b) Impostazione -gpu on tramite Eclipse -> Esegui come ---> destinazione --- Opzioni riga di comando> Ulteriori Emulator

L'aggiunta di un po 'di più per la discussione di cui sopra:.
C'erano due diversi messaggi di eccezione mi sono imbattuto durante il lavoro con il pezzo di sopra del codice

irreversibile: GLTHREAD 75 java.lang.IllegalArgumentException: Nessun file di configurazione corrisponde configSpec

e

java.lang.IllegalArgumentException: No config scelto

Un caso di studio più dettagliato narrato in http://on-android-opengl2.blogspot.in/2013/05/android-opengl-es-20-emulator.html

5

ho appena risolto il problema senza aggiungere nuove linee al mio codice sorgente. In avd-manager ho impostato "Usa GPU host" per il mio dispositivo di emulazione. Ora funziona perfettamente bene sul mio GeForce GTX 570.

API livello sul dispositivo emulatore è di 16, e min-SDK nel manifesto è 15.