C++ Android:在OGL ES.1.1的glMapBufferOES上调用了未实现的OpenGL ES API

C++ Android:在OGL ES.1.1的glMapBufferOES上调用了未实现的OpenGL ES API,c++,opengl-es,android-ndk,opengl-es-1.1,C++,Opengl Es,Android Ndk,Opengl Es 1.1,我正在开发一个OpenGL ES 1.1应用程序的从iOS到Android NDK的端口。 我用我的Nexus S设备测试了这个端口,它工作得很好,但是当我在较新的设备Nexus 4和5上测试它时,例如,但是对于其他较新的设备,它发生了相同的错误 调用未实现的OpenGL ES API 打电话时: vbo_buffer = (GLchar*)glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); 但是,对于其他gl调用,没有问题 详情: 我将Op

我正在开发一个OpenGL ES 1.1应用程序的从iOS到Android NDK的端口。 我用我的Nexus S设备测试了这个端口,它工作得很好,但是当我在较新的设备Nexus 4和5上测试它时,例如,但是对于其他较新的设备,它发生了相同的错误

调用未实现的OpenGL ES API

打电话时:

vbo_buffer = (GLchar*)glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
但是,对于其他gl调用,没有问题

详情:

我将OpenGLES1.1与glext包一起使用。如果我打印opengl版本,它会显示:

07-23 10:32:51.804: D/ES1Renderer(32097): OpenGL ES Version: OpenGL ES-CM 1.1
在Android.mk中:

LOCAL_LDLIBS    := -llog -lGLESv1_CM -lz
在舱单上:

<uses-feature android:glEsVersion="0x00010001" android:required="true" />
作为GLSurfaceView和ES1Renderer的EAGLView子类,正在实现GLSurfaceView.Renderer


我是否应该设置其他内容来告诉设备使用OGL ES 1.1?我不明白为什么它在旧设备上运行良好,但在新设备上失败。

您所说的入口点在OpenGL ES 1.1中不可用。但是,可以使用扩展名。我建议您查询字符串GL\u OES\u mapbuffer的glGetStringGL\u扩展。然后,如果可用,请使用:

typedef void * (*MapBufferOESType)(GLenum, GLenum);
MapBufferOESType MapBufferOES = (MapBufferOESType)eglGetProcAddress("MapBufferOES");

然后尝试调用此入口点。

我认为您是对的,但在Nexus 4/5上,GL_OES_mapbuffer不在可用扩展中。然而,它是关于Nexus S why?的?。也许我应该尝试在大多数android设备上使用glMapBufferOES的替代品。。。但我想这是另一个问题。这很奇怪,如果你查看并打开OpenGL ES 2.0选项卡,你可以在列表中看到GL_OES_mapbuffer。可能扩展会根据GL版本而变化?您可以随时检查入口点是否存在,并忽略字符串检查。是的,实际上它在nexus上工作,但在nexus 4/5上不工作,事实上,扩展在nexus 4/5上不可用,因此它是一致的。最后,我做的是用glBufferSubdata调用替换对glMapBuffer+memcpy的调用。由于glBufferSubdata不是一个扩展,它应该可以在每个能够使用GL的设备上工作。
typedef void * (*MapBufferOESType)(GLenum, GLenum);
MapBufferOESType MapBufferOES = (MapBufferOESType)eglGetProcAddress("MapBufferOES");