Sie sind auf Seite 1von 46

1.

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

Efecto de Lens Flare

Introduccin a OpenGL

2. Uso del OpenGL



Introduccin a OpenGL

DirectX -> Windows OpenGL -> Windows, Linux, Mac (unix)

Drivers optimizado para el hardware

XBox 360 -> DirectX Wii -> OpenGL Playstation 3 -> OpenGL resto de consolas -> OpenGL
4

2. Uso del OpenGL

Portabilidad: Si nos guiamos por la portabilidad,


DirectX difcilmente supere a OpenGL, dada su gran dependencia con Windows y sus componentes. Fuera de este sistema operativo, solamente se encuentra implementada en la consola Xbox. En cambio, OpenGL es compatible no slo con Windows, sino que se utiliza en sistemas Unix, Linux, Mac y hasta en consolas como PlayStation 3 y Nintendo Wii. En resumen: exceptuando Windows y Xbox, todos los sistemas que proveen soporte para aceleracin 3D han escogido a OpenGL para esa tarea. Por algo ser, no?.

Introduccin a OpenGL

2. Uso del 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

2. Uso del 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

2. Uso del OpenGL

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

2. Uso del 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

3. Requisitos para programar con OpenGL



Introduccin a OpenGL

Windows, Linux, Unix, Mac OS, etc. Un compilador de C (C++) Las libreras de OpenGL:

gl.h glu.h glut.h

(para hacer mens y manejar el API de Windows)


10

libera bsica librera con utilidades bsicas librera con utilidades avanzadas

3. Requisitos para programar con OpenGL

Para emplear OpenGL con Visual Studio .NET 2002, necesitamos:

Introduccin a OpenGL

Instalar el compilador completo (se pueden omitir

los lenguajes Visual Basic y VC#) Para emplear la GLUT, necesitamos glut.h glut.lib, glut32.lib glut.dll, glut32.dll

11

3. Requisitos para programar con OpenGL

Direcciones web importantes:

Introduccin a OpenGL

www.opengl.org nehe.gamedev.net www.gamedev.net glew.sourceforge.net

12

4. Funcionalidad Extra Extensiones

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

OpenGL como mquina de estados

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

Nmero y tipo de parmetros


glColor3f(1.23, 2.12, glVertex3i(1, 1, 1);

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

glVertex2i(1, 3); glVertex2f(1.0, 3.0); glColor3f (1.0, 1.0, 1.0);

Son equivalentes:

float color_array[] = {1.0, 1.0, 1.0}; glColor3fv (color_array);


17

7. Ejemplo de programa OpenGL


main () {
AbrirVentana(); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); glBegin(GL_POLYGON); glVertex2f (-0.5, -0.5); glVertex2f (-0.5, 0.5); glVertex2f ( 0.5, 0.5); glVertex2f ( 0.5, -0.5); glEnd(); glFlush();

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

Las primitivas grficas (valores de mode) son:


GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_TRIANGLES GL_TRIANGLE_TRIP GL_QUADS GL_QUAD_STRIP GL_POLYGON
20

Introduccin a OpenGL

8. Primitivas Grficas Ejemplos

Introduccin a OpenGL

glBegin(mode);

glVertex3f(x0,y0,z0); glVertex3f(x1,y1,z1); glVertex3f(x2,y2,z2); glVertex3f(x3,y3,z3);

glEnd();
21

8. Primitivas Grficas Puntos

Modificar el tamao de los puntos:

Obtener el rango de tamaos vlidos


Introduccin a OpenGL

glPointSize(GLfloat tamao)

Obtener granularidad

glGetFloatv(GL_POINT_SIZE_RANGE, dimension) glGetFloatv(GL_POINT_SIZE_GRANULARITY, &salto)

Suavizado de puntos

para activarlo: para desactivarlo:

glEnable(GL_POINT_SMOOTH) glDisable(GL_POINT_SMOOTH)

22

8. Primitivas Grficas Lneas

Introduccin a OpenGL

Grosor de la lnea void glLineWidth(GLfloat Patrn de lnea


void

width);

glLineStipple(GLint factor, GLushort pattern);

factor: es el nmero de veces que un bit se repite pattern: el patrn de 16 bits a dibujar 0x0F0F

Es necesario activarlo/desactivarlo glEnable(GL_LINE_STIPPLE); glDisable(GL_LINE_STIPPLE);


23

8. Primitivas Grficas Lneas

0
Binario =

Introduccin a OpenGL

0000 0000 1111 1111

Patrn de Lnea =

Lnea = Un segmento

24

8. Primitivas Grficas Polgonos

void glPolygonStipple( const GLubyte *mask );

mask es una matriz de 32x32

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

En principio tenemos tres grupos de matrices en OpenGL

Introduccin a OpenGL

void

glMatrixMode( GLenum mode );

Donde mode toma los valores:

GL_PROJECTION GL_MODELVIEW (Modelo de Cmara) GL_TEXTURE


27

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

Para empezar a dibujar en OpenGL tenemos que especificar:

Introduccin a OpenGL

Puerto de vista (viewport) Volumen de visualizacin (matriz de proyeccin)

near

far

(x,y)

Y
width (right,top)

Z X

(left,bottom)

29

9. Matrices Proyeccin

Matriz de proyeccin:
void

Podemos usar proyeccin perspectiva:


glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar ); void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar );

Introduccin a OpenGL

o proyeccin paralela:
void

glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar );

30

9. Matrices Proyeccin

Ejemplo de cdigo para proyeccin perpectiva:

Introduccin a OpenGL

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-10, 10, -10, 10, -10,


o

10);

gluPerpective(45,

ancho/alto, 1, 100);

Ejemplo de cdigo para proyeccin paralela:

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-10, 10, -10, 10, -10,

10);
31

9. Matrices Proyeccin

Se debe combinar con la vista que queremos establecer:

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>

Para obtener el viewport: // 0] es <x>, [1] es <y>, [2]

GLint viewport[4]; glGetIntegerv(GL_VIEWPORT,

viewport);

32

9. Matrices ModelView y Texturas

Establece las transformaciones que se aplican a cada objeto:

Introduccin a OpenGL

glTranslatef(tx, ty, tz); glRotatef(angulo, 0.0, 0.0, glScale(sx, sy, sz);


glPushMatrix(); glPopMatrix();

1.0); // eje z

Se emplea la pila de matrices para independizar los objetos:

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

11. Display Lists

Para optimizar mediante hardware grfico nuestros objetos debemos emplear Display Lists:

void
void

glNewList(GLuint list, GLenum mode);


puede ser: GL_COMPILE o GL_COMPILE_AND_EXECUTE

mode

Introduccin a OpenGL

glEndList(void); glDeleteLists(GLuint list, GLsizei range);

Para eliminar cualquier lista:

void

Si existe una Display List:

GLboolean

glIsList( GLuint list );

Para dibujar una o varias Display List: void glCallList( GLuint list ); void glCallLists( GLsizei n, GLenum type,
*lists );

const GLvoid

35

11. Display Lists Ejemplo


glNewList(1, GL_COMPILE);

glBegin(GL_QUADS);
Introduccin a OpenGL

glVertex3f(x0,y0,z0); glVertex3f(x1,y1,z1); glVertex3f(x2,y2,z2); glVertex3f(x3,y3,z3);

glEnd();
glEndList();

Para dibujar este Quad debemos usar:

glCallList(

1 );

36

12. Texturas Coordenadas

Para emplear texturas necesitamos emplear coordenadas de textura en los vrtices que creemos para modelar nuestros objetos:

Introduccin a OpenGL

void
y

glTexCoord2f( GLfloat s, GLfloat t );

donde s y t son coordenadas normalizadas de la textura (0,1)


1
(0,0)

Hola
(0,0)

(1,1)

(1,0)

37

12. Texturas Creacin de una textura

Para crear las texturas necesitamos:


// vector para almacenar las texturas

GLuint texture[1];

// cargar la textura desde un fichero en TextureImage

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

12. Texturas Uso de las texturas

Para usar las texturas necesitamos:

// Habilita el uso de texturas glEnable(GL_TEXTURE_2D);

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]

del objeto a pintar en una Display List

// o en su lugar podemos poner un glBegin()-glEnd()

39

13. Iluminacin

Para usar las luces necesitamos:

// Habilita el uso de la iluminacin glEnable(GL_LIGHTHING);

Introduccin a OpenGL

// Habilitar las luces glEnable(GL_LIGHTi); // con 0 i < GL_MAX_LIGHTS


// y definir correctamente las luces void glLightf( GLenum light, GLenum pname, GLfloat param ) // o void glLighti( GLenum light, GLenum pname, GLint param )
Donde pname puede ser:

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

Para seleccionar emplearemos la pila de nombres que tiene OpenGL:

Introduccin a OpenGL

void glInitNames( void ) void glPushName( GLuint name ) void glLoadName( GLuint name ) GLint glRenderMode( GLenum mode

admite tres valores GL_RENDER, GL_SELECT, y GL_FEEDBACK

41

14. Seleccin

void gluPickMatrix( GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport )

Introduccin a OpenGL

Ejemplo la funcin Pick3d de la clase TScene

42

15. Varios

Usando glEnable, glDisable tenemos:

GL_CULL_FACE (elimina caras invisibles) GL_CLIP_PLANE (plano de recortado)


void
glClipPlane (GLenum plane , const GLdouble *equation )

Introduccin a OpenGL

GL_NORMALIZE (normaliza las normales) GL_BLEND (transparencia)


void
glBlendFunc ( GLenum sfactor , GLenum dfactor );

GL_DEPTH_TEST (usa o no el z-buffer) GL_STENCIL_TEST (usa o no el stencil buffer)

43

16. Quadrics

Para crear cudricas (esferas, discos, etc):

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

Para activar las coordenadas de textura:

void gluQuadricTexture (GLUquadric* quad, GLboolean texture);

Estilo de dibujo:
void gluQuadricDrawStyle(GLUquadric* quad, GLenum draw);

Introduccin a OpenGL

Con los valores

de GLU_FILL,GLU_LINE, GLU_SILHOUETTE, y GLU_POINT, como valor de draw

Estilo de normal:

void gluQuadricNormals(GLUquadric* quad, GLenum normal);


Con los valores de GLU_NONE, GLU_FLAT, and GLU_SMOOTH, como valor de normal

45

Das könnte Ihnen auch gefallen