2012-02-27 9 views
5

Pracuję nad wdrożeniem OpenGL ES 2.0 w pełni w C++ dla Androida.Android Native NDK OpenGL ES: niezatwierdzony interfejs API

Obecnie nasz program działa bez JNI lub dowolnej klasy Java w projekcie, wykorzystując zamiast tego tylko NativeActivity.

Skupiając się na samej części renderowania aplikacji, mamy prostą metodę:

renderWorld() 
{ GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, 
          -0.5f, -0.5f, 0.0f, 
          0.5f, -0.5f, 0.0f }; 
    glClear (GL_COLOR_BUFFER_BIT); 

    glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, vVertices); 
    glEnableVertexAttribArray (0); 

    glDrawArrays (GL_TRIANGLES, 0, 3); 
} 

W Android.mk zostało wliczone:

LOCAL_LDLIBS := -landroid -llog -lEGL -lGLESv1_CM -lOpenSLES -lGLESv2 

I AndroidManifest.xml jest poinformowana

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

Program więc bez problemu debuguje i kompiluje. Kiedy ustawiony do pracy, przychodzi wiadomość:

error libEGL called unimplemented OpenGL ES API 

Forum daje sugestię wykonalne dla java - Android: GLES20: Called unimplemented OpenGL ES API, łącznie z kodem z setEGLContextClientVersion polecenia:

GLSurfaceView surfaceView = new GLSurfaceView(this); 
    surfaceView.setEGLContextClientVersion(2); 

Jednak setEGLContextClientVersion to rodzaj metoda wrapper przeznaczona dla języka Java.

Zestaw setEGLContekstClientVersion nie należy do języka OpenGL ES i nie może być stosowany do natywnego programowania w języku C++ OGLES.

Dlatego użyłem zamiast:

const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION, 2,EGL_NONE}; 
mContext = eglCreateContext(mDisplay, lConfig, EGL_NO_CONTEXT,attribList); 

ale błąd nie zniknął jeszcze.

Odpowiedz

6

Czy używasz prawdziwego urządzenia (co?), Czy jesteś na emulatorze (który nie obsługuje OGL ES2)? Również nie jestem pewien, czy połączenie GLESv1_CM i GLESv2 w tej samej aplikacji jest dobrym pomysłem. Jeśli chcesz OpenGL ES 2.0, a następnie linkuj do GLESv2.

W jaki sposób zinicjalizowałeś kontekst EGL? Czy użyłeś atrybutu EGL EGL_OPENGL_ES2_BIT jak:

EGLint aEGLAttributes[] = 
{ 
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // <--- OpenGL ES 2.0 
    ... 
    EGL_NONE 
}; 
... 
eglChooseConfig(m_EGLDisplay, aEGLAttributes, aEGLConfigs, 1, 
      &cEGLConfigs) 
... 
+0

Dzięki! Poszedłem za twoją sugestią. Rozwiązał problem. – ThreaderSlash