Upload
others
View
23
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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();
}
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();
}
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;
}}
8
Renderizando elementos
Primitivas geométricas
Gestión del estado OpenGL
Buffers OpenGL
Primitivas geométricas OpenGL
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
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
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 );
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
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
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
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)
16
Modelando transformaciones
MoverglTranslate{fd}( x, y, z )
RotarglRotate{fd}( angle, x, y, z )
EscalarglScale{fd}( x, y, z )
Double Buffering
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;}
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
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
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
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
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
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()
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)
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.