Beruflich Dokumente
Kultur Dokumente
Historia
OpenGL
Introduccin a OpenGL
es un estndar sobre grficos por computadora. Hoy da es uno de los estndares grficos ms conocido del mundo. En 1982 naci en la Universidad de Standford el concepto de "graphics machine" y ste fue utilizado por Silicon Graphics Corporation en su propia estacin Silicon IRIS para crear un renderizador. As naci la librera IRIS GL. A raz de esto, en 1992 muchas empresas del hardware y software se pusieron de acuerdo para desarrollar conjuntamente una librera grfica libre: OpenGL. Entre estas empresas destacaban Silicon Graphics Inc., Microsoft, IBM Corporation, Sun Microsystems, Digital Equipment Corporation (DEC), Hewlett-Packard Corporation, Intel e Intergraph Corporation. As nacio OpenGL (Open Graphics Library).
1. Historia
Introduccin a OpenGL
Fue importante para el despegue definitivo de OpenGL la eleccin de John Carmack para realizar el juego Quake con esta API grfica, marcando un precedente innegable, con OpenGL era ms sencillo y eficaz la realizacin de programas 3D (1996). Para elegir entre DirectX (3.0/3.0a) y OpenGL realiz un pequeo ejemplo de Lens Flare (brillo sobre las lentes), con OpenGL escribi unas 30 lneas de cdigo mientras que en DirectX escribi unas 300 lneas de cdigo, adems el efecto era mejor y ms rpido en OpenGL que en DirectX, por tanto su eleccin fue clara.
1. Historia
Introduccin a OpenGL
XBox 360 -> DirectX Wii -> OpenGL Playstation 3 -> OpenGL resto de consolas -> OpenGL
4
Introduccin a OpenGL
Facilidad de uso: En sus comienzos, varios programadores se agarraban la cabeza cuando tenan que trabajar con DirectX, debido a lo complejo de su utilizacin. Con el correr de las versiones, la balanza se fue equilibrando y, hoy en da, a pesar de que sigue un paradigma completamente distinto a OpenGL (inspirado en el modelo COM), ya no es tan complicado de usar. Lenguajes como Visual Basic o Visual Basic Script son un ejemplo de los que trabajan con este modelo. Por el lado de OpenGL, al estar basado en el lenguaje de programacin C, es bastante ms comprensible y puede ser adaptado a cualquier otro lenguaje sin demasiadas complicaciones. La diferencia principal es que DirectX es una API cuya plataforma se basa en lo que el hardware es capaz de realizar, mientras que OpenGL es un tanto ms independiente. A su vez, de su implementacin depende la administracin de los recursos, algo que en DirectX corre por cuenta de la aplicacin. Este detalle permite un desarrollo de software ms sencillo, pero es ms propenso a sufrir los tan temidos errores de programacin (mejor conocidos como bugs). 6
Introduccin a OpenGL
Introduccin a OpenGL
Performance: El rendimiento del software creado por medio de una u otra API sigue siendo un parmetro muy debatido. Dado que DirectX implementa los drivers a nivel del ncleo en el sistema operativo y de nivel usuario con un runtime provisto por Microsoft, existe la necesidad de hacer un cambio entre un modo y otro en las llamadas a la API. Como consecuencia, la CPU utiliza valiosos microsegundos en completar la operacin, quedando inutilizada para otra tarea. En cambio, OpenGL, a travs de una tcnica conocida como marshalling, evita ese inconveniente y obtiene una valiosa ventaja en la performance final. A partir de Windows Vista, DirectX podr sortear esta deficiencia mediante este mismo procedimiento, ya que los drivers estarn funcionando ms a nivel de usuario que del kernel del sistema operativo.
7
Extensibilidad: OpenGL incluye una propiedad que le posibilita extender sus capacidades a travs de un driver, aadiendo nuevas funcionalidades. Pero esto puede conducir a generar una gran cantidad de variantes de la API, provocando cierta confusin entre los programadores. Por el lado de DirectX, Microsoft se encarga de mejorarla pero con menos regularidad. No obstante, desde hace un par de aos que las actualizaciones aparecen cada vez ms seguido. Depende de la empresa conducida por Bill Gates la incorporacin de caractersticas en la API que aprovechen las novedosas funciones de las GPU ms modernas.
Introduccin a OpenGL
Usuarios: La ventaja en el mbito profesional est del lado de OpenGL. Incluso la propia Microsoft admite la superioridad de sta en estos campos. De hecho, muchas de las placas profesionales slo soportan esta API, lo que es un decir. Los films animados por computadora son desarrollados en base a OpenGL, dado su carcter de plataforma de propsitos generales. La situacin cambia cuando lo miramos desde el punto de vista del mercado de los videojuegos. DirectX no requiere de la implementacin completa que demanda OpenGL para funcionar (incluyo funciones no soportadas por el hardware), por lo que se torna ms sencillo de utilizar. Para hacerlo simple, podemos decir que Direct3D es un acceso directo de bajo nivel a los registros disponibles. Adems, posee un mecanismo que determina si una funcionalidad est o no presente en el dispositivo, evitando la implementacin obligatoria y dejando a eleccin del diseador del videojuego su incorporacin en el software. Por este detalle importante es que vemos muchos ms juegos de ordenador programados en DirectX que en OpenGL.
Introduccin a OpenGL
Windows, Linux, Unix, Mac OS, etc. Un compilador de C (C++) Las libreras de OpenGL:
libera bsica librera con utilidades bsicas librera con utilidades avanzadas
Introduccin a OpenGL
los lenguajes Visual Basic y VC#) Para emplear la GLUT, necesitamos glut.h glut.lib, glut32.lib glut.dll, glut32.dll
11
Introduccin a OpenGL
12
Son muy variadas y de diversa aplicacin. Desarrolladas por fabricantes de hardware: permiten utilizar innovaciones introducidas en el hardware grfico manteniendo simplicidad de programacin de OpenGL. Librera bsica de OpenGL casi no vara de una versin a otra: cambia las extensiones que soporta. Tema importante: como incluirlas (existe una librera llamada glew(http://glew.sourceforge.net/) que facilita la carga de extensiones Dependiendo de la extensin hay que crear nuevas constantes, definir puteros nuevas funciones ...
Introduccin a OpenGL
13
Introduccin a OpenGL
OpenGL es un motor grfico en modo inmediato o interpretado: los objetos se envan al motor grfico como rdenes que tienen un efecto inmediato. No hay una estructura completa de la escena Es una mquina de estados: se especifica un estado y todos los objetos que se creen a partir de ese momento tienen en cuenta ese estado, hasta que se cambie Cmo funciona la mquina de estados?
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Activar matriz de vista de modelo Rotar alrededor de Z Fijar color rojo Crear vrtice 1 Crear vrtice 2 Trasladar a (x,y,z) Crear vrtice 3 Fijar color verde Crear vrtice 4 Dibujar // La matriz activa es esta // Se acumula la rotacin en la matriz // Todo lo que se cree ser de color rojo // Crear los vrtices 1 y 2, en color rojo, y // con la rotacin dada // Se acumula la traslacin // Crear vrtice 3, rotado, trasladado y rojo // Ahora todo lo que se cree ser verde // Crear vrtice 4, rotado, trasladado y verde. // Dibujar todos los vrtices creados, cada // uno con su color y transformacin
14
5. Sintaxis de OpenGL
Introduccin a OpenGL
Funciones con prefijo gl Constantes con prefijo GL_ Algunas funciones con sufijo
4.08);
15
6. Tipos de datos
Sufijo b s i Tipos de Datos Entero 8 bits Entero 16 bits Entero 32 bits Definicin en C signed char short int Definicin en OpenGL GLbyte Glshort GLint, GLsizei
Introduccin a OpenGL
f
d ub us ui
Real 32 bits
Real 64 bits Entero positivo 8 bits Entero positivo 16 bits Entero positivo 32 bits
float
double unsigned char unsigned short unsigned long
GLfloat, GLclampf
GLdouble GLubyte. GLboolean GLushort GLuint, GLenum, GLbitfield 16
6. Tipos de Datos
Son equivalentes:
Introduccin a OpenGL
Son equivalentes:
Introduccin a OpenGL
18
8. Primitivas Grficas
Se construyen con:
glBegin(GLenum mode)
Introduccin a OpenGL
glEnd()
Lista de vrtices
Algunas estructuras requieren de un nico par glBegin()-glEnd(), y otras requieren de varios. Podemos encontrar 10 tipos de primitivas en OpenGL
19
8. Primitivas Grficas
Introduccin a OpenGL
Introduccin a OpenGL
glBegin(mode);
glEnd();
21
glPointSize(GLfloat tamao)
Obtener granularidad
Suavizado de puntos
glEnable(GL_POINT_SMOOTH) glDisable(GL_POINT_SMOOTH)
22
Introduccin a OpenGL
width);
factor: es el nmero de veces que un bit se repite pattern: el patrn de 16 bits a dibujar 0x0F0F
0
Binario =
Introduccin a OpenGL
Patrn de Lnea =
Lnea = Un segmento
24
Introduccin a OpenGL
void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels );
25
8. Sistema de coordenadas
Introduccin a OpenGL
El mundo 3D de OpenGL es dextrgiro El observador siempre en el origen, mirando hacia el eje Z negativo
X
Sentido Dextrgiro o positivo
Z
26
9. Matrices
Introduccin a OpenGL
void
9. Matrices
orden de aplicacin de las matrices orden de especificacin de las matrices Introduccin a OpenGL
Vrtice original Matriz ModelView Vrtice transformado Matriz Projection Vrtice proyectado Transformacin Viewport Viewport Vrtice en pantalla
y
x ModelView =
x Projection =
= x
... glViewport (x,y,width,height); ... glMatrixMode (GL_PROJECTION); glFrustum (left,right,bottom,top,near,far); ... glMatrixMode (GL_MODELVIEW); glTranslatef (10, 10, 10); ...
28
9. Matrices Proyeccin
Introduccin a OpenGL
near
far
(x,y)
Y
width (right,top)
Z X
(left,bottom)
29
9. Matrices Proyeccin
Matriz de proyeccin:
void
Introduccin a OpenGL
o proyeccin paralela:
void
glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar );
30
9. Matrices Proyeccin
Introduccin a OpenGL
10);
gluPerpective(45,
ancho/alto, 1, 100);
10);
31
9. Matrices Proyeccin
void
Introduccin a OpenGL
glViewport( GLint x, GLint y, GLsizei width, GLsizei height ); coordenadas de la ventana de visualizacin en pxeles
es <ancho>, [3] es <alto>
viewport);
32
Introduccin a OpenGL
1.0); // eje z
33
10. Buffers
Introduccin a OpenGL
FrameBuffer (doble y triple buffer), almacena los colores de los pxeles Z-Buffer, buffer de profundidades Stencil Buffer, para efectos especiales, mscaras 2D, sombras, reflejos Accumulation Buffer, buffer de mezcla, para mltiples renders o sombras complejas Feedback Buffer, buffer de render en memoria
34
Para optimizar mediante hardware grfico nuestros objetos debemos emplear Display Lists:
void
void
mode
Introduccin a OpenGL
void
GLboolean
Para dibujar una o varias Display List: void glCallList( GLuint list ); void glCallLists( GLsizei n, GLenum type,
*lists );
const GLvoid
35
glBegin(GL_QUADS);
Introduccin a OpenGL
glEnd();
glEndList();
glCallList(
1 );
36
Para emplear texturas necesitamos emplear coordenadas de textura en los vrtices que creemos para modelar nuestros objetos:
Introduccin a OpenGL
void
y
Hola
(0,0)
(1,1)
(1,0)
37
GLuint texture[1];
Introduccin a OpenGL
glGenTextures(1, &texture[0]); // genera los nombre de texturas // Crea la textura desde TextureImage
glBindTexture(GL_TEXTURE_2D, texture[0]); // selecciona esta textura glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); //Filtrado lineal glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
38
Introduccin a OpenGL
// Selecciona la textura
glBindTexture(GL_TEXTURE_2D, texture[0]); glCallList(id); // id es un enero identificador
//activa la textura almacenada en texture[0]
39
13. Iluminacin
Introduccin a OpenGL
GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION, GL_SPOT_CUTOFF, GL_SPOT_DIRECTION, GL_SPOT_EXPONENT, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, and GL_QUADRATIC_ATTENUATION
40
14. Seleccin
Introduccin a OpenGL
void glInitNames( void ) void glPushName( GLuint name ) void glLoadName( GLuint name ) GLint glRenderMode( GLenum mode
41
14. Seleccin
void gluPickMatrix( GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport )
Introduccin a OpenGL
42
15. Varios
Introduccin a OpenGL
43
16. Quadrics
Introduccin a OpenGL
GLUquadricObj *disco; disco = gluNewQuadric(); gluDisk(disco, 0.2, 1.2, gluSphere gluCilynder gluPartialDisk gluCone
32, 32);
Otras cudricas:
44
16.
Quadrics Texturas
Estilo de dibujo:
void gluQuadricDrawStyle(GLUquadric* quad, GLenum draw);
Introduccin a OpenGL
Estilo de normal:
45