martes, 30 de abril de 2013

OpenGL desde 0. Capitulo 2: Primitivas de pintado

Capítulo perteneciente al tutorial de opengl desde cero

Hola a todos,

Antes que nada quiero que tengáis en cuenta que gran parte de lo que os explicaré hoy no tiene utilidad más allá de los fines didácticos. Actualmente, con las nuevas versiones de OpenGL gran parte del tema de primitivas queda obsoleto, no obstante creo que es necesario que sepáis como funciona todo para ir aprendiendo el resto poco a poco (entendiendo las primitivas el resto viene directo).

En el capítulo anterior os comenté que existían unos bloques de código donde yo podía poner mi pintado de objetos 3D , los bloques glBegin / glEnd. La función glBegin acepta un parámetro que nos dicta de que manera va a utilizar los vértices que le pasemos a la tarjeta gráfica (si los va a entender como puntos sueltos, componentes de un triangulo o un cuadrado o bien extremos de una linea, por ejemplo)

Las primitivas gráficas que acepta OpenGL son las siguientes:

GL_POINTS: Cada vértice que le pasemos lo pintará como un punto. Esta primitiva puede ser útil en determinados momentos de desarrollo, ya lo explicaremos cuando lleguemos a ello.

GL_LINES: Acepta vértices de dos en dos siendo el primero el punto de inicio y el segundo el punto final de una linea.

GL_LINE_STRIP: Cada vértice que le pasemos será el punto final de una recta formada por este punto y el anterior y a la vez será el punto de inicio de una recta con el siguiente punto que le pasemos a OpenGL. Es decir, encadena puntos mediante rectas.

GL_LINE_LOOP: Es lo mismo que el GL_LINE_STRIP con la única diferencia que genera una recta adicional al final que une el punto incial de la lista con el punto final, formando siempre ciclos cerrados.

GL_TRIANGLES: Esta es una de las primitivas más usadas con diferencia. Acepta tres vértices que conformarán un triángulo. Si le llegan menos de tres vértices no pintará nada.

GL_TRIANGLE_STRIP: Esta directiva es la homóloga de GL_LINE_STRIP en el caso de los triángulos. Cada vértice nuevo genera un triángulo nuevo formado por este último punto y los dos anteriores. En su momento se usaba mucho para pintar modelos complejos (si no recuerdo mal los modelos MD2 del Quake2 se pintaban así).

GL_TRIANGLE_FAN: Este es un caso especial de pintado de triángulos ya que los triángulos nuevos se forman con el último punto que hemos introducido, el anterior y el primero de la lista. Al compartir todos los triángulos un punto (el inicial) acaban siempre quedando como un abanico. Su única utilidad era para simular circunferencias, pero hoy en dia está totalmente en desuso.

GL_QUADS: Esta primitiva está eliminada de las versiones más recientes de OpenGL. Esta primitiva utilizaba cuatro vértices para pintar un cuadrado. Su máxima utilidad residia en aplicaciones 2D como por ejemplo el PakEngine

GL_QUAD_STRIP: Esta primitiva está eliminada de las versiones más recientes de OpenGL. Su funcionamiento era homólogo a las otras primitivas STRIP pero en el caso de QUADS.

GL_POLYGON: Esta primitiva genera un polígono de tantos vértices como se le pase. En general tenía poco uso.


Para demostrar como funciona cada una de las primitivas he desarrollado un código muy sencillo que nos permitirá ver como renderiza cada primitiva teniendo todas  la misma información de vertices.

int DrawGLScene(GLvoid)
{
static int cont = 0 ;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0f,0.0f,-6.0f);

cont++;

switch ( (cont/50) )
{
case 0: glBegin(GL_POINTS); break;
case 1: glBegin(GL_LINES); break;
case 2: glBegin(GL_LINE_STRIP); break;
case 3: glBegin(GL_LINE_LOOP); break;
case 4: glBegin(GL_TRIANGLES); break;
case 5: glBegin(GL_TRIANGLE_STRIP); break;
case 6: glBegin(GL_TRIANGLE_FAN); break;
case 7: glBegin(GL_QUADS); break;
case 8: glBegin(GL_QUAD_STRIP); break;
case 9: glBegin(GL_POLYGON); break;
default: cont = 0; glBegin(GL_POINTS); break;
}

glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();

return TRUE;
}

Aquí tenéis un vídeo que os demostrará como funciona: 


Espero que os haya gustado.... en breve colgaré otro tutorial para ir profundizando más sobre OpenGL.

Recordad que estoy abierto a sugerencias y dudas.

Nos vemos


LordPakusBlog

0 comentarios :

Publicar un comentario

Entradas populares