Este documento describe los pasos para crear un escenario de trabajo básico con OpenGL ES utilizando GLSurfaceView en Android. Explica cómo crear una actividad con un layout que contenga un GLSurfaceView, implementar un renderizador para este view y enlazarlos. También detalla cómo mejorar los métodos de renderizado para configurar parámetros como el color de fondo, profundidad y proyección de la cámara.
1. ACTIVIDADES CON GLSURFACEVIEW
ACTIVIDAD 01
En esta actividad vamos a crear nuestro escenario y entorno de trabajo sobre el que
desarrollar futuras actividades con GLSurfaceview.
PARTE 1: CREAR LA ACTIVITY Y PREPARAR LAYOUT
1. Inicia una nueva Activity que extienda a AppCompatActivity
2. Crea en el Layout un LinearLayout (vertical) que anide en su interior dos LinearLayout
3. El primero (vertical) tendrá una etiqueta de texto centrada y bajo esta una línea negra (2sp)
4. El segundo (vertical) tendrá 4 elementos en este orden de arriba a bajo
Un RelativeLayout (vacio) con id, ocupando el ancho, 300 dp de alto y 20 dp de margen
Una línea negra de 1sp
Un Texto a ancho completo, ajustado en alto y centrado
Una línea negra de 1sp
5. Ejecuta y comprueba que se parece a la siguiente imagen
PARTE 2: CREANDO LA SUPERCIE DE TRABAJO
1. Crea una clase pública externa haz que extienda de GLSurfaceView
2. Ponle un nombre que haga referencia a que es un GLSurface
3. Creale el constructor con el contexto como parámetro
4. A comtinuación crearemos el interfaz de renderizado
5. Crea una clase que hga alusión al renderizado (debajo de la GLSurfaceView)
6. Impleméntale el interface de renderizado del Surface
implements GLSurfaceView.Renderer
7. Te mostrará error porque faltan los métodos
8. Ahora crearemos y sobreescribiremos los tres métodos de renderizado
onSurfaceCreated(GL10 gl, EGLConfig config) {}
onSurfaceChanged(GL10 gl, int ancho, int alto) { }
onDrawFrame(GL10 gl) { }
2. PARTE 3: ENLAZANDO DEL RENDER CON EL GLSURFACE
1. Trabajando en la clase GLSurfaceView (GLS)
2. Hereda una clase de la que has creado para el renderizado
Renderizado miRender;
3. Dentro del constructor crea esta clase
miRender = new Renderizado();
4. Setea en el render de la vista esta clase
setRenderer(miRender);
PARTE 4: ESTABLECIENDO LLAMADA DESDE LA VISTA PRINCIPAL
5. Trabajando con la clase principal
6. Inicializaremos un GLSurfaceView (GLS) y un RelativeLayout
private GLSurfaceView glvista;
RelativeLayout rl;
7. En onCreate enlazaremos el Relativelayout con el que tenemos en el layout de la vista
8. Crearemos el GlSurfaceView inicializado
glvista = new GLSurfaceView(this);
9. Añadiremos al Relativelayout la vista del GlSurfaceView
rl.addView(glvista);
10. Ejecuta y comprueba que se parece a la imagen de más abajo
11. Como pureza de código cuando la activity entre en pausa debes poner la vista GLS en pausa
glvista.onPause();
12. Cuando se encuentre en onResume dbes ponerla en onResume
glvista.onResume();
PARTE 5: MEJORANDO LOS MÉTODOS DE LA VISTA GLSURFACE
1. Volvemos a trabajar con la vista GLS
2. Mejoraremos los métodos propios para tenerlos preparadso para futuras actividades
3. Prímero trabajaremos con onSurfaceCreated
4. Añadiremos el siguiente código (suponiendo que le has puesto gl al parámetro GL10)
3. gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glDisable(GL10.GL_DITHER);
5. A continuación trabajaremos con onSurfaceChanged
6. Protegeremos el colapso del alto y deiniremos el aspecto
if (alto == 0) alto = 1;
float aspecto = (float) ancho / alto;
7. Añadiremos los siguientes métodos públicos
gl.glViewport(0, 0, ancho, alto);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45, aspecto, 0.1f, 100.f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
8. Por último modificaremos onDrawFrame
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
9. Ejecuta y comprueba que aparentemente nada ha cambiado