Создание шейдеров OpenGL в NativeActivity

Я изменил образец NDK нативной активности, чтобы включить код OpenGL из примера hello-gl2. Я обрабатываю сообщение APP_CMD_INIT_WINDOW а затем пытаюсь создать шейдеры. Создание шейдера терпит неудачу, и я пытаюсь получить информацию через getShaderInfoiv, но это тоже не работает.

Поэтому мой вопрос: как я могу создать шейдер OpenGL ES 2.0 в чистом родном приложении для Android?

PS Я знаю, что создание шейдеров может завершиться неудачно, если вы используете Java GLSurfaceView и не создаете их в правильном потоке, но, глядя на образец собственной активности, у него только один поток!

Solutions Collecting From Web of "Создание шейдеров OpenGL в NativeActivity"

Конечно, можно создать шейдер 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 ... ] 

Надеюсь, поможет!

Интересно, почему вы решили перейти к полному Native решению, обычно то, что вы делаете, это сохранить «родной» только ваш «тяжелый компонент», такой как ваш движок рендеринга, движок AI, физический движок и вы сохраняете «уровень устройства», Вплоть до части Java.

Таким образом, огромным преимуществом является переносимость. Если вы создадите все в NDK, вам придется заново изобрести колесо, если вы хотите переместить свою игру / программу в Iphone, а если вы сохраните «ядро» на C и дополнительные слои на Java, вам придется переписывать только Легкая часть проблемы.

В таких решениях у меня есть большой опыт, так как мой 3D-движок (PATRIA 3D) построен на собственном коде, который можно перекрестно портировать с Android NDK на Iphone Objective C (плюс Windows / Linux / Mac OSx). В конце концов, мой код является полностью совместимым C89 + OpenGL2.0, который может быть скомпилирован прямо (с небольшими изменениями) на Android (с использованием android ndk-build) и Iphone (XCODE).

Следуя этому подходу, движок и выполнить фактический чертеж на том же потоке, позвольте мне назвать его основным потоком.

Если вам нужно несколько потоков в приложении:

A – Держите чертеж на главной (основной) B – Создайте новые потоки в Java, не делайте этого в C (при переносе на другую платформу вы создаете многопоточность на новом уровне)

Что касается шейдеров, решение таким образом очень прост, так как поверхность и init OpenGL выполняется Java, используя стандартную библиотеку EGL.

Поверьте мне, если вы можете написать один раз и использовать на обеих платформах Android и Iphone, вы удваиваете число «клиентов», это то, что вы не можете игнорировать, это может потенциально удвоить ваши доходы.

Надеюсь, это поможет в некотором роде.