Android本地NDK OpenGL ES:未实现的API

5

我正在努力实现一个完全基于C++的OpenGL ES 2.0版本,用于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: Called unimplemented OpenGL ES API,其中包括将命令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

您使用的是真实设备(哪一种?),还是模拟器(它不支持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)
...

谢谢你!我按照你的建议做了,问题已经解决了。 - ThreaderSlash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接