2012-02-27 7 views
5

Sto lavorando per implementare completamente OpenGL ES 2.0 in C++ per Android.Android Native NDK OpenGL ES: API non implementata

Attualmente il nostro programma viene eseguito senza JNI o ​​qualsiasi classe java nel progetto, utilizzando invece solo NativeActivity.

Concentrandosi sulla parte resa applicazione stessa, abbiamo ottenuto un metodo semplice:

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

In Android.mk è stato incluso:

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

E in AndroidManifest.xml è informato:

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

Quindi, il programma esegue il debug e si compila senza problemi. Quando è impostato per funzionare, arriva il messaggio:

error libEGL called unimplemented OpenGL ES API 

Il Forum dà un suggerimento praticabile per Java - Android: GLES20: Called unimplemented OpenGL ES API, tra cui il codice del comando setEGLContextClientVersion:

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

Tuttavia, il setEGLContextClientVersion è una specie di metodo wrapper pensato per java.

setEGLContextClientVersion non appartiene a OpenGL ES nativo e non può essere applicabile per lo sviluppo OGLES C++ nativo.

Pertanto, ho usato invece:

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

Ma l'errore non è ancora andato via.

risposta

6

Si sta utilizzando un dispositivo reale (quale?) O si è su emulatore (che non supporta OGL ES2)? Inoltre non sono sicuro che il collegamento di GLESv1_CM e GLESv2 nella stessa app sia una buona idea. Se si desidera OpenGL ES 2.0, quindi collegare solo a GLESv2.

Come hai inserito il contesto EGL? Hai usato l'attributo EGL EGL_OPENGL_ES2_BIT come:

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

Grazie amico! Ho seguito il tuo suggerimento. Ha risolto il problema. – ThreaderSlash