Sunteți pe pagina 1din 45

¿Qué es OpenGL?

• OpenGL es una biblioteca para el desarrollo de


gráficos por computadora en 2D y 3D
multiplataforma (Linux, Windows, Unix, MacOS, PS3)

• Su nombre proviene de Open Graphics Library

• Es una especificación que define una API (del inglés


Application Programming Interface - Interfaz de
Programación de Aplicaciones) para la programación
de gráficos en varios lenguajes
Orígenes de OpenGL
• Inicio de la computación gráfica: Ivan
Sutherland (50’s -60’s) Sketchpad
• Simuladores de Vuelo
• Implementaciones en ensamblador
• Surgen las primeras bibliotecas de
gráficos(PHIGS)
• OpenGL fue creada en 1992 por Silicon
Graphics Inc. , su antecesora se llamaba IRIS
GL
Historia de OpenGL
• IRIS GL su antecesora contenía elementos y
funciones para manejo de Ventanas, Ratón y Teclado
que hacían tener problemas para un esquema de
licenciamiento abierto
• Se buscó emtonces eliminar funciones no
reelevantes para gráficos, estandarizar el acceso al
hardware
• Se crea el OpenGL Architecture Review Board(1992)
• En 1994 se trabaja en OpenGL++ pero nunca salió a
la luz pública
• 1995 Microsoft lanza Direct3D
Un poco de más historia
• En 1997 surge el proyecto Farenheit para
estandarizar y unificar Direct3D y OpenGL
• 1998 HP apoya el proyecto
• 1999 SGI se queda solo
• 2006 OpenGL pasa al Grupo Khronos
• Se creó el OpenGL ARB Working Group
Documentación disponible
• El Libro Rojo - The Red Book: The OpenGL
Programmer's guide.
– Libro de referencia y tutorial. Considerado libro de
cabecera para programadores de OpenGL.

• El Libro Azul - The Blue Book: The OpenGL Reference


manual.
– En esencia, una copia de la páginas del man de OpenGL.
– Incluye un poster desplegable con el diagrama de la
estructura de una implementación ideal de OpenGL.
Más documentación
• El Libro Naranja - The Orange Book: The
OpenGL Shading Language.
– Libro de referencia y tutorial para GSLS
(Lenguaje de Shaders de OpenGL)
Características de OpenGL
• Objetivos
1. Ocultar complejidad de Hardware
2. Ocultar las capacidades del Hardware

• Propósito: Dibujado (puntos, líneas,


polígonos)

• OpenGL como una Máquina de Estados ,


prefiero llamarlos Switches
Características de OpenGL
• Creada para tener la mejor calidad posible en
gráficos, lo cual depende en gran medida del
Hardware
• Da gran libertad para crear gráficos pero
requiere de conocimientos de computación
gráfica
• Manejo de un pipeline gráfico
Pipeline Gráfico
• Es el proceso mediante el cual las abstracciones de
un Espacio de Objetos (vectores, vértices, muchas
matemáticas) pasan a ser elementos de un Espacio
de Dispositivo (que generalmente son píxeles)
• Para lograrlo se aplican una serie de pasos
secuenciales que realizan transformaciones,
algoritmos , cosideraciones etc
• Se dice que el espacio objeto es n dimensional y el
de dispositivo 2D
Es decir…
Pipeline de OpenGL
En conclusión: OpenGL tiene
• Funciones para dibujar en 2D y 3D
• Transformaciones
• Algoritmos de iluminación
• Z-Buffering
• Mapeo de Texturas
• Soporte para Shaders
• Blending, elementos de antialiasing , efectos
de Fog
Y OpenGL no tiene
• Funciones para manejar ventanas, eventos de ratón
o teclado
• Funciones o procedimientos para crear un objeto
completo a partir de una descripción natural
ejemplo: comando dibuja_llanta_de_un_camión
• Soporte nativo para dibujado de curvas
• Soporte nativo para audio y/o texto
• Detección de colisiones
• Carga de imágenes
Usos
OpenGL se ha utilizado en los siguientes campos de
la computación que requieren de desarrollo de
gráficos:

• CAD
• Realidad Virtual
• Representación científica
• Visualización de Información
• Simuladores
• Desarrollo de videojuegos (Soportada en PS3)
Aplicaciones
• Simuladores de vuelo militares ( EU)
• Simuladores de operaciones de tejido (En
Europa principalmente)
• Desarrollo de videojuegos como GLQuake de
IdSoftware
• Programas de diseño (3D Max)
• Desarrollo de Game Engines
• Programas de simulación en general, CAD y
CAM, etc
Alcances de la biblioteca
• La competencia : Direct3D
• OpenGL fue diseñada para la calidad
• Direct3D incluye emulación por software
• Es un estándar de la industria
• Soportada en muchas plataformas
• Escalable y estable
• Fácil de usar
• Bien documentada
Qué más ofrece
• Extensiones : Capacidades extras que ofrecen
los vendedores de hardware
• Revisada constantemente
• De licencia abierta
• Libertad para intervenir el pipeline mediante
shaders
• Libertad de generar algoritmos para crear
cosas no incluidas en la biblioteca
Generalidades de la
programación bajo OpenGL
Qué pasa con lo que no tiene
• Y las ventanas , mouse, teclado?
– GLUT GL Utility Toolkit
– API de Win32

• Imágenes
– SDL Image
– Devil

• Sonido
– SDL Mixer
– OpenAL
Y en linux??
• Implementación libre Mesa3D
• Biblioteca “like” OpenGL
• Generalmente puede descargarse en paquetes
para su programación
• Tampoco contiene elementos para manejo de
ventanas
– Opciones GTK, SDL, GLUT, FreeGLUT, OpenGLUT
Como funciona??

HARDWARE
Sintaxis Básica
• OpenGL contiene 3 elementos distintos
básicos.
– Tipos de datos

– Funciones

– Constantes
Tipos de datos
• Evitan problemas de implementación en
compiladores donde el tamaño de los tipos de
datos son diferentes a los estándares

• Se recomienda su uso para asegurar el


rendimiento de una aplicación más no es
necesario u obligatorio

• Inician con GL
Funciones
• Usos
– Dibujado de elementos
– Manipulación de proyecciones
– Transformaciones Geométricas
– Habilitación / Deshabilitación de “switches”
– Texturizado
– Aplicación de elementos para lograr iluminación
– Cuenta con 150 funciones básicas
Sintaxis de funciones
• Se anteponen gl si pertenecen a la biblioteca
OpenGL, glu o glut si son de éstas
respectivamente
• Contienen información al final de cuántos
parámetros reciben y cuál es su tipo
• Ejemplos:
– glVertex3f
– glVertex3fv
– glVertex3i
Formato

glVertex3fv( v )

Number of Data Type Vector


components b - byte omit “v” for
ub - unsigned byte
2 - (x,y) scalar form
s - short
3 - (x,y,z)
us - unsigned short
4 - (x,y,z,w) glVertex2f( x, y )
i - int
ui - unsigned int
f - float
d - double
Constantes
• Usos
– Activar o desactivar ciertas propiedades de
dibujado o switches
– Dar ciertos valores a parámetros de funciones que
configuran algún elemento
• Todos van con mayúsculas empezando con GL
y generalmente tienen _ cuando presentan
espacios, ya que sus nombres son muy
descriptivos acerca de para que sirven
Constantes
• Ej.
– GL_LIGHTING
– GL_COLOR_BUFFER_BIT
– GL_LINES

• También las encontramos en GLUT


Ej.
– GLUT_LEFT_BUTTON
Primitivas Geométricas
Todas las primitivas geométricas son especificadas
por vértices

GL_LINES
GL_POINTS GL_POLYGON
GL_LINE_STRIP GL_LINE_LOOP

GL_TRIANGLES

GL_QUADS GL_QUAD_STRIP
GL_TRIANGLE_FAN
Vértices

glVertex3fv( v )

Number of Data Type Vector


components b - byte omit “v” for
ub - unsigned byte
2 - (x,y) scalar form
s - short
3 - (x,y,z)
us - unsigned short
4 - (x,y,z,w) glVertex2f( x, y )
i - int
ui - unsigned int
f - float
d - double

32
Especificando Primitivas Geométricas
• Las primitivas son especificadas con
glBegin( primType );
glEnd();
– primType determina como los vértices son
combinados
GLfloat red, green, blue;
Glfloat coords[3];
glBegin( primType );
for ( i = 0; i < nVerts; ++i ) {
glColor3f( red, green, blue );
glVertex3fv( coords );
}
glEnd();
33
Ejemplo
void drawRhombus( GLfloat color[] )
{
glBegin( GL_QUADS );
glColor3fv( color );
glVertex2f( 0.0, 0.0 );
glVertex2f( 1.0, 0.0 );
glVertex2f( 1.5, 1.118 );
glVertex2f( 0.5, 1.118 );
glEnd();
}
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.
Registro de callbacks (cont.)
• 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.)
• 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_LEFT GLUT_KEY_PAGE_UP GLUT_KEY_F1
GLUT_KEY_RIGHT GLUT_KEY_PAGE_DOWN …
GLUT_KEY_UP GLUT_KEY_HOME GLUT_KEY_F12
GLUT_KEY_DOWN GLUT_KEY_INSERT GLUT_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
¿Qué más necesito?
• Conocer elementos de computación gráfica
• Buen nivel de programación básica en C
• Conocer qué es lo que está haciendo por
dentro el CPU para dar mayor rendimiento o
por lo menos tener nociones
• Manejo de estructuras de datos en un buen
nivel
• Ingenio, dedicación y desarrollos de proyectos
personales, tiempo
Comportamiento de una aplicación gráfica
Inicialización Variables Usuario

Variables de Objetos Variables Ambiente

Ejecución de acciones Salida a Usuario

Termina

Liberar Recursos