jueves, noviembre 02, 2006

Capítulo 2: Manejo de Estados y Dibujado de Objetos Geométricos

Limpiado de la Ventana
• Seleccionar el color de limpiado del buffer de color en modo RGBA:
– glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
• Limpiar el actual buffer: – glClear(GL_BUFFER_BIT);
1. Buffers de Limpiado
Ejemplo: glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Especificación de un Color
• glColor3f(0.0, 0.0, 0.0); negro
• glColor3f(1.0, 0.0, 0.0); rojo
• glColor3f(0.0, 1.0, 0.0); verde
• glColor3f(1.0, 1.0, 0.0); amarillo
• glColor3f(0.0, 0.0, 1.0); azul
• glColor3f(1.0, 0.0, 1.0); magenta
• glColor3f(0.0, 1.0, 1.0); cyan
• glColor3f(1.0, 1.0, 1.0); blanco
Describiendo Primitivas
• Rectángulos:
– void glRect{sifd}( x1, y1, x2, y2 );
– void glRect{sifd}v( v1, v2 );
• Especificación de vértices:
– voidglVertex{234}{sifd}[v](coodenadas);















Describiendo Primitivas
glBegin(GL_POLYGON);
glVertex2f(0.0, 0.0);
glVertex2f(0.0, 3.0);
glVertex2f(4.0, 3.0);
glVertex2f(6.0, 1.5);
glVertex2f(4.0, 0.0);
glEnd();

#define PI 3.1415926535898
GLint circle_points = 100;
glBegin(GL_LINE_LOOP);
for (i = 0; i < circle_points; i++) {
angle = 2*PI*i/circle_points;
glVertex2f(cos(angle), sin(angle)); }
glEnd();

Manejo de Estados Básicos
• Ciertos estados se pueden habilitar o deshabilitar:
– void glEnable(GLenum cap);
– void glDisable(GLenum cap);
• Ejemplos:
– glEnable( GL_BLEND );
– glEnable( GL_DEPTH_TEST );
– glEnable( GL_FOG );
– glEnable( GL_LINE_STIPPLE );
– glEnable( GL_LIGHTING );

• Chequear el actual estado de una cierta características:
– GLboolean glIsEnabled(GLenum capability)

• Chequear diferentes estados:
– voidglGetBooleanv(GLenum pname, GLboolean *params);
– voidglGetIntegerv(GLenum pname, GLint *params);
– voidglGetFloatv(GLenum pname, GLfloat *params);
– voidglGetDoublev(GLenum pname, GLdouble *params);
– voidglGetPointerv(GLenum pname, GLvoid **params);

Despliegue de Polígonos
• Definir el tamaño de un punto:
– voidglPointSize(GLfloat size);
• El tamaño debe ser mayor que 0.0 y por defecto es 1.0.

• Definir el ancho de línea:
– voidglLineWidth(GLfloat width);
• Dibujar líneas punteadas o segmentadas:
– voidglLineStipple(GLint factor, GLushort pattern);
– glEnable(GL_LINE_STIPPLE);
– Ejemplo: glLineStipple(1, 0x3F07);
glEnable(GL_LINE_STIPPLE);
• Patrones de línea

• Detalle de Polígonos:
– Polígonos tienen dos lados: front y back.
– Por defecto ambos lados se dibujan.
– Para cambiar la propiedades de dibujado:
• voidglPolygonMode( GLenum face, GLenum mode );
• Face: GL_FRONT_AND_BACK, GL_FRONT o GL_BACK;
• Mode: GL_POINT, GL_LINE, o GL_FILL
• Ejemplo:
– glPolygonMode(GL_FRONT, GL_FILL);
– glPolygonMode(GL_BACK, GL_LINE);

• Inversión y Descarte de Caras de Polígonos:
– Por defecto la cara-front corresponde a la secuencia de vértices dibujados en contra de la manecillas de reloj.
– Se puede cambiar la orientación:
• voidglFrontFace(GLenum mode);
• Mode: GL_CCW o GL_CW. – Se puede descartar el dibujado de caras: • voidglCullFace( GLenum mode );
• Mode: GL_FRONT, GL_BACK, o GL_FRONT_AND_BACK.
• Para activar descarte de caras:
– glEnable( GL_CULL_FACE );
Vectores Normales
• Un vector normal es un vector con dirección perpendicular a la superficie.
• OpenGL permite especificar una normal por polígono o por vértice.
• Las normales se usan para calcular la porción de luz que recibe un objeto en cada vértice.
• Una normal se especifica por:
– voidglNormal3{bsidf}( nx, ny, nz );
– voidglNormal3{bsidf}v( v );
glBegin (GL_POLYGON);
glNormal3fv(n0);
glVertex3fv(v0);
glNormal3fv(n1);
glVertex3fv(v1);
glNormal3fv(n2);
glVertex3fv(v2);
glNormal3fv(n3);
glVertex3fv(v3);
glEnd();

Grupos de Atributos
• Es posible guardar y restaurar conjuntos de atributos.
• En OpenGL se relacionan variables de estados en grupos de atributos.
• Para guardar y restaurar atributos se utiliza:
– glPushAttrib( GLbitfield mask );
– glPopAttrib();

No hay comentarios: