2012-12-05 10 views
15

Ich habe mehrere Ansichten zu diesem Thema gesehen und es beginnt mich zu verwirren. Ich hoffe wirklich, dass jemand mir eine definitive Antwort geben kann! :)OpenGL ES 2.0 Unterstützung für Android?

Ich denke, um ehrlich zu sein: unterstützt der Android-Emulator OpenGL ES 2.0? Ich habe einige Leute sagen hören "Ja, aber Sie müssen ein paar Einstellungen ändern." und ich habe auch gesehen "Nein, es unterstützt es nicht, Punkt." Hier ist, was ich getan habe, um das Problem zu beheben, einschließlich einiger Fehlermeldungen, die ich bekommen habe.

Zuerst modifizierte ich die AndroidManifest.xml den folgenden Code enthalten:

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

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

Dann, als ich meine GLSurfaceView instanziiert wollen, verwende ich diese Folge von Code es zu instanziiert:

super(context); 

setEGLContextClientVersion(2); 

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

Dann, überall sagte ich, dass Sie in den AVD-Manager gehen müssen, wählen Sie den Emulator, gehen Sie zu "Hardware", fügen Sie "GPU-Emulation" und setzen Sie den booleschen Wert auf "Ja". Aber hier ist das, was ich sehe, wenn ich an meinem aussehen:

Screenshoot of my Android 4.2 emulator window.

Was eigenartig ist, dass ich einen anderen Emulator in meinem AVD-Manager haben, von denen ich die „Hardware“ Tabelle haben:

What does my Android 2.2 emulator have the hardware table?

Und Ihnen genau zu zeigen, was ich tue, ist hier ein Code, die einige Sachen, die ich in OpenGL ES tun möchte, tut 2.0 (ich dies von Android eigenen Tutorials hauptsächlich vor):

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); 

Ich möchte nicht meinen Code wieder mit OpenGL ES 1.0 arbeiten, weil das eine Menge Kopfschmerzen erfordert und wenn ich es vermeiden kann, werde ich.

Schließlich, wenn ich versuche, mein Programm zu starten, schließt das Programm mit dem Fenster: "Leider wurde gestoppt." Dies ist, was LogCat mir gesagt:

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) 

Ich werde sagen, ich bin nicht ein Experte für das überhaupt und dies ist meine erste Erfahrung mit OpenGL. Wenn jemand irgendwelche Ideen hat, was ich tun kann, um das zu beheben, wäre ich für immer dankbar. :) Vielen Dank!

Antwort

16

Ich kann Ja auf Ihre Frage sagen. Android-Emulator unterstützt OpenGL ES 2.0. Ich habe eine App mit cocos2d-x v.2 (die OpenGL ES 2.0 verwendet) erstellt. Ich hatte die gleiche schwerwiegende Ausnahme: GLThread 81 Fehler mit dem gleichen Stapel. Ich löste dieses Problem durch

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

vor Renderer setRenderer Einstellung:

gLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer()); 

Jetzt kann ich meine App auf Android-Emulator laufen.

Siehe meine Frage und Antwort bei https://stackoverflow.com/a/13719983/307547. Mein Beitrag zu diesem Link enthält Screenshot mit AVD Einstellungen:

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

+2

Bitte beachten Sie, dass Hardware-GPU-Beschleunigung nur auf AVDS mit Android 4.0 oder höher arbeitet. AVD mit Android 2.2 hat keine beschleunigte OpenGL ES 2.0 – keaukraine

+1

Ich werde versuchen, diesen Code heute auf Android-Geräten zu testen. Ich möchte sicher sein, dass dieser Code auf echten Geräten funktioniert. – Petr

+0

Ich habe diesen Code auf Fly-Gerät getestet, und es funktioniert. Leute im cocos2d-x-Forum erwähnten, dass dieser Code nur auf dem Emulator ausgeführt werden sollte, nicht auf dem Gerät. Siehe http://www.cocos2d-x.org/boards/6/topics/12563?r=19457#message-19457 – Petr

4

Haben Sie das gleiche Problem. Original Buggy Code:

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); 
} 


Gelöst von:.

a) Ersetzen Sie diese Codezeile

view.setEGLConfigChooser(true); 

mit

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


b) -gpu on über Eclipse-Einstellung -> wie Run ---> Ziel ---> Weitere Emulator Befehlszeilenoptionen

ein wenig mehr auf die obige Diskussion Hinzufügen.
Es waren zwei verschiedene Ausnahmemeldungen stieß ich auf, während sie mit dem oben Stück Code arbeiten

FATAL AUSNAHME: GLTHREAD 75 java.lang.IllegalArgumentException: Keine configs entsprechen configSpec

und

java.lang.IllegalArgumentException: Nein ausgewählt Config

Eine detailliertere Fallstudie berichtet, bei http://on-android-opengl2.blogspot.in/2013/05/android-opengl-es-20-emulator.html

5

Ich reparierte gerade das Problem ohne sie durch neue Linien zu meinem Quellcode. Im avd-manager habe ich "Use Host GPU" für mein Emulator-Gerät eingestellt. Arbeitet jetzt perfekt auf meinem Geforce GTX 570.

API-Ebene auf Emulator Gerät ist 16, und min-SDK in Manifest ist 15.