1. Historia
 OpenGL

Introducción a OpenGL

es un estándar sobre gráficos por computadora. Hoy día es uno de los estándares gráficos más 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 estación Silicon IRIS para crear un renderizador. Así nació la librería IRIS GL.  A raíz de esto, en 1992 muchas empresas del hardware y software se pusieron de acuerdo para desarrollar conjuntamente una librería gráfica 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

1. Historia

Introducción a OpenGL

Fue importante para el despegue definitivo de OpenGL la elección de John Carmack para realizar el juego Quake con esta API gráfica, marcando un precedente innegable, con OpenGL era más sencillo y eficaz la realización de programas 3D (1996). Para elegir entre DirectX (3.0/3.0a) y OpenGL realizó un pequeño ejemplo de Lens Flare (brillo sobre las lentes), con OpenGL escribió unas 30 líneas de código mientras que en DirectX escribió unas 300 líneas de código, además el efecto era mejor y más rápido en OpenGL que en DirectX, por tanto su elección fue clara.

2

1. Historia

Efecto de Lens Flare

Introducción a OpenGL

3

2. Linux. Mac (unix) • Drivers optimizado para el hardware     XBox 360 -> DirectX Wii -> OpenGL Playstation 3 -> OpenGL resto de consolas -> OpenGL 4 . Uso del OpenGL   Introducción a OpenGL DirectX -> Windows OpenGL -> Windows.

todos los sistemas que proveen soporte para aceleración 3D han escogido a OpenGL para esa tarea. Por algo será. OpenGL es compatible no sólo con Windows.2. Introducción a OpenGL 5 . dada su gran dependencia con Windows y sus componentes. Fuera de este sistema operativo. En resumen: exceptuando Windows y Xbox. Linux. sino que se utiliza en sistemas Unix. Mac y hasta en consolas como PlayStation 3 y Nintendo Wii. solamente se encuentra implementada en la consola Xbox. En cambio. DirectX difícilmente supere a OpenGL. ¿no?. Uso del OpenGL  Portabilidad: Si nos guiamos por la portabilidad.

Por el lado de OpenGL. Uso del OpenGL  Facilidad de uso: En sus comienzos. La diferencia principal es que DirectX es una API cuya plataforma se basa en lo que el hardware es capaz de realizar. Este detalle permite un desarrollo de software más sencillo. a pesar de que sigue un paradigma completamente distinto a OpenGL (inspirado en el modelo COM). es bastante más comprensible y puede ser adaptado a cualquier otro lenguaje sin demasiadas complicaciones. algo que en DirectX corre por cuenta de la aplicación. pero es más propenso a sufrir los tan temidos errores de programación (mejor conocidos como bugs).2. debido a lo complejo de su utilización. 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. varios programadores se agarraban la cabeza cuando tenían que trabajar con DirectX. Con el correr de las versiones. A su vez. la balanza se fue equilibrando y. mientras que OpenGL es un tanto más independiente. al estar basado en el lenguaje de programación C. de su implementación depende la administración de los recursos. hoy en día. 6 Introducción a OpenGL .

quedando inutilizada para otra tarea.2. OpenGL. 7 . existe la necesidad de hacer un cambio entre un modo y otro en las llamadas a la API. DirectX podrá sortear esta deficiencia mediante este mismo procedimiento. evita ese inconveniente y obtiene una valiosa ventaja en la performance final. ya que los drivers estarán funcionando más a nivel de usuario que del kernel del sistema operativo. la CPU utiliza valiosos microsegundos en completar la operación. a través de una técnica conocida como marshalling. En cambio. Dado que DirectX implementa los drivers a nivel del núcleo en el sistema operativo y de nivel usuario con un runtime provisto por Microsoft. Como consecuencia. Uso del OpenGL  Introducción a OpenGL Performance: El rendimiento del software creado por medio de una u otra API sigue siendo un parámetro muy debatido. A partir de Windows Vista.

No obstante. Uso del OpenGL  Extensibilidad: OpenGL incluye una propiedad que le posibilita extender sus capacidades a través de un driver. Introducción a OpenGL 8 . Por el lado de DirectX. desde hace un par de años que las actualizaciones aparecen cada vez más seguido.2. Pero esto puede conducir a generar una gran cantidad de variantes de la API. provocando cierta confusión entre los programadores. añadiendo nuevas funcionalidades. Depende de la empresa conducida por Bill Gates la incorporación de características en la API que aprovechen las novedosas funciones de las GPU más modernas. Microsoft se encarga de mejorarla pero con menos regularidad.

posee un mecanismo que determina si una funcionalidad está o no presente en el dispositivo. muchas de las placas profesionales sólo soportan esta API. De hecho. Para hacerlo simple. dado su carácter de plataforma de propósitos generales.2. evitando la implementación obligatoria y dejando a elección del diseñador del videojuego su incorporación en el software. Uso del OpenGL  Usuarios: La ventaja en el ámbito profesional está del lado de OpenGL. podemos decir que Direct3D es un acceso directo de bajo nivel a los registros disponibles. por lo que se torna más sencillo de utilizar. Por este detalle importante es que vemos muchos más juegos de ordenador programados en DirectX que en OpenGL. Los films animados por computadora son desarrollados en base a OpenGL. La situación cambia cuando lo miramos desde el punto de vista del mercado de los videojuegos. DirectX no requiere de la implementación completa que demanda OpenGL para funcionar (incluyo funciones no soportadas por el hardware). Incluso la propia Microsoft admite la superioridad de ésta en estos campos. lo que es un decir. Introducción a OpenGL 9 . Además.

h • glu.h • (para hacer menús y manejar el API de Windows) 10 libería básica librería con utilidades básicas librería con utilidades avanzadas . Un compilador de C (C++) Las librerías de OpenGL: • gl. Mac OS.3. Unix. Linux. Requisitos para programar con OpenGL   Introducción a OpenGL  Windows. etc.h • glut.

lib.3. glut32.lib • glut.dll 11 .NET 2002. necesitamos: Introducción a OpenGL • Instalar el compilador completo (se pueden omitir • los lenguajes Visual Basic y VC#) Para emplear la GLUT. glut32.h • glut.dll. necesitamos • glut. Requisitos para programar con OpenGL  Para emplear OpenGL con Visual Studio .

3.gamedev.org • nehe.net • glew.net 12 .opengl. Requisitos para programar con OpenGL  Direcciones web importantes: Introducción a OpenGL • www.sourceforge.net • www.gamedev.

.sourceforge.net/) que facilita la carga de extensiones Dependiendo de la extensión hay que crear nuevas constantes. Desarrolladas por fabricantes de hardware: permiten utilizar innovaciones introducidas en el hardware gráfico manteniendo simplicidad de programación de OpenGL.4. Tema importante: como incluirlas (existe una librería llamada glew(http://glew. Librería básica de OpenGL casi no varía de una versión a otra: cambia las extensiones que soporta. definir puteros nuevas funciones . Introducción a OpenGL 13 . Funcionalidad Extra Extensiones      Son muy variadas y de diversa aplicación..

z) Crear vértice 3 Fijar color verde Crear vértice 4 Dibujar // La matriz activa es esta // Se acumula la rotación en la matriz // Todo lo que se cree será de color rojo // Crear los vértices 1 y 2. 4. 9. hasta que se cambie ¿Cómo funciona la máquina de estados? 1. 5. rotado. cada // uno con su color y transformación 14 . trasladado y rojo // Ahora todo lo que se cree será verde // Crear vértice 4. en color rojo. rotado. 2. y // con la rotación dada // Se acumula la traslación // Crear vértice 3. // Dibujar todos los vértices creados. 8. No hay una estructura completa de la escena Es una máquina de estados: se especifica un estado y todos los objetos que se creen a partir de ese momento tienen en cuenta ese estado.y. trasladado y verde…. 6. 3. Activar matriz de vista de modelo Rotar  alrededor de Z Fijar color rojo Crear vértice 1 Crear vértice 2 Trasladar a (x. 7.OpenGL como máquina de estados   Introducción a OpenGL  OpenGL es un motor gráfico en modo inmediato o interpretado: los objetos se envían al motor gráfico como órdenes que tienen un efecto inmediato. 10.

15 .23. 4. 2.12. •glVertex3i(1.08). 1). 1. Sintaxis de OpenGL  Introducción a OpenGL   Funciones con prefijo gl Constantes con prefijo GL_ Algunas funciones con sufijo • Número y tipo de parámetros •glColor3f(1.5.

6. GLboolean GLushort GLuint. GLbitfield 16 . GLsizei Introducción 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. Tipos de datos Sufijo b s i Tipos de Datos Entero 8 bits Entero 16 bits Entero 32 bits Definición en C signed char short int Definición en OpenGL GLbyte Glshort GLint. GLclampf GLdouble GLubyte. GLenum.

1.0.0. • glVertex2f(1. 1.0}.0. 1. 3).0.0). • glColor3f (1.0).6.0. Tipos de Datos  Son equivalentes: Introducción a OpenGL • glVertex2i(1. • glColor3fv (color_array). 3. 17 .  Son equivalentes: • float color_array[] = {1. 1.

glVertex2f ( 0.0). glBegin(GL_POLYGON).0.0.0. 0. 1. -0.7. Ejemplo de programa OpenGL main () { AbrirVentana(). glVertex2f (-0. 0. -0.0. 1. glVertex2f (-0. 0. glEnd().5).5. -1.0). glClear(GL_COLOR_BUFFER_BIT).0. Introducción a OpenGL } 18 .5. -1. 0.0.5.0.5). glOrtho(-1.0. 1.5. glClearColor(0. glFlush(). 0. glColor3f (1.5). 1.0).0. 1. glVertex2f ( 0.0.5).

Podemos encontrar 10 tipos de primitivas en OpenGL 19 . Primitivas Gráficas  Se construyen con: • glBegin(GLenum mode) Introducción a OpenGL • glEnd()  • Lista de vértices  Algunas estructuras requieren de un único par glBegin()-glEnd(). y otras requieren de varios.8.

Primitivas Gráficas   Las primitivas gráficas (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 Introducción a OpenGL         .8.

y0.y3. Primitivas Gráficas Ejemplos  Introducción a OpenGL glBegin(mode).y2.  glEnd(). •glVertex3f(x0.z2).y1.z3). •glVertex3f(x1. •glVertex3f(x3.z1).z0). 21 . •glVertex3f(x2.8.

Primitivas Gráficas Puntos  Modificar el tamaño de los puntos: • Obtener el rango de tamaños válidos Introducción a OpenGL glPointSize(GLfloat tamaño) • Obtener granularidad  glGetFloatv(GL_POINT_SIZE_RANGE.8. dimension) glGetFloatv(GL_POINT_SIZE_GRANULARITY. &salto) Suavizado de puntos • para activarlo: • para desactivarlo: glEnable(GL_POINT_SMOOTH) glDisable(GL_POINT_SMOOTH) 22 .

• factor: es el número de veces que un bit se repite • pattern: el patrón de 16 bits a dibujar 0x0F0F  Es necesario activarlo/desactivarlo • glEnable(GL_LINE_STIPPLE). Primitivas Gráficas Líneas  Introducción a OpenGL  Grosor de la línea • void glLineWidth(GLfloat Patrón de línea • void width). • glDisable(GL_LINE_STIPPLE). glLineStipple(GLint factor.8. GLushort pattern). 23 .

Primitivas Gráficas Líneas 0 Binario = 0 F F Introducción a OpenGL 0000 0000 1111 1111 Patrón de Línea = Línea = Un segmento 24 .8.

8. GLenum format. 25 . GLenum type. const GLvoid *pixels ). GLsizei height. Primitivas Gráficas Polígonos  void glPolygonStipple( const GLubyte *mask ). • mask es una matriz de 32x32 Introducción a OpenGL  void glDrawPixels( GLsizei width.

8. mirando hacia el eje Z negativo Y X Sentido Dextrógiro o positivo Z 26 . Sistema de coordenadas   Introducción a OpenGL El mundo 3D de OpenGL es dextrógiro El observador siempre en el origen.

 Donde mode toma los valores: • GL_PROJECTION • GL_MODELVIEW (Modelo de Cámara) • GL_TEXTURE 27 .9. Matrices  En principio tenemos tres grupos de matrices en OpenGL Introducción a OpenGL •void glMatrixMode( GLenum mode ).

Matrices orden de aplicación de las matrices orden de especificación de las matrices Introducción a OpenGL Vértice original Matriz ModelView Vértice transformado Matriz Projection Vértice proyectado Transformación Viewport Viewport  Vértice en pantalla y x y z x ModelView = x y z x Projection = x y z x = x .height).. glMatrixMode (GL_PROJECTION). glMatrixMode (GL_MODELVIEW). 10. .9.y. 10)..near.. glFrustum (left. glTranslatef (10.right.width.... 28 . .bottom.. . glViewport (x.top..far).

top) Z X (left.9. Matrices Proyección  Para empezar a dibujar en OpenGL tenemos que especificar: Introducción a OpenGL • • Puerto de vista (viewport) Volumen de visualización (matriz de proyección) near far (x.y) Y width (right.bottom) 29 .

GLdouble top. Matrices Proyección  Matriz de proyección: • void • Podemos usar proyección perspectiva: glFrustum( GLdouble left. GLdouble zFar ). GLdouble right. GLdouble bottom. GLdouble top. GLdouble znear. GLdouble aspect.9. GLdouble right. GLdouble bottom. Introducción a OpenGL • o proyección paralela: • void glOrtho( GLdouble left. GLdouble zNear. GLdouble zNear. 30 . GLdouble zfar ). GLdouble zFar ). • void gluPerspective( GLdouble fovy.

-10. • gluPerpective(45. • glOrtho(-10. • glFrustum(-10. 10. -10. • glLoadIdentity(). Matrices Proyección  Ejemplo de código para proyección perpectiva: Introducción a OpenGL • glMatrixMode(GL_PROJECTION). 10. Ejemplo de código para proyección paralela: • glMatrixMode(GL_PROJECTION).9. -10. o 10). 100). • glLoadIdentity(). 31 . 10. -10. 10). 10.  ancho/alto. 1.

32 . GLint y. • glGetIntegerv(GL_VIEWPORT. GLsizei height ). [3] es <alto>  Para obtener el viewport: • // 0] es <x>. Matrices Proyección  Se debe combinar con la vista que queremos establecer: • void • Introducción a OpenGL glViewport( GLint x.9. [2] • GLint viewport[4]. coordenadas de la ventana de visualización en píxeles es <ancho>. [1] es <y>. viewport). GLsizei width.

0. • glPopMatrix(). • glScale(sx. sy. 0. • glRotatef(angulo.0.0). // eje z  Se emplea la pila de matrices para independizar los objetos: 33 . tz). Matrices ModelView y Texturas  Establece las transformaciones que se aplican a cada objeto: Introducción a OpenGL • glTranslatef(tx. sz).9. • glPushMatrix(). ty. 1.0.

10. para múltiples renders o sombras complejas Feedback Buffer. buffer de render en memoria 34 . sombras. buffer de profundidades Stencil Buffer. buffer de mezcla. Buffers   Introducción a OpenGL    FrameBuffer (doble y triple buffer). reflejos Accumulation Buffer. para efectos especiales. máscaras 2D. almacena los colores de los píxeles Z-Buffer.

GLenum type. Display Lists  Para optimizar mediante hardware gráfico nuestros objetos debemos emplear Display Lists: • void • void glNewList(GLuint list. Para dibujar una o varias Display List: • void glCallList( GLuint list ). GLenum mode). GLsizei range). • void glCallLists( GLsizei n. puede ser: GL_COMPILE o GL_COMPILE_AND_EXECUTE • mode Introducción a OpenGL glEndList(void). *lists ). const GLvoid 35 . glDeleteLists(GLuint list.11.    Para eliminar cualquier lista: • void Si existe una Display List: • GLboolean glIsList( GLuint list ).

y2. glEndList(). 36 . glVertex3f(x2.  Para dibujar este Quad debemos usar: • glCallList( 1 ).z0).z3). Introducción a OpenGL glVertex3f(x0. glEnd(). Display Lists Ejemplo glNewList(1. glVertex3f(x1. glBegin(GL_QUADS).y3. glVertex3f(x3.y0.11.z2).z1).y1. GL_COMPILE).

 donde s y t son coordenadas normalizadas de la textura (0.0) Hola (0. GLfloat t ).1) 1 x (1.12.1) 1 (0. Texturas Coordenadas  Para emplear texturas necesitamos emplear coordenadas de textura en los vértices que creemos para modelar nuestros objetos: Introducción a OpenGL • void y glTexCoord2f( GLfloat s.0) (1.0) 37 .

// cargar la textura desde un fichero en TextureImage Introducción a OpenGL glGenTextures(1. TextureImage[0]->data). glTexParameteri(GL_TEXTURE_2D. GL_RGB. GL_UNSIGNED_BYTE. TextureImage[0]->sizeY. //Filtrado lineal glTexParameteri(GL_TEXTURE_2D.GL_LINEAR). 38 .GL_TEXTURE_MAG_FILTER. 0. &texture[0]). // genera los nombre de texturas // Crea la textura desde TextureImage glBindTexture(GL_TEXTURE_2D. Texturas Creación de una textura  Para crear las texturas necesitamos: // vector para almacenar las texturas GLuint texture[1]. 3. 0. texture[0]).12. // selecciona esta textura glTexImage2D(GL_TEXTURE_2D.GL_LINEAR). TextureImage[0]->sizeX.GL_TEXTURE_MIN_FILTER.

// 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 .12. texture[0]). glCallList(id). Introducción a OpenGL // Selecciona la textura glBindTexture(GL_TEXTURE_2D. Texturas Uso de las texturas  Para usar las texturas necesitamos: // Habilita el uso de texturas glEnable(GL_TEXTURE_2D).

GL_SPOT_CUTOFF. GLenum pname. GL_SPECULAR. GL_POSITION. GL_SPOT_DIRECTION. GL_CONSTANT_ATTENUATION. // con 0 ≤ i < GL_MAX_LIGHTS // y definir correctamente las luces void glLightf( GLenum light. and GL_QUADRATIC_ATTENUATION 40 .13. Introducción a OpenGL // Habilitar las luces glEnable(GL_LIGHTi). GL_DIFFUSE. GLint param ) Donde pname puede ser: • GL_AMBIENT. GLenum pname. GLfloat param ) // o void glLighti( GLenum light. Iluminación  Para usar las luces necesitamos: // Habilita el uso de la iluminación glEnable(GL_LIGHTHING). GL_LINEAR_ATTENUATION. GL_SPOT_EXPONENT.

GL_SELECT.14. Selección  Para seleccionar emplearemos la pila de nombres que tiene OpenGL: Introducción a OpenGL •void glInitNames( void ) •void glPushName( GLuint name ) •void glLoadName( GLuint name ) •GLint glRenderMode( GLenum mode ) admite tres valores GL_RENDER. y GL_FEEDBACK 41 .

GLdouble delY.14. GLint *viewport ) Introducción a OpenGL  Ejemplo la función Pick3d de la clase TScene 42 . Selección  void gluPickMatrix( GLdouble x. GLdouble delX. GLdouble y.

15. GLenum dfactor ). GL_DEPTH_TEST (usa o no el z-buffer) GL_STENCIL_TEST (usa o no el stencil buffer) 43 . Varios  Usando glEnable. const GLdouble *equation ) Introducción a OpenGL • • • • GL_NORMALIZE (normaliza las normales) GL_BLEND (transparencia) • void glBlendFunc ( GLenum sfactor . glDisable tenemos: • • GL_CULL_FACE (elimina caras invisibles) GL_CLIP_PLANE (plano de recortado) • void glClipPlane (GLenum plane .

• gluSphere • gluCilynder • gluPartialDisk • gluCone 32. 32). • gluDisk(disco.2. • disco = gluNewQuadric().2. 1. Quadrics  Para crear cuádricas (esferas.  Otras cuádricas: 44 . etc): Introducción a OpenGL • GLUquadricObj *disco.16. 0. discos.

Con los valores de GLU_NONE. como valor de normal 45 . GLboolean texture). y GLU_POINT. Quadrics Texturas  Para activar las coordenadas de textura: • • void gluQuadricTexture (GLUquadric* quad.GLU_LINE.  Estilo de dibujo: void gluQuadricDrawStyle(GLUquadric* quad. Introducción a OpenGL • Con los valores de GLU_FILL. GLenum normal). GLenum draw). GLU_FLAT. and GLU_SMOOTH. como valor de draw  Estilo de normal: • • void gluQuadricNormals(GLUquadric* quad. GLU_SILHOUETTE.16.

Sign up to vote on this title
UsefulNot useful