Конечно, можно создать шейдер 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
};
in eglChooseConfig(display, attribs, &config, 1, &numConfigs);
.
Во-вторых, позже при создании контекста использовалось
const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
in 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 ... ]
Надеюсь, поможет!
person
youri
schedule
13.01.2012