Конечно, можно создать шейдер OpenGL ES 2.0 в собственном приложении Android. Ключевым моментом является использование правильного контекста OpenGL ES 2.0. Я сделал нечто подобное в своем приложении, а именно: инициализировал контекст EGL в нативной части, а затем создал (и использовал) шейдеры только в нативном коде. Исходя из того, что мне удалось сделать, я предполагаю, что то, что вы хотите сделать, также вполне возможно.
Поскольку у меня была точка входа в код Java (не использовался механизм NativeAcvity), мне также пришлось передать дескриптор собственного окна (EGLNativeWindowType
) из Java в C ++, чтобы создать поверхность EGL в собственном коде. Однако, поскольку вы хотите просто изменить пример NativeActivity, вы можете использовать engine->app->window
для создания поверхности EGL, как показано в примере NativeActivity main.c
.
ОК, как создать надлежащий контекст OpenGL ES 2.0 в нативном коде? Я только что сделал два изменения в файле main.c
в образце NativeActivity и проверил, как он работает.
Во-первых, использовались следующие атрибуты EGL
const EGLint attribs[] = {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //important
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
в eglChooseConfig(display, attribs, &config, 1, &numConfigs);
.
Во-вторых, позже при создании контекста использовали
const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
в context = eglCreateContext(display, config, NULL, attrib_list);
Я оставил остальную часть кода без изменений. Я напечатал некоторую информацию, чтобы убедиться, что OpenGL ES 2.0 используется:
I/native-activity( 955): Details: [Version: OpenGL ES 2.0 1403843], [Vendor: Qualcomm], [Renderer: Adreno 205], [Extensions: GL_AMD_compressed_3DC_texture GL_AMD_compressed_ATC_texture ... ]
Надеюсь, это поможет!