Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Renderización de Android OpenGLES con C ++ y Java

Tengo una aplicación de Android que usa GLES para renderizar. En la actualidad, utilizar Java para procesar cosas y renderizar está bien. Debido a la limitación en la memoria de la aplicación Java de Android, planeo integrar el renderizado nativo a mi código de renderizado de Java.

Para ello, seguí los tutoriales básicos de GLES nativos. Después de integrar, la representación de Java no era visible, solamente las cosas que hacía en C ++ fueron vistas.

La versión más simple del código está en: https://github.com/khedd/JavaCppGLES El código Java representa un triángulo, C ++ representa un Quad. Si ambos se llaman sólo Quad es representador.

¿Cómo puedo solucionar este problema? ¿Debo portar todo a C ++?

Código en pocas palabras.

MyGLRenderer(){ mTriangle = new Triangle(); mCppRenderer = new MyCppRenderer(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(1.0f, 0.0f, 1.0f, 1.0f); //init java triangle mTriangle.init(); //init c quad mCppRenderer.init(); //comment this line to make java triangle appear } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); mTriangle.draw(); mCppRenderer.draw (); } 

2 Solutions collect form web for “Renderización de Android OpenGLES con C ++ y Java”

El problema fue causado por no desvincular los tampones.

 glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

Añadir estas dos líneas a init y render corrige el problema.

La forma más sencilla de hacerlo es llamar directamente a su código C ++ desde su renderizador de superficie.

 private class PlayerRenderer implements GLSurfaceView.Renderer { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { surface_created(); // native c++ } @Override public void onSurfaceChanged(GL10 gl, int wid, int hgt) { surface_changed(wid, hgt); // native c++ } @Override public void onDrawFrame(GL10 gl) { surface_draw(); // native c++ } } private native void surface_created(); private native void surface_changed(int w, int h); private native void surface_draw(); 

No es necesario cambiar el contexto.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.