Está en la página 1de 22

OpenGL

Qu es OpenGL
Interface software entre el programador y el hardware grfico
Basada en la librera grfica Iris GL de Silicon Graphics
Permite crear aplicaciones 3D interactivas
Independiente del hardware
No incluye manejo de ventanas, ni interaccin con el usuario
No permite describir objetos 3D directamente
Un poco de historia
IrisGL fue la primera API para estaciones grficas SGI:
hardware optimizado para la visualizacin de grficos
OpenGL es el resultado de trasladar IrisGL a otras mquinas:
ofrecer la misma potencia que IrisGL
ser un lenguaje ms abierto (open)
permitir fcil adaptacin a otras plataformas y sistemas operativos
se present el 1 de J ulio de 1992
Microsoft confirm que la aadira a su Windows NT
Existe una plataforma para la revisin de la arquitectura OpenGL,
compuesta por varios fabricantes.
Est pensada para funcionar en sistemas con aceleracin hardware.
Orden de las operaciones en OpenGL
Se construyen las primitivas geomtricas
puntos, lneas, polgonos, bitmaps, etc.
Se posicionan en el espacio 3D
Se selecciona el punto de vista
Se calcula el color de todos los objetos
segn las condiciones de luz
obtenidas a partir de las texturas
indicado directamente por el programador
Se genera la imagen de pixels
clculo de visibilidad si necesario
Libreras relacionadas con OpenGL
Los comandos de OpenGL son muy bsicos
Lo normal es construir nuestra propia librera sobre OpenGL
para el manejo de las ventanas
para la interaccin con el usuario
para trabajar a ms alto nivel (definiendo objetos y mtodos ms generales)
OpenGL Utility Library (GLU)
rutinas de ms alto nivel (proyecciones, teselacin, 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 ms
complejas
Aplicaciones
OpenGL con la librera GLUT
OpenGL: una API, no un lenguaje
OpenGL no es un lenguaje de programacin
Sigue la convencin de llamadas a C
OpenGL se divide en tres libreras distintas:
Librera auxiliar AUX (glaux): independiente de la plataforma
Librera especfica OpenGL (gl)
Librera de utilidades (glu): dibujo de esferas, discos, cilindros, etc.
OpenGL define sus propios tipos de datos
GLbyt e entero de 8 bits
GLushor t entero de 16 bits sin signo
GLi nt entero de 32 bits
GLdoubl e 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 nmero indica el nmero de parmetros
Punto en 2D: glVertex2f ( x, y) ;
Punto en 3D: glVertex3f ( x, y, z) ;
La letra indica el tipo de los parmetros
(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 f l oat vect or col [ ] = {1, 1, 1}
glColor3fv ( vect or col ) ;
La librera AUX
Fue creada para facilitar el aprendizaje de OpenGL
Evita los detalles del entorno particular (Windows, Unix)
creacin y manejo de las ventanas
interaccin con el usuario
No sirve para disear la interfaz final de la aplicacin
Hace uso de la API nativa del entorno
OpenGL no maneja ventanas ni gestiona eventos
La librera GLUT
Fue creada como ampliacin de la librera AUX
Se le aadieron ms prestaciones como:
Creacin de mens desplegables
Administracin 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 programacin GUI bsica
de una plataforma especfica, y centrarse exclusivamente en OpenGL
No viene incluida en la distribucin oficial. Hay que descargarla aparte.
#i ncl ude <GL/ gl ut . h>
voi d DibujaEscena( )
{
glClearColor ( 0. , 0. , 1. , 1. ) ; / / col or de bor r ar
glClear( GL_COLOR_BUFFER_BIT) ; / / bor r amos pant al l a
glFlush( ) ; / / f or zamos el di buj o
}
i nt main( )
{
/ / Funci ones GLUT par a i ni ci al i zar l a vent ana
glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGBA) ;
glutInitWindowSize ( 250, 250) ;
glutCreateWindow ( Mi pr i mer pr ogr ama OpenGL" ) ;
/ / I ndi camos l a f unci n par a el event o Pai nt
glutDisplayFunc ( Di buj aEscena) ;
/ / Lanzamos el bucl e i ndef i ni do de event os
glutMainLoop( ) ;
}
Primer ejemplo en OpenGL + GLUT
voi d DibujaEscena( )
{
/ / Pone el col or de f ondo a azul
glClearColor( 0. 0, 0. 0, 1. 0, 1. 0) ;
/ / Bor r a l a vent ana
glClear( GL_COLOR_BUFFER_BIT) ;
/ / Pone el col or de pi nt ar a r oj o
glColor3f( 1. 0, 0. 0, 0. 0) ;
/ / Di buj a un r ect ngul o sl i do
glRectf ( - 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
voi d EscalaVentana( GLsizei w, GLsizei h)
{ . . . . }
voi d DibujaEscena( )
{ . . . . }
voi d main( )
{
/ / Funci ones GLUT par a i ni ci al i zar l a vent ana
glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGBA) ;
glutCreateWindow ( Mi pr i mer pr ogr ama OpenGL" ) ;
/ / I ndi camos l a f unci n par a el event o Pai nt
glutDisplayFunc ( Di buj aEscena) ;
/ / I ndi camos l a f unci n par a el event o Resi ze
glutReshapeFunc ( Escal aVent ana)
/ / Lanzamos el bucl e i ndef i ni do de event os
glutMainLoop( ) ;
}
voi d EscalaVentana( GLsizei w, GLsizei h)
{
/ / Evi t a una di vi si n por cer o
i f ( h == 0) h = 1;
/ / Aj ust a l a vi st a a l as di mensi ones de l a vent ana
glViewport( 0, 0, w, h) ;
/ / Rei ni ci a el si st ema de coor denadas
glMatrixMode ( GL_PROJECTION) ;
glLoadIdentity( ) ;
/ / Est abl ece el vol umen de t r abaj o
glOrtho( 0. 0f , 250. 0f , 0. 0f , 250. 0f , - 1. 0, 1. 0) ;
glFlush( ) ;
}
Definicin de la vista
Indica la posicin y resolucin de la foto final (pixels)
glViewport( GLint x, GLint y, GLsizei ancho, GLsize al t o) ;
250 250 250
250
glViewport( 0, 0, 250, 250) glViewport( 125, 125, 125, 125)
glViewport( 0, 0, 500, 250)
Definicin del volumen de trabajo
(0,0,0)
(250,250,-1)
x
y
z
glLoadIdentity();
glOrtho( GLdouble i zqui er da, GLdouble der echa, GLdouble abaj o,
GLdouble ar r i ba, GLdouble det r s, GLdouble del ant e) ;
glOrtho( 0, 250, 0, 250, - 1, 1)
(0,250,1)
(250,0,-1)
Animacin con OpenGL y GLUT
voi d DibujaEscena( )
{ . . . . }
voi d MueveCuadrado( )
{
/ / Di buj ar el cuadr ado en su nueva posi ci n
. . .
glutPostRedisplay( ) ;
}
voi d main( )
{
/ / Funci ones AUX par a i ni ci al i zar l a vent ana
. . .
/ / I ndi ca l a f unci n a l l amar cuando se escal e l a vent ana
glutIdleFunc( MueveCuadr ado) ;
/ / I ndi ca l a f unci n que r edi buj a l a vent ana
glutMainLoop( ) ;
}
Buffer doble
Permite dibujar fuera de la pantalla
las escenas complejas nunca se vern de forma parcial
las animaciones no producen saltos
voi d DibujaEscena( )
{
/ / Di buj amos l a escena
. . . .
glutSwapBuffers( ) ;
}
voi d main( )
{
/ / Funci ones AUX par a i ni ci al i zar l a vent ana
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA) ;
...
glutMainLoop( ) ;
}
Objetos 3D
La librera GLUT incluye una docena de objetos 3D
Por ahora slo podemos ver su proyeccin paralela
glutWireTeapot( 50. 0f ) glutSolidTeapot( 50. 0f )

También podría gustarte