Android原生NDK OpenGL ES:未实现API
问题描述:
我正在努力在C++ for Android中完全实现OpenGL ES 2.0。Android原生NDK OpenGL ES:未实现API
当前我们的程序在项目中运行时没有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 native,不适用于本地C++ OGLES开发。
因此,我代替:
const EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION, 2,EGL_NONE};
mContext = eglCreateContext(mDisplay, lConfig, EGL_NO_CONTEXT,attribList);
但错误并没有消失呢。
答
您是使用真实设备(哪个?),或者您在仿真器上(它不支持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 2012-02-28 07:36:43