OpenGL Basico
-
Upload
alexanderae -
Category
Documents
-
view
1.278 -
download
7
Embed Size (px)
Transcript of OpenGL Basico

OpenGL Básico
Erik Millán

Introducción

¿Qué es OpenGL?
• OpenGL es una librería que sirve como interfaz al hardware gráfico.
• Contiene un conjunto de comandos que permiten– Especificar objetos en 2 y 3 dimensiones.
– Controlar la forma en que estos objetos se dibujan.
• Usa un frame buffer para desplegar los dibujos.• Utiliza primitivas muy simples.

¿Qué es OpenGL? (cont.)
• OpenGL funciona como una máquina de estados que controla un conjunto de operaciones de dibujo específicas.
• Los comandos se procesan en el orden en que son recibidos.
• OpenGL, más que describir objetos complejos, permite indicar cómo desplegar estos objetos.

Instalación de GLUT para Microsoft Visual Studio
• Descargar el archivo glut.zip dehttp://rudomin.cem.itesm.mx/~erik/OpenGL/glut.zip• Extraer los archivos .h en
C:\Archivos de programa\Microsoft Visual Studio\Vc6\include\GL
• Extraer los archivos .lib en C:\Archivos de programa\Microsoft Visual Studio\Vc6\lib
• Extraer los archivos .dll en C:\Windows\system32

Instalación de OpenGL en Cygwin
• Instalar el paquete de OpenGL
• Compilar incluyendo las librerias de glut.
g++ -o prog.exe file1.c … filen.c -lglut -lglu32 -lopengl32
• Ejecutar desde cygwin, o copiar el archivo CYGWIN\cygwin1.dll a windows\system32

Compilación de OpenGL en linux
• Instalar el paquete de OpenGL
• Compilar incluyendo las librerias de glut.
g++ -o prog file1.c … filen.c -lglut –lGLU -lGL

Sintaxis de OpenGL
• Comandos – Comienzan con “gl”.
– Se emplean mayúsculas en la primera letra de cada palabra.
glClearColor().
• Constantes – Comienzan con “GL_”.
– Se escriben con mayúsculas
– Cada palabra se separa por “_”.
GL_COLOR_BUFFER_BIT.

Sintaxis de OpenGL (cont.)
• Algunos comandos usan sufijos para describir los argumentos, como glColor3f().– “3” indica el número de argumentos.
– “f” indica el tipo de los argumentos. Pueden ser:
•b GLbyte •ub GLubyte
•s GLshort •us GLushort
•i GLint •ui GLuint
•f GLfloat •d GLdouble

OpenGL como una máquina de estados
• El estado de OpenGL indica como se dibujarán distintos objetos.
• Muchos de los estados se habilitan o deshabilitan a través de los comandos glEnable y glDisable.
• También se pueden cambiar otros estados, como la primitiva a dibujarse o las matrices de transformación o proyección.

Librerías adicionales
• La creación de ventanas es específica de cada sistema operativo.
• Se han creado librerías sobre OpenGL que permiten una mayor funcionalidad.
• Algunos ejemplos son– GLU– GLUT– GLUI

Manejo de ventanas y eventos con GLUT

Qué es GLUT
• OpenGL Utility Tooklit.
• Permite crear ventanas para despliegue de OpenGL.
• Permite crear menús para interacción con la aplicación
• Tiene distintas rutinas para despliegue de objetos complejos.

SubAPIs de GLUT
• Inicialización
• Manejo de ventanas
• Registro de callbacks
• Procesamiento de eventos
• Manejo de menús
• Despliegue de fuentes
• Despliegue de objetos

Inicialización
• glutInit(int *argcp, char **argv)• glutInitWindowPosition(int x, int y)• glutInitWindowSize(int w, int h)• glutInitDisplayMode(int mode)
– GLUT_RGBA / GLUT_RGB / GLUT_INDEX– GLUT_SINGLE / GLUT_DOUBLE– GLUT_ACCUM– GLUT_ALPHA– GLUT_DEPTH– GLUT_STEREO– GLUT_STENCIl

Buffers de OpenGL
• Frame / Color Buffer: Imagen– Contiene cuatro buffers, usados para double
buffering y despliegue estereográfico.
• Alpha Buffer: Transparencia
• Depth Buffer: Profundidad
• Accumulation Buffer: Mezcla de imágenes
• Stencil Buffer: Identificación de objetos

Manejo de ventanas
• glutCreateWindow(char *name)– Crea una ventana de título name.
• glutPostRedisplay()– Indica a la ventana que debe dibujarse de
nuevo.• glutSwapBuffers()
– Al usar doble buffer, cambia el buffer oculto por el visible.

Callbacks
• Cuando GLUT detecta un evento, manda llamar a una función, conocida como callback.
• Esta función tiene un conjunto de parámetros conocidos que describirán el evento.
• De esta manera se detectan eventos producidos por el usuario o por el sistema de ventanas.

Registro de callbacks
• glutDisplayFunc(void (* func)(void)
– Función encargada del despliegue de la ventana.
– Es llamada por glutPostRedisplay()• glutReshapeFunc(void (*func)(int w, int h))
– Es llamada al cambiar el tamaño de la ventana.– Normalmente se usa para ajustar las
dimensiones de la escena.

• glutIdleFunc(void (* func)())
– Función llamada continuamente cuando no se reciben eventos.
– Normalmente se usa para cambiar el estado en animaciones.
• glutTimerFunc(unsigned int ms, void (* func)(int val), int value)
– Se llama al transcurrir ms milisegundos– Se envia el valor value como parametro de func
Registro de callbacks (cont.)

Registro de callbacks (cont.)
• glutKeyboardFunc(void (* func)(unsigned char key, int x, int y))
– Callback de teclado, recibe el carácter presionado y la posición del ratón.
• glutSpecialFunc(void (* func)(int key,
int x, int y))
– Se llama al presionar teclas especiales.
GLUT_KEY_LEFTGLUT_KEY_RIGHTGLUT_KEY_UPGLUT_KEY_DOWN
GLUT_KEY_PAGE_UPGLUT_KEY_PAGE_DOWNGLUT_KEY_HOMEGLUT_KEY_INSERT
GLUT_KEY_F1…GLUT_KEY_F12GLUT_KEY_END

Registro de callbacks (cont.)
• glutMouseFunc(int button, int state, int x, int y)
– Se llama al presionar o soltar un botón del ratón.
– El botón puede ser GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, or GLUT_RIGHT_BUTTON.
– El estado puede ser GLUT_UP or GLUT_DOWN

Registro de callbacks (cont.)
• glutMotionFunc(void (* func)(int x, int y))
• glutPassiveMotionFunc(void (* func)(int x, int y))
– Se llaman cuando se mueve el ratón.– glutMotionFunc se llama cuando hay un
botón presionado, glutPassiveMotionFunc cuando no hay botones presionados.

Procesamiento de eventos
• glutMainLoop()
• Entra al ciclo de procesamiento de GLUT
• Se llamarán los callbacks registrados previamente

Manejo de menús• int glutCreateMenu(void (*func)(int value))
– El valor pasado a func debe ser diferente para cada elemento del menú.
– Se regresa el identificador del menú.• glutSetMenu(int menu)
– Establece el menú activo.• int glutGetMenu(void)
– Obtiene el identificador del menú activo.

Manejo de menús (cont.)
• glutAddMenuEntry(char *name, int value)
– Agrega un elemento al menú activo.– Al seleccionarse, se envía el valor value al
callback del menú• glutAddSubMenu(char *name, int menu)
– Agrega un submenú al menú activo.• glutAttachMenu(int button)
– Asocia el menú a un botón del ratón, puede ser GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON ó GLUT_RIGHT_BUTTON.

Dibujo de primitivas

Borrado de la pantalla.
• Antes de dibujar las primitivas, es conveniente borrar el cuadro anterior.
• glClearColor(GLclampf r, GLclampf g, GLclampf b, GLclampf a)
– Indica el color de borrado del frame buffer.• glClear(GLbitfield mask)
– Borra los buffers indicados.
GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BIT
GL_STENCIL_BUFFER_BITGL_ACCUM_BUFFER_BIT

Primitivas de OpenGL
• OpenGL dibuja primitivas de acuerdo a un conjunto de modos.
• Cada primitiva es definida por un grupo de uno o más vértices.
• Cada vértice puede tener dos, tres o cuatro coordenadas.
• Además, pueden indicarse parámetros adicionales para cada vértice, como color, normal, material o coordenadas de textura.

Paradigma begin / end
• La mayoría de las primitivas en OpenGL se dibujan incluyendo un conjunto de vértices dentro de un par glBegin / glEnd.
• El tamaño de este conjunto de vértices es ilimitado.
• Para comenzar a dibujar una primitiva, se indica como parámetro de glBegin.

Primitivas
• GL_POINTS: Puntos• GL_LINES: Líneas
individuales.• GL_LINE_STRIP: Líneas
continuas.• GL_LINE_LOOP: Líneas
cíclicas.• GL_POLYGON: Polígonos.
• GL_TRIANGLES: Triangulos.
• GL_TRIANGLE_STRIP: Tiras de triángulos.
• GL_TRIANGLE_FAN: Triángulos en abanico.
• GL_QUADS: Cuadriláteros.• GL_QUAD_STRIP: Tiras de
cuadriláteros.

Vértices
• Cada vértice se indica con el comando glVertex#t.– “#” indica el número de parámetros (2, 3, 4).– “t” indica su tipo (s, i, d, f).– Si se usa la sintaxis glVetrtex#tv, se pueden
pasar los datos a través de un arreglo.– Ejemplo: glVertex2f(0.2, 0.3)

Modificadores
• glEnable(GL_DEPTH_TEST)
– Activa la verificación de profundidad al dibujar• glPointSize(GLfloat s)• glLineWidth(GLfloat w)• glPolygonMode(GLenum face, GLenum mode)
– face: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK– mode: GL_POINT, GL_LINE, GL_FILL
• glCullFace(GLenum face)
– Elimina el dibujo de una cara.– Se habilita con glEnable(GL_CULL_FACE)

Modificadores (cont.)• glLineStipple(GLint n, GLushort pattern)
– Indica el dibujo de una línea punteada.– Se repite el patrón pattern n veces.– Debe habilitarse GL_LINE_STIPPLE
• glPolygonStipple(const GLubyte *mask)
– Indica el dibujo de un polígono punteado.– Mask es de 32x32 bits (128 bytes)– Debe habilitarse GL_POLYGON_STIPPLE

Color
• Para indicar los colores de un vértice se usa el comando glColor#t.
• Esta función recibe 3 o 4 parámetros: rojo, verde, azul, y alfa (transparencia).
• La t puede ser de tipo b, s, i, f, d, ub, us, ui.
• La interpretación de los valores varía dependiendo del tipo de dato.

Sombreado
• Con glShadeModel(GLenum mode) se selecciona un tipo de sombreado.
– GL_FLAT utiliza un color para cada polígono.
– GL_SMOOTH interpola los colores de los diferentes vértices del polígono.