Sin duda, es posible crear un sombreador OpenGL ES 2.0 en una aplicación nativa de Android. La clave es usar el contexto adecuado de OpenGL ES 2.0. Hice algo similar en mi aplicación, a saber, el contexto EGL inicializado en la parte nativa y luego creé (y usé) sombreadores solo en el código nativo. Basado en lo que logré hacer, supongo que lo que quieres hacer también es perfectamente posible.
Como tenía un punto de entrada en el código Java (no usé el mecanismo NativeAcvity) también tuve que pasar el identificador de ventana nativo (EGLNativeWindowType
) de java a C++ para crear una superficie EGL en código nativo. Sin embargo, dado que simplemente quiere modificar el ejemplo de NativeActivity, puede usar engine->app->window
para crear una superficie EGL tal como se presenta en la muestra NativeActivity main.c
.
Bien, ¿cómo crear el contexto apropiado de OpenGL ES 2.0 en el código nativo?Acabo de hacer dos cambios en el archivo main.c
en la muestra NativeActivity y comprueve que funcionó.
En primer lugar, utiliza los siguientes atributos de 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
};
en eglChooseConfig(display, attribs, &config, 1, &numConfigs);
.
En segundo lugar, más tarde en la creación de contexto utilizado
const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
en context = eglCreateContext(display, config, NULL, attrib_list);
Salí del resto del código sin cambios. Imprimí algo de información para asegurarse de que OpenGL ES 2.0 está siendo utilizado:
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 ... ]
espero que ayude!
Disculpa la pregunta posiblemente inútil pero, ¿iniciaste EGL de alguna manera? Creo que el motor OpenGL no está listo para recibir sus solicitudes (eso podría explicar el error silencioso de la llamada getShaderInfoiv). En caso, ¿está cargada la biblioteca OGL 2.0? –
Hola, sí EGL se inicializó –
Sin experiencia en el desarrollo de OpenGL nativo, supongo que el siguiente ejemplo de actividad nativa te deja con el contexto de OpenGL ES 1.0. En el ejemplo de hello-gl2, la elección de la configuración de OpenGL ES 2.0 se realiza dentro del código de Java. – harism