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

Preview:

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.