2013-07-27 2 views
2

Недавний Android NDK r9 представляет поддержку OpenGL ES 3.0. Существует пример samples/gles3jni, который демонстрирует, как использовать OpenGL ES 3.0 из JNI/собственного кода. Образец может быть построен двумя различными способами:OpenGL ES 3.0 в Android NDK r9

  • Совместимость с уровнем API 11, а затем
  • Требовать уровень API 18 или более поздней версии.

Обе версии включают резервный путь OpenGL ES 2.0 для устройств, которые не поддерживают OpenGL ES 3.0. Однако в первом примере пример статически связан с OpenGL ES 2 с использованием LOCAL_LDLIBS опциона -lGLESv2. Во втором случае он статически связан с GLES 3 одинаково.

инициализации выглядит следующим образом:

const char* versionStr = (const char*)glGetString(GL_VERSION); 
if (strstr(versionStr, "OpenGL ES 3.") && gl3stubInit()) { 
    g_renderer = createES3Renderer(); 
} else if (strstr(versionStr, "OpenGL ES 2.")) { 
    g_renderer = createES2Renderer(); 
} 

Как я могу опустить статические ссылки на все и GLES нагрузки 2 или 3 динамически .so?

+1

Обратите внимание на теги, пожалуйста: http://meta.stackexchange.com/questions/190739/opengl-es-3-or-opengl-es-3-0-tag?noredirect=1#comment591924_190739 –

ответ

1

У меня не было устройства 4.3 для его проверки, но я понимаю, что 1-й метод фактически использует GLES 3, если он доступен, поэтому он эквивалентен динамической привязке libGLESv3.

Также возможно динамическое связывание с libglesxx.so, но тогда у вас нет ярлыков и вам необходимо выполнить все функции, которые вы используете. Это не стоит, ИМХО.

+1

Да, но он связывает GLES2 статически. –

+0

Он связывает GLES2 статически, но libGLESv2.so пересылает вызовы на v3. –

+0

Я вижу и в настоящее время делаю это. Однако вопрос заключался в том, чтобы динамически выбирать GLES2 vs GLES3 без какой-либо статической связи. Есть ли стандартное имя для '' libglesxx.so''? –

1

В API 18 и более поздних версиях вы можете использовать eglGetProcAddress для динамического запроса функций ES 2.0, как и gl3stub.c в примере для функций ES 3.0. Перед API 18, вам нужно сделать что-то вроде этого:

// global scope, probably a header file 
extern GL_APICALL const GLubyte* (* GL_APIENTRY glGetString) (GLenum name); 
extern GL_APICALL GLenum (* GL_APIENTRY glGetError) (void); 
... 

// initialization code 
void* libGLESv2 = dlopen("libGLESv2.so", RTLD_GLOBAL | RTLD_NOW); 
glGetString = dlsym(libGLESv2, "glGetString"); 
glGetError = dlsym(libGLESv2, "glGetError"); 
... 

Добавить проверки ошибок на dlopen и dlsym звонков, конечно.

Я не уверен, почему вы это сделаете. libGLESv2.so присутствует на любой версии Android, на которую вы, вероятно, захотите настроить таргетинг, не должно быть недостатка, чтобы связать ее.

Смежные вопросы