Z pewnością możliwe jest stworzenie modułu cieniującego OpenGL ES 2.0 w natywnej aplikacji Android. Kluczową sprawą jest użycie właściwego kontekstu OpenGL ES 2.0. Zrobiłem coś podobnego w mojej aplikacji, mianowicie zainicjowałem kontekst EGL w natywnej części, a następnie stworzył (i użyłem) shaderów tylko w natywnym kodzie. Na podstawie tego, co udało mi się zrobić, zakładam, że to, co chcesz zrobić, jest również całkowicie możliwe.
Ponieważ miałem punkt wejścia w kodzie Java (nie korzystałem z mechanizmu NativeAcvity) musiałem również przekazać macierzysty uchwyt okna (EGLNativeWindowType
) z java do C++, aby utworzyć powierzchnię EGL w natywnym kodzie. Ponieważ jednak chcesz po prostu zmodyfikować przykład NativeActivity, możesz użyć engine->app->window
do utworzenia powierzchni EGL na podstawie prezentowanej w NativeActivity main.c
próbce.
OK, jak stworzyć właściwy kontekst OpenGL ES 2.0 w natywnym kodzie?Właśnie dokonałem dwóch zmian w pliku main.c
w przykładzie NativeActivity i sprawdziłem, czy działa.
Po pierwsze, stosuje się następującą EGL atrybutów
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
};
w eglChooseConfig(display, attribs, &config, 1, &numConfigs);
.
drugie później tworzenia kontekstu, stosowane
const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
w context = eglCreateContext(display, config, NULL, attrib_list);
że lewy resztę zmiany kodu. Wydrukowałem pewne informacje, aby upewnić się, że OpenGL ES 2.0 jest używany:
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 ... ]
Mam nadzieję, że pomoże!
Przepraszamy za prawdopodobnie niepotrzebne pytanie, ale czy w jakiś sposób zainicjowałeś EGL? Wydaje mi się, że silnik OpenGL nie jest w ogóle gotowy do odbioru twoich żądań (może to wyjaśnić cichy błąd wywołania getShaderInfoiv). Na wypadek gdyby załadowano bibliotekę OGL 2.0? –
Cześć, tak, EGL jest inicjalizowany –
Bez doświadczenia w tworzeniu natywnego OpenGL, zgaduję, że po natywnym działaniu przykład pozostawia kontekst OpenGL ES 1.0. W przykładzie hello-gl2 wybór konfiguracji OpenGL ES 2.0 odbywa się za pomocą kodu Java. – harism