intro glut

22
OpenGL

Upload: xmen89

Post on 24-Jun-2015

75 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Intro Glut

OpenGL

Page 2: Intro Glut

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

Page 3: Intro Glut

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.

Page 4: Intro Glut

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

Page 5: Intro Glut

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

Page 6: Intro Glut

Otras herramientas

• Sobre OpenGL pueden desarrollarse herramientas más complejas

Page 7: Intro Glut

Aplicaciones

Page 8: Intro Glut

OpenGL con la librería GLUT

Page 9: Intro 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

Page 10: Intro Glut

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);

Page 11: Intro Glut

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

Page 12: Intro Glut

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.

Page 13: Intro Glut

#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

Page 14: Intro 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

Page 15: Intro Glut

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

Page 16: Intro Glut

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();

}

Page 17: Intro Glut

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();}

Page 18: Intro Glut

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)

Page 19: Intro Glut

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)

Page 20: Intro Glut

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();

}

Page 21: Intro Glut

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();}

Page 22: Intro Glut

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)