Android Native NDK OpenGL ES: не реализованный API - PullRequest
5 голосов
/ 27 февраля 2012

Я работаю над полной реализацией OpenGL ES 2.0 на C ++ для Android.

В настоящее время наша программа работает без JNI или какого-либо java-класса в проекте, используя вместо этого только NativeActivity.

Сосредоточив внимание на самой части рендеринга приложения, мы получили простой метод:

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

В Android.mk было включено:

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

А в AndroidManifest.xml сообщается:

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

Итак, программа без проблем отлаживает и компилирует. Когда установлен запуск, появляется сообщение:

    error  libEGL   called unimplemented OpenGL ES API

Форум предлагает работоспособное для java предложение - Android: GLES20: Называется нереализованным API OpenGL ES , включая код команды setEGLContextClientVersion:

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

Однако setEGLContextClientVersion является своего рода методом-оболочкой, предназначенным для Java.

setEGLContextClientVersion не относится к нативной OpenGL ES и не может применяться для нативной разработки C ++ OGLES.

Поэтому я использовал вместо:

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

Но ошибка еще не исчезла.

1 Ответ

6 голосов
/ 27 февраля 2012

Вы используете реальное устройство (которое?), Или вы используете эмулятор (который не поддерживает OGL ES2)? Также я не уверен, что связывание GLESv1_CM и GLESv2 в одном приложении - это хорошая идея. Если вы хотите OpenGL ES 2.0, то ссылайтесь только на GLESv2.

Как вы инициализировали контекст EGL? Использовали ли вы EGL-атрибут EGL_OPENGL_ES2_BIT, например:

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