Android NDK OpenGL ES nativo:API non implementata
-
13-11-2019 - |
Domanda
Sto lavorando per implementare un OpenGL ES 2.0 completamente in C++ per Android.
Attualmente il nostro programma funziona senza JNI o alcuna classe Java nel progetto, utilizzando invece solo NativeActivity.
Concentrandoci sulla parte di rendering dell'applicazione stessa, abbiamo 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 era incluso:
LOCAL_LDLIBS := -landroid -llog -lEGL -lGLESv1_CM -lOpenSLES -lGLESv2
E in AndroidManifest.xml viene informato:
<uses-feature android:glEsVersion="0x00020000"></uses-feature>
Quindi, il programma esegue il debug e la compilazione senza problemi.Quando impostato per l'esecuzione, arriva il messaggio:
error libEGL called unimplemented OpenGL ES API
Il Forum fornisce un suggerimento realizzabile per Java - androide:GLES20:Chiamata API OpenGL ES non implementata , includendo nel codice il comando setEGLContextClientVersion:
GLSurfaceView surfaceView = new GLSurfaceView(this);
surfaceView.setEGLContextClientVersion(2);
Tuttavia, setEGLContextClientVersion è una specie di metodo wrapper pensato per Java.
setEGLContextClientVersion non appartiene al nativo OpenGL ES 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 scomparso.
Soluzione
Stai utilizzando un dispositivo reale (quale?) o utilizzi un emulatore (che non supporta OGL ES2)?Inoltre non sono sicuro che collegare GLESv1_CM e GLESv2 nella stessa app sia una buona idea.Se desideri OpenGL ES 2.0, collegati solo a GLESv2.
Come hai inizializzato il contesto EGL?Hai utilizzato 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)
...