View
78
Download
0
Category
Preview:
Citation preview
OpenGL
Qué es OpenGL
• Interface software entre el programador y el hardware gráfico
• Basada en la librería gráfica Iris GL de Silicon Graphics
• Permite crear aplicaciones 3D interactivas
• Independiente del hardware
• No incluye manejo de ventanas, ni interacción con el usuario
• No permite describir objetos 3D directamente
Un poco de historia
• IrisGL fue la primera API para estaciones gráficas SGI:– hardware optimizado para la visualización de gráficos
• OpenGL es el resultado de trasladar IrisGL a otras máquinas:– ofrecer la misma potencia que IrisGL
– ser un lenguaje más abierto (open)
– permitir fácil adaptación a otras plataformas y sistemas operativos
– se presentó el 1 de Julio de 1992
• Microsoft confirmó que la añadiría a su Windows NT
• Existe una plataforma para la revisión de la arquitectura OpenGL, compuesta por varios fabricantes.
• Está pensada para funcionar en sistemas con aceleración hardware.
Orden de las operaciones en OpenGL
• Se construyen las primitivas geométricas– puntos, líneas, polígonos, bitmaps, etc.
• Se posicionan en el espacio 3D
• Se selecciona el punto de vista
• Se calcula el color de todos los objetos– según las condiciones de luz
– obtenidas a partir de las texturas
– indicado directamente por el programador
• Se genera la imagen de pixels– cálculo de visibilidad si necesario
Librerías relacionadas con OpenGL
• Los comandos de OpenGL son muy básicos
• Lo normal es construir nuestra propia librería sobre OpenGL– para el manejo de las ventanas
– para la interacción con el usuario
– para trabajar a más alto nivel (definiendo objetos y métodos más generales)
• OpenGL Utility Library (GLU)– rutinas de más alto nivel (proyecciones, teselación, rendering de superficies)
• OpenGL Auxiliary Library (AUX)– manejo de ventanas, manejo de eventos, objetos 3D.
• OpenInventor– toolkit orientado a objeto para crear aplicaciones 3D interactivas
Otras herramientas
• Sobre OpenGL pueden desarrollarse herramientas más complejas
Aplicaciones
OpenGL con la librería GLUT
OpenGL: una API, no un lenguaje
• OpenGL no es un lenguaje de programación
• Sigue la convención de llamadas a C
• OpenGL se divide en tres librerías distintas:– Librería auxiliar AUX (glaux): independiente de la plataforma
– Librería específica OpenGL (gl)– Librería de utilidades (glu): dibujo de esferas, discos, cilindros, etc.
• OpenGL define sus propios tipos de datos– GLbyte entero de 8 bits
– GLushort entero de 16 bits sin signo
– GLint entero de 32 bits
– GLdouble real de 64 bits
Sintaxis de los comandos OpenGL
• Todas las funciones comienzan por ‘gl’
• Todas las constantes empiezan por ‘GL’
• Algunas funciones acaban con un sufijo (‘3f’, ‘2d’, etc.):– El número indica el número de parámetros
• Punto en 2D: glVertex2f (x, y);
• Punto en 3D: glVertex3f (x, y, z);
– La letra indica el tipo de los parámetros • (i: long integer; f: float; d: double; ub: unsigned char; etc.)
• Algunos comandos acaban en ‘v’:– en lugar de pasar los valores individuales, se pasa un vector
• valores individuales: glColor3f (1, 1, 1);
• usando un vector float vectorcol[] = {1, 1, 1}glColor3fv (vectorcol);
La librería AUX
• Fue creada para facilitar el aprendizaje de OpenGL
• Evita los detalles del entorno particular (Windows, Unix)– creación y manejo de las ventanas
– interacción con el usuario
• No sirve para diseñar la interfaz final de la aplicación
• Hace uso de la API nativa del entorno
• OpenGL no maneja ventanas ni gestiona eventos
La librería GLUT
• Fue creada como ampliación de la librería AUX
• Se le añadieron más prestaciones como:– Creación de menús desplegables
– Administración de varias ventanas
– Manejo de joystick y otros dispositivos de E/S
• Sigue siendo multi-plataforma (Unix, Linux, Mac-OS, Windows)
• La gran ventaja es que permite olvidarse de la programación GUI básica de una plataforma específica, y centrarse exclusivamente en OpenGL
• No viene incluida en la distribución oficial. Hay que descargarla aparte.
#include <GL/glut.h>
void DibujaEscena(){
glClearColor (0., 0., 1., 1.); // color de borrarglClear(GL_COLOR_BUFFER_BIT); // borramos pantallaglFlush(); // forzamos el dibujo
}
int main(){
// Funciones GLUT para inicializar la ventanaglutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA);glutInitWindowSize (250, 250); glutCreateWindow (“Mi primer programa OpenGL");
// Indicamos la función para el evento ‘Paint’glutDisplayFunc (DibujaEscena);
// Lanzamos el bucle indefinido de eventosglutMainLoop();
}
Primer ejemplo en OpenGL + GLUT
void DibujaEscena(){
// Pone el color de fondo a azulglClearColor(0.0, 0.0, 1.0, 1.0);
// Borra la ventanaglClear(GL_COLOR_BUFFER_BIT);
// Pone el color de pintar a rojoglColor3f(1.0, 0.0, 0.0);
// Dibuja un rectángulo sólidoglRectf (-0.1,-0.1, 0.1, 0.1);
glFlush();}
x
y
Dibujando formas
Ventana y volumen de trabajo
(-0.1,-0.1,0)
(1,1,-1)
x
y
z
(0.1,0.1,0)(-1,1,1)
• En OpenGL siempre se pinta en 3D
• Por defecto glut define un volumen de trabajo entre -1 y 1 en las tres dimensiones
Escalado de la ventana
void EscalaVentana(GLsizei w, GLsizei h){ .... }
void DibujaEscena(){ .... }
void main(){
// Funciones GLUT para inicializar la ventanaglutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA);glutCreateWindow (“Mi primer programa OpenGL");
// Indicamos la función para el evento ‘Paint’glutDisplayFunc (DibujaEscena);
// Indicamos la función para el evento ‘Resize’glutReshapeFunc (EscalaVentana)
// Lanzamos el bucle indefinido de eventosglutMainLoop();
}
void EscalaVentana(GLsizei w, GLsizei h){
// Evita una división por ceroif (h == 0) h = 1;
// Ajusta la vista a las dimensiones de la ventanaglViewport(0, 0, w, h);
// Reinicia el sistema de coordenadasglMatrixMode (GL_PROJECTION);glLoadIdentity();
// Establece el volumen de trabajoglOrtho(0.0f, 250.0f, 0.0f, 250.0f, -1.0, 1.0);
glFlush();}
Definición de la vista
• Indica la posición y resolución de la foto final (pixels)
glViewport(GLint x, GLint y, GLsizei ancho, GLsize alto);
250 250250
250
glViewport(0,0,250,250) glViewport(125,125,125,125)
glViewport(0,0,500,250)
Definición del volumen de trabajo
(0,0,0)
(250,250,-1)
x
y
z
glLoadIdentity();glOrtho(GLdouble izquierda, GLdouble derecha, GLdouble abajo,
GLdouble arriba, GLdouble detrás, GLdouble delante);
glOrtho(0,250,0,250,-1,1)
(0,250,1)
(250,0,-1)
Animación con OpenGL y GLUT
void DibujaEscena(){ .... }
void MueveCuadrado(){
// Dibujar el cuadrado en su nueva posición...glutPostRedisplay();
}
void main(){
// Funciones AUX para inicializar la ventana...// Indica la función a llamar cuando se escale la ventanaglutIdleFunc(MueveCuadrado);
// Indica la función que redibuja la ventanaglutMainLoop();
}
Buffer doble
• Permite dibujar fuera de la pantalla– las escenas complejas nunca se verán de forma parcial
– las animaciones no producen saltos
void DibujaEscena(){
// Dibujamos la escena....glutSwapBuffers();
}
void main(){
// Funciones AUX para inicializar la ventanaglutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);...
glutMainLoop();}
Objetos 3D
• La librería GLUT incluye una docena de objetos 3D
• Por ahora sólo podemos ver su proyección paralela
glutWireTeapot(50.0f) glutSolidTeapot(50.0f)
Recommended