Я работаю над портом от iOS до Android NDK приложения OpenGL ES 1.1.
Я протестировал порт на своем устройстве Nexus S, и он работает нормально, но, поскольку я тестировал его на более новых устройствах (например, Nexus 4 и 5, но для других более новых устройств это происходит так же), есть ошибка
Called unimplemented OpenGL ES API
при звонке:
vbo_buffer = (GLchar*)glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
Для других вызовов GL проблем нет.
Подробности:
Я использую OpenGL ES 1.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 от Java до C / C ++ OpenGL, и вот инициализация
public void initGLView() {
glView = new EAGLView(getActivity(), null);
glView.setEGLContextClientVersion(1);
glView.setRenderer(new ES1Renderer(glView));
}
Будучи EAGLView подклассом GLSurfaceView и ES1Renderer, он реализует GLSurfaceView.Renderer.
Что-нибудь еще, что я должен установить, чтобы сказать устройству использовать OGL ES 1.1? Я не понимаю, почему он работает нормально на старых устройствах, но не работает на более новых.
Точка входа, о которой вы говорите, недоступна в OpenGL ES 1.1. Однако расширение, GL_OES_mapbuffer может быть доступно. Я бы предложил вам запрос glGetString(GL_EXTENSIONS)
для строки GL_OES_mapbuffer
, Тогда, если это возможно, используйте:
typedef void * (*MapBufferOESType)(GLenum, GLenum);
MapBufferOESType MapBufferOES = (MapBufferOESType)eglGetProcAddress("MapBufferOES");
Затем попробуйте вызвать эту точку входа.