opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y...

25
1 OPENGL Desarrollo de Aplicaciones Interactivas ¿Qué es OpenGL? API gráfica Imágenes color de alta calidad compuesta de primitivas geométricas e imágenes Independiente de Sistema de ventanas Sistema operativo

Transcript of opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y...

Page 1: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

1

OPENGL

Desarrollo de Aplicaciones Interactivas

¿Qué es OpenGL?

API gráfica– Imágenes color de alta calidad compuesta de

primitivas geométricas e imágenes– Independiente de

Sistema de ventanasSistema operativo

Page 2: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

2

¿Qué es OpenGL?

Primitivas geométricas– Puntos, líneas y polígonos

Primitivas de imagen– Imágenes y bitmaps– Tubería para imágenes y geometría

Enlace a través de mapeo de texturas

Estado – Colores, materiales, fuentes de luz, etc

Arquitectura

Page 3: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

3

OpenGL y terminología Windows

GDI y Device Contexts (DC)– GDI interfaz gráfico original Windows 2D. Dibuja en pantalla, memoria,

impresora, etc usando contextos de dispositivos, que son los que saben cómo trabajar con el dispositivo.

Rendering Contexts (RC)– Ligados a un DC. En un programa OpenGL juegan el mismo papel que un

DC para un programa GDI.

Pixel Formats– Configuración de color y buffers asociados a un DC o RC. Son la capa de

traducción entre las llamadas OpenGL y las operaciones a realizar.– Funciones Windows OpenGL para manejo de formato de pixeels:

ChoosePixelFormat(), SetPixelFormat(), GetPixelFormat(), yDescribePixelFormat().

APIs relacionadas

AGL, GLX, WGL– Glue entre OpenGL y sistemas de ventanas: X-Windows,

Apple y Windows respectivamente

GLU (OpenGL Utility Library)– Parte de OpenGL– Superficies, curvas, concavidades, etc

GLUT (OpenGL Utility Toolkit)– API portable, no es parte oficial de OpenGL

Page 4: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

4

Estructura básica GLUT

Seleccionar el tipo de ventana para la aplicación

Inicializar el estado OpenGL: color, fondo, luces, texturas

Registrar las rutinas que se van a utilizar para renderizado, cambios de tamaño, eventos, etc

Bucle de procesamiento de eventos

Preliminares

Ficheros cabecera– #include <GL/gl.h> (core)– #include <GL/glu.h> (utility)– #include <GL/glut.h> (toolkit) (en windows basta con incluir

esta, al incluir las dos anteriores)

Librerías– Unix libGL.so; windows opengl32.lib

Tipos enumerados– para la portabilidad. GLfloat, Glint, Glenum, etc

Page 5: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

5

Inicialización

void init( void ){

glClearColor( 0.0, 0.0, 0.0, 1.0 );glClearDepth( 1.0 );glEnable( GL_LIGHT0 );glEnable( GL_LIGHTING );glEnable( GL_DEPTH_TEST );

}

Ejemplo de programa

void main( int argc, char** argv ){

int mode = GLUT_RGB|GLUT_DOUBLE;glutInitDisplayMode( mode );glutCreateWindow( argv[0] );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();

}

Page 6: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

6

Funciones callback

Para cuando algo sucede– Cambiar tamaño, redibujar– Entrada de usuario– Animación

glutDisplayFunc( display );glutIdleFunc( idle );glutKeyboardFunc( keyboard );

glutDisplayFunc( display )

Refresco de pantalla

void display( void ){

glClear( GL_COLOR_BUFFER_BIT );glBegin( GL_TRIANGLE_STRIP );glVertex3fv( v[0] );glVertex3fv( v[1] );glVertex3fv( v[2] );glVertex3fv( v[3] );glEnd();glutSwapBuffers();

}

Page 7: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

7

glutIdleFunc( idle )

Animación y actualización continua

void idle( void ){

t += dt;glutPostRedisplay();

}

glutKeyboardFunc( keyboard );

Procesar entrada de usuario

void keyboard( char key, int x, int y ){

switch( key ) {case ‘q’ : case ‘Q’ :exit( EXIT_SUCCESS );break;case ‘r’ : case ‘R’ :rotate = GL_TRUE;break;

}}

Page 8: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

8

Renderizando elementos

Primitivas geométricas

Gestión del estado OpenGL

Buffers OpenGL

Primitivas geométricas OpenGL

Page 9: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

9

Ejemplo: Dibujar rombo

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

}

Formatos de comando

Page 10: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

10

Especificación de primitivas

UsandoglBegin( primType );glEnd();

primType determina cómo se combinan los vértices

GLfloat red, greed, blue;Glfloat coords[3];glBegin( primType );for ( i = 0; i < nVerts; ++i ) {

glColor3f( red, green, blue );glVertex3fv( coords );

}glEnd();

FORMAS

Máquina de estados OpenGL

Atributos de renderización encapsulados en el estado OpenGL– Estilos de renderización– Iluminación– Mapeo de texturas– Sombreado

Page 11: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

11

Cambiando el estado….

Apariencia controlada por el estado actualpara cada (primitiva a renderizar)

{actualizar estado OpenGLrenderizar

}

Forma más común: Manipular atributos de vértices:– glColor()– glNormal()– glTexCoord()

Ejemplo

Establecer estadoglPointSize( size );glLineStipple( repeat, pattern );glShadeModel( GL_SMOOTH );

HabilitarglEnable( GL_LIGHTING );glDisable( GL_TEXTURE_2D );

Page 12: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

12

Transformaciones

Tipos de transformaciones (afines)

Proyección– Ajustar la lente de la cámara

Vista– Posición del trípode y orientación del volumen de visión

Modelo– Mover el modelo

Viewport– Agrandar o reducir la fotografía física

Page 13: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

13

Sistemas de coordenadas y transformaciones

Pasos para formar una imagen– Especificar geometría (coordenadas “reales”)– Especificar cámara (coordenada de cámara)– Proyectar (coordenadas de ventana)– Mapeo (coordenadas de pantalla)

Cada paso usa transformaciones

Cada transformación es equivalente a cambios en sistemas de coordenadas (frames)

Transformación 3D

Un vértices es un vector 1x4Se usa una matriz de transformación 4 x 4 Se multiplican las matrices

Page 14: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

14

Implementando transformaciones

Dos formas de hacerlo– Especificar matrices (glLoadMatrix, glMultMatrix)– Especificar operación (glRotate, glOrtho)

Se definen las matrices antes de renderizar, ver, situar, orientar (son parte del estado)

– Posición ojo/cámara, geometría 3D

Gestión de matrices– Pila de matrices

Combinar transformaciones

Transformaciones

Page 15: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

15

Proyecciones

PerspectivaProyección ortográfica

Viendo transformaciones

Situar la cámara/ojo en la escena– Situar el trípode

Volar por la escena– Cambiar la transformación de vista y redibujar

gluLookAt( eyex, eyey, eyez,aimx, aimy, aimz,upx, upy, upz)

Page 16: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

16

Modelando transformaciones

MoverglTranslate{fd}( x, y, z )

RotarglRotate{fd}( angle, x, y, z )

EscalarglScale{fd}( x, y, z )

Double Buffering

Page 17: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

17

Animación usando doble buffer

Inicializar el doble bufferglutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );

Limpiar buffer de colorglClear( GL_COLOR_BUFFER_BIT );

Renderizar escena

Intercambiar frente y fondoglutSwapBuffers();

Repetir 2-4 para animación

Depth buffering

if ( pixel->z < depthBuffer(x,y)->z ) {depthBuffer(x,y)->z = pixel->z;colorBuffer(x,y)->color = pixel->color;}

Page 18: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

18

Depth buffering en OpenGL

Iniciar el depth bufferglutInitDisplayMode( GLUT_RGB |GLUT_DOUBLE | GLUT_DEPTH );

ActivarloglEnable( GL_DEPTH_TEST );

LimpiarloglClear( GL_COLOR_BUFFER_BIT

|GL_DEPTH_BUFFER_BIT );RenderizarIntercambiar colores de los buffers

Iluminación: Principios

Simular cómo los objetos reflejan la luz– Composición material del objeto– Color de luz y posición– Parámetros globales de iluminación

Luz ambientalLuz de dos caras

– Paleta indexada y RBGA

Page 19: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

19

Iluminación en OpenGL

Modelo de iluminación Phong– Se calcula en los vértices

Contribuidores a la iluminación– Propiedades de superficie– Propiedades de luz– Propiedades del modelo de iluminación

Propiedades de materiales

glMaterialfv (face, property, value)Materiales separados para frente y fondo

Page 20: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

20

Propiedades de luz

glLightfv( light, property, value );– Light– Múltiples luces, primera with GL_LIGHT0

glGetIntegerv( GL_MAX_LIGHTS, &n );

Propiedades– colores– posición y tipo– atenuación

Propiedades de luz

Color de luz– GL_AMBIENT– GL_DIFFUSE– GL_SPECULAR

Tipos de luz (situada en posición w)– Puntual (Point) (x/w y/w z/w)– Infinita (Directional) (x y z)

Encender las luces– Cada foco: glEnable(GL_LIGHTn);– Global: glEnable(GL_LIGHTING);

Iluminación y materiales

Page 21: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

21

Otros aspectos de iluminación

Posición de la luz– Sistemas de coordenadas (ojo, mundo, modelo)

Atenuación de la luz– GL_CONSTANT_ATTENUATION– GL_LINEAR_ATTENUATION– GL_QUADRATIC_ATTENUATION

Puntos de luz– GL_SPOT_DIRECTION– GL_SPOT_CUTOFF– GL_SPOT_EXPONENT

Propiedades del modelo de iluminación

glLightModelfv( property, value );Luz de doble caraGL_LIGHT_MODEL_TWO_SIDE

Color ambiente globalGL_LIGHT_MODEL_AMBIENT

Modelo localGL_LIGHT_MODEL_LOCAL_VIEWER

Color especularGL_LIGHT_MODEL_COLOR_CONTROL

Page 22: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

22

Primitivas de imagen y bitmaps

Primitivas basadas en píxels

Bitmaps– Array 2D de máscaras de bits para píxeles;

Imágenes– Array 2D de información de colores de píxeles

OpenGL no entiende formatos de imagen

Page 23: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

23

Algunas primitivas

Posicionamiento (respecto del viewport)

– glRasterPos3f( x, y, z )

Generación– glBitmap( width, height,

xorig, yorig, xmove,ymove, bitmap )

Fuentes como bitmaps

Cada carácter se almacena como un bitmap

Existen rutinas específicas del sistema de ventanas para acceder a las fuentes del sistema– glXUseXFont()– wglUseFontBitmaps()

Page 24: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

24

Generando imágenes

glDrawPixels( width, height, format, type,pixels)

Pone el píxel inferior izquierdo en la posición actual

Muchas formas de almacenamiento en memoria (formatos y tipos de datos)

– Formatos: rgb, intensity, depth, stencil– Tipo: GL_FLOAT, GL_INT,GL_UNSIGNED_SHORT

Manejando píxeles

glReadPixels( x, y, width, height, format, type, pixels )

– A partir de la posición X,Y– Conversión automática al formato y tipo

Copia de píxeles– glCopyPixels( x, y, width, height, type )

Zoom de píxeles– glPixelZoom(x,y)

Page 25: opengl - UMdis.um.es/~jfernand/0506/dai/opengl.pdf · 3 OpenGL y terminología Windows zGDI y Device Contexts (DC) – GDI interfaz gráfico original Windows 2D. Dibuja en pantalla,

25

Otros aspectos de OpenGL

Texturas– Simulación de materiales– Reducir complejidad geométrica– Reflexiones– Operaciones sobre imágenes

Listas de visualización y arrays de vérticesCanal alfaAntialiasing…….

Cómo instalar las bibliotecas de funciones OpenGl , glaux y Glut.

Se pueden obtener en http://www.opengl.org.

Los ficheros necesarios son: – Ficheros de cabecera: gl.h, glut.h, glu.h y glaux.h– Bibliotecas estáticas: opengl32.lib, glu32.lib, glut.lib y glaux.lib– Bibliotecas dinámicas: opengl32.dll, glu32.dll, glut32.dll

Copiar los ficheros de cabecera en el directorio include/gl de Borland Builder C++. Copiar las bibliotecas estáticas en Lib, y las bibliotecas dinámicas en C:/windows/system.