36
OpenGL Básico Erik Millán

OpenGL Basico

Embed Size (px)

Citation preview

Page 1: OpenGL Basico

OpenGL Básico

Erik Millán

Page 2: OpenGL Basico

Introducción

Page 3: OpenGL Basico

¿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.

Page 4: OpenGL Basico

¿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.

Page 5: OpenGL Basico

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

Page 6: OpenGL Basico

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

Page 7: OpenGL Basico

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

Page 8: OpenGL Basico

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.

Page 9: OpenGL Basico

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

Page 10: OpenGL Basico

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.

Page 11: OpenGL Basico

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

Page 12: OpenGL Basico

Manejo de ventanas y eventos con GLUT

Page 13: OpenGL Basico

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.

Page 14: OpenGL Basico

SubAPIs de GLUT

• Inicialización

• Manejo de ventanas

• Registro de callbacks

• Procesamiento de eventos

• Manejo de menús

• Despliegue de fuentes

• Despliegue de objetos

Page 15: OpenGL Basico

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

Page 16: OpenGL Basico

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

Page 17: OpenGL Basico

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.

Page 18: OpenGL Basico

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.

Page 19: OpenGL Basico

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.

Page 20: OpenGL Basico

• 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.)

Page 21: OpenGL Basico

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

Page 22: OpenGL Basico

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

Page 23: OpenGL Basico

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.

Page 24: OpenGL Basico

Procesamiento de eventos

• glutMainLoop()

• Entra al ciclo de procesamiento de GLUT

• Se llamarán los callbacks registrados previamente

Page 25: OpenGL Basico

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.

Page 26: OpenGL Basico

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.

Page 27: OpenGL Basico

Dibujo de primitivas

Page 28: OpenGL Basico

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

Page 29: OpenGL Basico

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.

Page 30: OpenGL Basico

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.

Page 31: OpenGL Basico

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.

Page 32: OpenGL Basico

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)

Page 33: OpenGL Basico

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)

Page 34: OpenGL Basico

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

Page 35: OpenGL Basico

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.

Page 36: OpenGL Basico

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.