Práctica 2. Primitivas en OpenGL.
La manera en la que OpenGL dibuja las cosas es en base a primitivas que pueden ser puntos, segmentos de linea y polígonos. No importa que sencillas o complejas sean las cosas que queremos dibijar, primero las vamos a tener que paritr en primitivas que después podremos dibujar. Cada primitiva se define en términos de los vértices que la componen (utilizando el comando glVertex ), el color que vamos a utilizar en ese vértice (usando glColor ) y las caracteristicas específicas para el tipo de primitiva.
Cada vez que queramos hacer que se dibuje una primitiva debemos llamar el comando glBegin(), indicando el tipo de primitiva que vamos a dibujar, dar las coordenadas de los vértices y terminar con el comando glEnd. En la siguiente tabla hay un resumen con los tipos de parámetros que podemos dar a glBegin():
Valor |
Función |
GL_POINTS | Dibuja un punto por cada vértice |
GL_LINES | Dibuja un segmento de recta por cada par de vértices |
GL_LINE_STRIP | Se dibuja un segmento desde el vértice 0 al 1, del 1 al 2, del 2 al 3 y así sucesivamente hasta trazar un segemento entre el último y penúltimo vértice |
GL_LINE_LOOP | Igual que GL_LINE_STRIP pero además dibuja un segmento que une el último con el primer vértice |
GL_TRIANGLES | Dibuja un triángulo por cada 3 vértices |
GL_TRIANGLE_STRIP | Dibuja un triángulo con los primeros tres vértices, depués, para cada nuevo vértice dibuja un nuevo triángulo utilizando los últimos 3 vértices |
GL_TRIANGLE_FAN | Dibuja un triángulo con los primeros tres vértices, depués, para cada nuevo vértice dibuja un nuevo triángulo utilizando los últimos 2 vértices y el primero |
GL_QUADS | Dibuja un cuadrilátero por cada 4 vértices |
GL_QUAD_STRIP | Dibuja un cuadrilátero usando los primeros 4 vértices, después, para cada nuevo par de vértices se dibuja un cuadrilatero utilizando los últimos 4 vértices. |
GL_POLYGON | Dibuja un polígono convexo usando los vértices |
Un ejemplo del uso de glBegin es el siguiente:
procedure TForm1.DibujarOGL; |
Dibujando primitivas.
En OpenGL podemos llamar a algunos comandos que modifican la forma en la que se dibujan las primitivas. Vamos a ver estos comandos según el tipo de primitiva que afectan:
glPointSize(GLfloat size) Con size indicamos el tamaño en pixeles que queremos utilizar para un punto
glLineWidth(GLfloat width)
Indicamos el ancho en pixeles de las líneas.
glLineStipple(GLint factor, GLushort pattern) Indicamos un patrón a ser dibujado. El valor de pattern indica la máscar en binario que queremos utilizar. Cuando un bit de la máscara está en 1, dibujamos la recta y cuando está en 0 no se dibuja. factor indica cuantos pixeles vamos a dibujar por bit. Para que este comando tenga efecto hay que activar GL_LINE_STIPPLE usando glEnable
glFrontFace(GLenum mode)
OpenGL puede dibujar de manera diferente la cara frontal y trasera de un polígono. Este comando sirve para indicar cual orientación se va a considerar como frontal (y por conscuente, la contraria será la trasera). Los valores que puede tomar mode
son GL_CCW y GL_CW que corresponden a la mano derecha e izquierda respectivamente.
glPolygonMode(GLenum face, GLenum mode)
Sirve para indicar como vamos a dibujar los polígonos. En face indicamos que lado del polígono queremos modificar (los valores de face pueden ser GL_FRONT, GL_BACK o GL_FRONT_AND_BACK) . En mode podemos usar GL_POINT, GL_LINE o GL_FILL que indica como vamos a dibujar cada polígono (sólo dibujar vértices, aristas o el interior respectivamente)
glCullFace(GLenum mode)
Indica que caras vamos a pintar, si mode es GL_FRONT sólo se dibujaran los poligonos que tengan la orientación definida con glFrontFace
. mode puede ser GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK. Para que este comando tenga efecto se debe activar GL_CULL_FACE usando glEnable. Este comando es muy útil para acelerar la presentación de objetos convexos que tenga una orientación consistente. Si estamos fuera del objeto podemos indicar que sólo se dibujen las caras que vemos.
glPolygonStipple(^GLubyte *mask) Funciona de manera similar a glLineStipple. En mask debemos dar un arreglo de 128 GLubyte que corresponden a una matriz binaria de tamaño 32x32.