Primitivas en OpenGL

RECTÁNGULOS

A diferencia de los triángulos, con esta primitiva hay que tener bastante cuidado ya que es posible suministrar cuatro vértices que no sean coplanares (que compartan el mismo plano), en cuyo caso OpenGL puede dibujarlo de manera incorrecta.

Hay únicamente dos tipos de primitiva rectángulo en OpenGL, los independientes y conectados.

8. Rectángulos Independientes glBegin(GL_QUADS);

Cada cuatro vértices proporcionados es generado un rectángulo, si son proporcionados vértices que no corresponden a ningún grupo de cuatro, dichos vértices son descartados.

Ejemplo:

...
glBegin(GL_QUADS);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(1.0f,0.0f,0.0f);
	glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
…

Este segmento de código dibuja un cuadrado de lado 1 sobre el plano XY, con la cara frontal en sentido Z+ en CCW.

9. Rectángulos Conectados glBegin(GL_QUAD_STRIP);

Los primeros cuatro vértices generan un rectángulo, luego cada par adicional de vértices genera un nuevo rectángulo conectado con los dos últimos vértices especificados en el anterior. Esta primitiva es bastante particular, ya que los bordes deben ser suministrados de manera alternada con el fin de preservar el winding, esto se ve mas claramente en el ejemplo y el gráfico.

Ejemplo:

…
glBegin(GL_QUAD_STRIP);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(0.0f,1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glEnd();
…

Este código dibuja dos cuadrados de lado 1, el primero en el plano XY con la cara frontal hacia Z+ en sentido CW y el segundo en el plano ZY con la cara frontal hacia X+ en sentido CW.

10. Polígonos Generales glBegin(GL_POLYGON);

Esta primitiva es una representación general de un polígono, lo que incluye un triángulo, rectángulo o cualquier polígono de n lados. Existe una restricción adicional y es que al especificar polígonos, además de que todos los vértices tienen que ser coplanares y es que el polígono tiene que ser convexo. Si alguna o ambas de estas condiciones no se cumplen, OpenGL dibujará los polígonos de formas no esperadas y generalmente indeseables.

Para forma un polígono basta suministrar tres o más vértices que cumplan las anteriores condiciones.

Ejemplo:

#define PI 3.1415926535897932384626433832795f
#define SUBD 13
...
int n= 2*PI/SUBD;
glBegin(GL_POLYGON);
	glVertex3f(0.0f,0.0f,0.0f);
	for(int seg=0, seg<subd;seg++)
{
		glVertex3f(cos(seg*n), sin(seg*n),0.0f);
}
glEnd();
…

Este ejemplo es idéntico en estructura al de TRIANGLE_STRIP con la diferencia que este formará un solo polígono, en este caso uno regular de n-1 lados.

Ejemplo rectangulos y poligonos

NOTAS FINALES

Bien, eso es casi todo en el tema de primitivas, aún así es bueno tener en cuenta algunas cosas sueltas relacionadas con el asunto.

• No es posible llamar cualquier comando entre un glBegin() y un glEnd(), por ejemplo glIndexPointer(), glNormalPointer(), glTexCoordPointer(), glSecondaryColorPointer() , glVertexPointer(), glVertexAttribPointer(), entre otras no pueden ser llamadas, ya que causarían un error o un estado indefinido. Para una completa referencia ver las especificaciones de OpenGL.

• Es recomendable utilizar la menor cantidad posible de llamados a glBegin()/glEnd() con el fin de ganar un poco de rendimiento a la hora de ejecutar el programa.

• Al momento de utilizar textura e iluminación será necesario especificar nuevos parámetros dentro del glBegin()/glEnd(), como son la normal a la superficie y las coordenadas de textura.

• Si glShadeModel() esta configurado en SMOOTH es posible agregar colores individuales a cada vértice mediante glColor, que luego serán degradados en la superficie de la primitiva (incluidas líneas).

El ejemplo final es un horrendo pajarraco realizado a partir de primitivas, 100% hardcoded.

Pajarraco

download


Descargar:	primitvarias.zip
Version:	0.1
Actualizado:	December 22, 2009
Tamaño:		97.95 KB

El ejemplo de casi todas las primitivas.

1 2 3 4

Compartir esta entrada

DiggReddit
  • Jonathan

    ¿Tendrá consecuencias ideológicas, formativas y sociales, la forma de pensar:

    “si luce bien, esta bien”

    ?

    Por cierto, la palabra “está” se acentúa.

  • nolasco

    bueno todo esta bonito
    pero me gustaria que sean mas orientaodos a los codigos bueno yo se mas o menos
    todo lo que e leido buneo ya lo sabia pero quisiera ssaber como dar movientos a cualquier objeto no sobre su propio eje ya sea y,x,z sino
    por ejeplo un carrito que avance en forma horizontal

  • http://black-byte.com/ jotatsu

    En el tutorial “Transformaciones en OpenGL encontrarás algo de información al respecto.

  • darkniel

    excelente trabajo, muy didactico, me sirvio de mucho, gracias

  • rojiza

    Hola
    Aqui les dejo un link donde encontrar algunos ejemplo de programas en opengl

    bueno ami me sirvieron.
    http://openglenc.es.tl

  • Yorjander

    muy buena la informaciu00f3n que se ha publicado, pero seru00eda mu00e1s interesante si pusieru00e1n mas ejemplos de cu00f3digo.