2012-12-05 15 views
15

Widziałem wiele ujęć na ten temat i zaczynało mnie mylić. Naprawdę mam nadzieję, że ktoś może udzielić mi ostatecznej odpowiedzi! :)Obsługa OpenGL ES 2.0 dla Androida?

Myślę, że jestem szczery: czy emulator Androida obsługuje OpenGL ES 2.0? Widziałem, jak niektórzy mówią: "Tak, ale musicie zmienić kilka ustawień". i widziałem też "Nie, to nie obsługuje, okres." Oto, co zrobiłem, aby spróbować rozwiązać problem, w tym niektóre komunikaty o błędach, które dostałem.

pierwsze, zmodyfikował AndroidManifest.xml zawierać następujący kod:

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

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

Wtedy, gdy chcę instancję mój GLSurfaceView, używam tej sekwencji kodu, aby go instancję:

super(context); 

setEGLContextClientVersion(2); 

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

Następnie, wszędzie, gdzie wyglądałem, powiedziałem, że musisz wejść do AVD Manager, wybrać emulator, przejść do "Hardware", dodać "emulację GPU" i ustawić boolean na "yes". Jednak tutaj jest to, co widzę, gdy patrzę na kopalni:

Screenshoot of my Android 4.2 emulator window.

Co osobliwe jest to, że mam inny emulator w moim AVD Menedżer których mam „hardware” tabeli:

What does my Android 2.2 emulator have the hardware table?

I żeby pokazać dokładnie to, co robię, tu jest jakiś kod, który wykonuje pewne rzeczy chcę zrobić w OpenGL ES 2.0 (I got to głównie z własnych tutoriali 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); 

Nie chcę, aby mój kod powrócił do pracy z OpenGL ES 1.0, ponieważ będzie to wymagało wielu bólów głowy i jeśli będę mógł tego uniknąć, zrobię to.

Wreszcie, kiedy próbuję uruchomić mój program, program zamyka się za pomocą okna: "Niestety, został zatrzymany." To co LogCat powiedział mi:

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) 

powiem jestem nie ekspertem w tym w ogóle i jest to moje pierwsze doświadczenie z OpenGL. Jeśli ktoś ma jakieś pomysły na to, co mogę zrobić, aby to naprawić, będę zawsze wdzięczny. :) Dziękuję Ci!

Odpowiedz

16

Mogę odpowiedzieć tak na pytanie. Emulator Androida obsługuje OpenGL ES 2.0. Stworzyłem aplikację z cocos2d-x v.2 (która wykorzystuje OpenGL ES 2.0). Miałem ten sam WYJĄTKOWY WYJĄTEK: błąd GLThread 81 z tym samym stosem. I rozwiązać ten problem poprzez dodanie

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

przed ustawieniem renderujący setRenderer:

gLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer()); 

Teraz mogę uruchomić moją aplikację na Android emulatora.

Zobacz moje pytanie i odpowiedź na https://stackoverflow.com/a/13719983/307547. mój post na ten link zawiera zrzut ekranu z ustawieniami AVD:

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

+2

Należy pamiętać, że sprzętowa akceleracja GPU działa tylko na AVDs z Android 4.0 i wyżej. AVD z Androidem 2.2 nie ma przyspieszonego OpenGL ES 2.0 – keaukraine

+1

Spróbuję przetestować ten kod na urządzeniach z Androidem. Chcę mieć pewność, że ten kod będzie działał na prawdziwych urządzeniach. – Petr

+0

Przetestowałem ten kod na urządzeniu Fly i działa. Ludzie na forum cocos2d-x wspomnieli, że ten kod powinien być uruchamiany tylko na emulatorze, a nie na urządzeniu. Zobacz http://www.cocos2d-x.org/boards/6/topics/12563?r=19457#message-19457 – Petr

4

Mam ten sam problem. Oryginalny kod 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); 
} 


rozwiązywane przez:.

a) Wymiana ten kod linii

view.setEGLConfigChooser(true); 

z

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


b) Ustawienie -gpu on poprzez Eclipse -> Uruchom jako ---> docelowe ---> Dodatkowe Emulator Opcje wiersza poleceń

dodając trochę więcej do powyższej dyskusji.
Były dwa różne komunikaty o wyjątkach natknąłem się podczas pracy z powyższego fragmentu kodu

krytyczny wyjątek: GLThread 75 java.lang.IllegalArgumentException: Brak configs dopasować configSpec

i

java.lang.IllegalArgumentException: Nie wybrano config

Bardziej szczegółowa analiza przypadku opowiadane w http://on-android-opengl2.blogspot.in/2013/05/android-opengl-es-20-emulator.html

5

Właśnie problem został rozwiązany, nie dodając żadnych nowych linii do mojego kod źródłowy. W avd-manager ustawiam "Use Host GPU" dla mojego emulatora. Teraz działa perfekcyjnie na mojej GeForce GTX 570.

poziom API na urządzeniu emulatora jest 16, i min-SDK w manifeście będzie 15.