Android: вызов нереализованного OpenGL ES API в glMapBufferOES для OGL ES.1.1

Я работаю над портом с 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? Не понимаю, почему на старых устройствах работает нормально, а на новых не работает.


person Jserra    schedule 23.07.2014    source источник


Ответы (1)


Точка входа, о которой вы говорите, недоступна в OpenGL ES 1.1. Однако может быть доступно расширение GL_OES_mapbuffer. Я бы посоветовал вам запросить glGetString(GL_EXTENSIONS) для строки GL_OES_mapbuffer. Затем, если он доступен, используйте:

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

Затем попробуйте вызвать эту точку входа.

person ashleysmithgpu    schedule 23.07.2014
comment
Думаю, вы правы, но на Nexus 4/5 GL_OES_mapbuffer не входит в число доступных расширений. Это, правда, на Nexus S (почему?). Возможно, мне следует попробовать альтернативы glMapBufferOES, которые работают на большинстве устройств Android... но я думаю, что это другой вопрос. - person Jserra; 23.07.2014
comment
Это странно, если вы посмотрите на gfxbench. com/ и откройте вкладку OpenGL ES 2.0, вы увидите GL_OES_mapbuffer в списке. Может расширения меняются в зависимости от версии GL? Вы всегда можете проверить, существуют ли точки входа, и игнорировать проверку строки. - person ashleysmithgpu; 23.07.2014
comment
Да, на самом деле это работает на NexusS, но не на nexus 4/5, и на самом деле это расширение недоступно на nexus 4/5, так что это связно. В конце концов я заменил вызовы glMapBuffer + memcpy вызовами glBufferSubdata. Поскольку glBufferSubdata не является расширением, оно должно работать на всех устройствах, поддерживающих GL. - person Jserra; 24.07.2014