Taller 01 CGrafica2014-1

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 25

Universidad Nacional Mayor de San Marcos

Facultad de Ingeniera de Sistemas e Informtica


E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Laboratorio 01

Introduccin a la programacin
grafica con OpenGL
Tetera de Martin Newell, diseado
en 1975 empleando curvas de Bzier
en la Universidad de Utah.

Objetivo: El objetivo de esta prctica1, es que el alumno reconozca algunas bibliotecas graficas,
adems de familiarizarse con OpenGL y sus primitivas grficas; tambin que reconozca el entorno de
desarrollo de este laboratorio (Windows, Visual C++, GLUT). Puede emplearse CodeBlocks de forma
indiferente, se tratar que los ejemplos sean independientes del entorno o IDE.
Esta seccin servir como introduccin de los conceptos fundamentales para el desarrollo de
programas en OpenGL, y nos permitir obtener un marco de trabajo til para las secciones
posteriores.
Duracin de la Prctica:
Lugar de realizacin:

2 Horas.
Laboratorio de cmputo.

El conocimiento requerido para realizar esta Prctica es de haber asimilado los conceptos
bsicos de programacin en C/C++.
El desarrollo tendr la siguiente estructura de temas:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

Introduccin a las libreras grficas


FLTK: Fast Light Toolkit
Maya (de Autodesk)
OpenGL: Open Graphics Library
Principales caractersticas de OpenGL
Ventajas de OpenGL
Preparando Visual C++ para programar con OpenGL sobre Windows XP con Visual C++ 6.0
Preparando Visual C++ para programar con OpenGL sobre Windows XP con Visual Studio
2008
Preparando CodeBlocks para programar con OpenGL
Programa ejemplo con OpenGL
Breve explicacin acerca del cdigo usado como ejemplo
Manejo de primitivas graficas para polilneas
Algunas primitivas bidimensionales
Ejercicios propuestos
Referencias

Estos apuntes laboratorio han sido modificados en el transcurso de los semestres anteriores buscando mostrar la informacin
necesaria para motivar al alumno, a su vez sirve como gua de casa sesin, no obstante el alumno debe ampliar los temas
sugeridos con la ayuda de la bibliografa sugerida.
Mg. Johnny R. Avendao Q.

Pag. No. 1

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

1. INTRODUCCIN A LAS LIBRERAS GRFICAS


Un sistema grfico se compone principalmente de los modelos a graficar (datos u objetos) y
su visualizacin en un dispositivo adecuado. Estos dispositivos (Hardware) son de uso especfico
ya sea en 2D o 3D. La implementacin de los modelos a visualizar se realizan con un nivel de
abstraccin tal que el usuario hace uso de bibliotecas (tambin llamadas libreras) graficas, las
cuales encapsulan gran parte de las funciones y procedimientos necesarios en el Pipeline
(tubera de procesos).
Las libreras grficas permiten conformar un software que puede generar imgenes en
base a unos modelos matemticos y unos patrones de iluminacin, texturas, etc.
A las libreras grficas tambin se les denomina API (del ingls Aplicacin Programming
Interface - Interfaz de Programacin de Aplicaciones) que viene a ser un conjunto de
especificaciones de comunicacin entre componentes del software. Representan un mtodo
para conseguir abstraccin en la programacin, generalmente (aunque no necesariamente)
entre los niveles o capas inferiores y los superiores del software. Uno de los principales
propsitos de una API consiste en proporcionar un conjunto de funciones de uso general, por
ejemplo, para dibujar ventanas o iconos en la pantalla. De esta forma, los programadores se
benefician de las ventajas de la API haciendo uso de su funcionalidad, evitndose el trabajo de
programar todo desde el principio.
Los objetivos de las libreras grficas es, en primer lugar que exista Independencia del
hardware (tanto dispositivos de entrada como de salida) que se usa, en segundo lugar debe ser
independiente de la aplicacin. La librera es accedida a travs de una interface nica (al menos
para cada lenguaje de programacin) para cualquier aplicacin.
Las libreras grficas realizan la gestin imgenes 3D en dos niveles. En Bajo nivel donde
las tareas de gestin de los elementos de la escena se hacen en serie y estas estn compuestos
por Primitivas grficas y atributos, podemos destacar en este nivel a OpenGL, Direct 3D, Java
3D, etc. En Alto nivel donde las tareas a realizar son: la gestin global de los elementos de la
escena, carga/descarga de memoria, gestin elementos no visibles, eleccin del modelo
geomtrico, nivel detalle, Textura y eleccin de la tcnica de presentacin (rendering); podemos
destacar en este nivel el Inventor, Performer, Hewlett Packard, etc.
2. FLTK (http://www.fltk.org/)
La "Fast Light Toolkit" (Herramientas de Software
Rpidas y Livianas) es una biblioteca del tipo GUI (Graphic
User Interface) multiplataforma, desarrollada inicialmente
por Bill Spitzak y luego mantenida por un grupo de
desarrolladores alrededor del mundo. La biblioteca fue
desarrollada teniendo en cuenta programacin de grficos
3D, para esto, provee una interfaz en OpenGL, pero
tambin permite el desarrollo de aplicaciones de propsito
general.
Utilizando sus propios widgets (Los widgets de
escritorio tambin se conocen como gadgets, como una
nueva categora de mini aplicaciones), trazado de grficos
2D y sistema de eventos (aunque FLTK2 ha ganado
experiencia y soporte para usar opcionalmente la biblioteca
grfica Cairo) desarrollados sobre un abstracto cdigo
dependiente del sistema, lo cual permite escribir
programas que lucen idnticos cuando son compilados en
cualquiera de los sistemas operativos soportados.
FLTK es software libre, licenciado bajo LGPL (GNU
Lesser General Public License, antes GNU Library
General Public License o Licencia Pblica General para
Mg. Johnny R. Avendao Q.

FLTK Sudoku

www.easysw.com/~mike/sudo
ku
Pag. No. 2

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Bibliotecas de GNU) con la clusula adicional que permite enlazado esttico por aplicaciones con
licencias incompatibles. Adems incluye FLUID (del Ingls, FLTK User Interface Designer), una
interfaz de diseo grfico de FLTK que genera los archivos de cabecera y cdigo para una GUI
desarrollada. Por ejemplo:
int main(int argc, char *argv[]) {
Fl_Window* w = new Fl_Window(330, 190);
new Fl_Button(110, 130, 100, 35, "Hola, Mundo!");
w->end();
w->show(argc, argv);
return Fl::run();
}

3. Maya (http://www.autodesk.es/adsk/)
Es un programa informtico dedicado al desarrollo de grficos en tres dimensiones, efectos
especiales y animacin. Surgi a partir de la evolucin de Power Animator y de la fusin de
Alias y Wavefront, dos empresas canadienses dedicadas a los grficos generados por
ordenador. Ms tarde Silicon Graphics (ahora SGI), el gigante informtico, absorbi a AliasWavefront, que finalmente ha sido absorbida por Autodesk.
Maya se caracteriza por su potencia y las posibilidades de expansin y personalizacin de su
interfaz y herramientas. MEL (Maya Embedded
Language) es el cdigo que forma el ncleo de
Maya, y gracias al cual se pueden crear scripts
y personalizar el paquete.
Maya posee numerosas herramientas para
modelado, animacin, render, simulacin de
ropa y cabello, dinmicas (simulacin de
fluidos), etc.
Adems, Maya es el nico software de 3D
acreditado con un Oscar gracias al enorme
impacto que ha tenido en la industria
cinematogrfica como herramienta de efectos
visuales, con un uso muy extendido debido a
su gran capacidad de ampliacin y
personalizacin.
Maya trabaja con cualquier tipo de
superficie NURBS, Polygons y Subdivision
Surfaces, incluye la posibilidad de convertir
entre todos los tipos de geometra.
Industrial, Light & Magic (ILM), la casa
de efectos visuales galardonada con el Premio
a la Academia, confi en el software de
entretenimiento digital de Autodesk, Inc. para
crear miles de tomas de efectos visuales para
las
como, Transformers: Revenge of the
Fallen, Harry Potter y The Half-Blood Prince,
Transformers renderizado con Maya Autodesk
Terminator Salvation y Star Trek. ILM cre
efectos visuales impresionantes utilizando Autodesk Maya y Autodesk Inferno (texto extraido de
http://www.3dprofesional.com/noticias/noticia2009071502.html).

Mg. Johnny R. Avendao Q.

Pag. No. 3

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

4. Opengl (http://www.opengl.org/)
OpenGL es una librera grfica que provee una interfaz de software a hardware grfico (un
ejemplo de hardware grfico es la combinacin tarjeta de video + monitor de un computador
personal). Utilizando esta librera, se crean programas interactivos que generan imgenes en
color de objetos tridimensionales.
Desde el punto de vista del programador OpenGL es una API para interactuar con
dispositivos grficos y aceleradoras 3D. Es una biblioteca de trazado de grficos de alto
rendimiento, fcil de usar, intuitivo, portable, en el que el programador describe las llamadas
necesarias a funciones y comandos para conseguir una escena, apariencia o efecto.
OpenGL contiene ms de un centenar de comandos que nos ayudan a definir objetos, aplicar
transformaciones a esos objetos, cambiar sus propiedades (color, textura, luz, etc.), posicin de
la cmara, entre otros. OpenGL fue creada con el objetivo de ser estndar y disponible en
distintos sistemas y entornos de ejecucin (plataformas de software). Su antecesora fue Iris GL
primera API de programacin para estaciones grficas de alto rendimiento desarrollada en 1982
por Silicon Graphics, Inc (lder mundial en grficos y animaciones por ordenador).
En el ao de 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 naci
OpenGL (Open Graphics Library).
Existen versiones OpenGL para XWindows bajo UNIX (Linux, SGI, SUN, Dec, etc.), Microsoft
Windows, MacOS y para distintos sistemas embebidos (OpenGL corre en los display CRT de los
aviones espa U2, por ejemplo). Puesto que cada una de estas plataformas maneja de distinta
manera un display, las componentes de interaccin (botones, ventanas, recepcin de input del
usuario, etc), no forman parte de OpenGL. Un programa que utilice OpenGL necesita de un
componente adicional, que realice la tarea de hacer de puente entre OpenGL y la plataforma
particular donde corre. En una plataforma con un sistema de ventanas como Microsoft Windows,
por ejemplo, este componente se encargar entre otras cosas de abrir una ventana y prepararlo
todo para que OpenGL pueda dibujar sobre ella.
Cada plataforma tiene su propia librera para este efecto. Como ejemplos, en XWindows de
UNIX la librera es GLX, y en Microsoft Windows es wGL. Cada una de estas libreras maneja los
detalles y particularidades de esos sistemas de ventanas. Para resolver el problema de manejo
de ventanas, Mark J. Kilgard de SGI cre la librera GLUT-library (OpenGL Utility Toolkit).
GLUT hace el trabajo de puente entre OpenGL y el sistema de ventanas, de una manera
portable. Puesto que GLUT debe funcionar en distintas plataformas, slo provee una
funcionalidad mnima desde el punto de vista de manejo de ventanas, mens e input.
5. PRINCIPALES CARACTERISTICAS DE OpenGL

Portabilidad: OpenGL es por diseo independiente del hardware, sistema operativo o


sistema de ventanas. Las funciones de OpenGL trabajan de la misma forma en cualquier
plataforma, es decir, se pueden llamar a las funciones de OpenGL desde un programa escrito
y obtener los mismos resultados independientemente del lugar donde el programa se este
ejecutando. Esto supone que sea portable y que la programacin mediante OpenGL sea ms
fcil de realizar que con un API integrado en un sistema de ventanas. La independencia
hardware se basa en no incluir funciones para la gestin de ventanas, interactividad con el
usuario, ni manejo de ficheros. Esto se debe a que dichas funciones estn definidas en cada
sistema de operativo, para obtener la portabilidad, en OpenGL los programas desarrollados
con esta API interactan con el sistema de ventanas de la plataforma donde los grficos son
visualizados (normalmente en una ventana). Hay varias herramientas y bibliotecas para el
manejo de ventanas desarrolladas para trabajar con OpenGL.

Perceptiva a la red: Es perceptiva a la red, de manera que es posible separar nuestra


aplicacin OpenGL en un servidor y un cliente que verdaderamente produzca los grficos.
Existe un protocolo para mover por la red los comandos OpenGL entre el servidor y el cliente.

Mg. Johnny R. Avendao Q.

Pag. No. 4

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Gracias a su independencia del sistema operativo, el servidor y el cliente no tiene porque


ejecutarse en el mismo tipo de plataforma, muy a menudo el servidor ser un
supercomputador ejecutando una compleja simulacin y el cliente una simple estacin de
trabajo mayormente dedicada a la visualizacin grfica. OpenGL permite al desarrollador
escribir aplicaciones que se puedan desplegar en varias plataformas fcilmente.

Funciones para crear grficos 2D y 3D: Las funciones de OpenGL como ya se coment
anteriormente, estn diseadas para permitir crear grficos 2D y 3D con especial nfasis en
3D. OpenGL tiene funciones o primitivas con las que se podr realizar modelado 3D,
transformaciones, utilizacin de color e iluminacin, sombras, mapeado de texturas,
animacin, movimiento borroso que se describen brevemente a continuacin:

Primitivas geomtricas: Permiten construir descripciones matemticas de objetos. Las


actuales primitivas son: puntos, lneas, polgonos, imgenes y bitmaps.
Codificacin del Color: en modos RGBA (Rojo-Verde-Azul-Alfa) o de color indexado.
Visualizacin y Modelado: que permite disponer objetos en una escena tridimensional,
mover nuestra cmara por el espacio y seleccionar la posicin ventajosa deseada para
visualizar la escena de composicin.
Mapeado de texturas: que ayuda a traer realismo a nuestros modelos por medio del
dibujo de superficies realistas en las caras de nuestros modelos poligonales
Iluminacin de materiales: es una parte indispensable de cualquier grfico 3D. OpenGL
provee de comandos para calcular el color de cualquier punto dado las propiedades del
material y las fuentes de luz en la habitacin.
Doble buffering: ayuda a eliminar el parpadeo de las animaciones, cada fotograma
consecutivo en una animacin se construye en un buffer separado de memoria y
mostrado solo cuando est completo.
Anti-alizado: reduce los bordes escalonados en las lneas dibujadas sobre una pantalla
de ordenador. Los bordes escalonados aparecen a menudo cuando las lneas se dibujan
con baja resolucin. El anti-alizado es una tcnica comn en grficos de ordenador que
modifica el color y la intensidad de los pxeles cercanos a la lnea para reducir el zig-zag
artificial.
Sombreado Gouraud: es una tcnica usada para aplicar sombreados suaves a un objeto
3D y producir una sutil diferencia de color por sus superficies.
Z-buffering: mantiene registros de la coordenada Z de un objeto 3D. El Z-buffer se usa
para registrar la proximidad de un objeto al observador, y es tambin crucial para el
eliminado de superficies ocultas.
Efectos atmosfricos: como la niebla, el humo y las neblinas hacen que las imgenes
producidas por ordenador sean ms realistas. Sin efectos atmosfricos las imgenes
aparecen a veces irrealmente ntidas y bien definidas. Niebla es un trmino que en
realidad describe un algoritmo que simula neblinas, brumas, humo o polucin o
simplemente el efecto del aire, aadiendo profundidad a nuestras imgenes.
Alpha blending: usa el valor Alfa (valor de material difuso) del cdigo RGBA, y permite
combinar el color del fragmento que se procesa con el del pxel que ya est en el buffer.
Imagine por ejemplo dibujar una ventana transparente de color azul claro enfrente de una
caja roja. El Alpha Blending permite simular la transparencia de la ventana, de manera
que la caja vista a travs del cristal aparezca con un tono magenta.
Listas de Display: permiten almacenar comandos de dibujo en una lista para un trazado
posterior, cuando las listas de display (listas de visualizacin) se usan apropiadamente
puedan mejorar mucho el rendimiento de nuestras aplicaciones.
Evaluadores Polinmicos: sirven para soportar B-Splines racionales no uniformes, esto
es para ayudar a dibujar curvas suaves a travs de unos cuantos puntos de referencia,
ahorrndose la necesidad de acumular grandes cantidades de puntos intermedios.
Caractersticas de Feedback, Seleccin y Eleccin que ayudan a crear aplicaciones
que permiten al usuario seleccionar una regin de la pantalla o elegir un objeto dibujado
en la misma. El modo de feedback permite al desarrollador obtener los resultados de los
clculos de trazado.
Primitivas de Raster (bitmaps y rectngulos de pixels)
Operaciones con Pixels
Transformaciones: rotacin, escalado, perspectivas en 3D.

Mg. Johnny R. Avendao Q.

Pag. No. 5

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Ausencia de comandos para modelos complejos: Para conseguir rendimiento no tiene


comandos para describir modelos complejos (mapas, pjaros, molculas, etc.) sino que tiene
primitivas que permiten dibujar puntos, lneas y polgonos, y es el programador el que tendr
que construir objetos ms complejos.

Ejecucin inmediata: Con OpenGL cualquier comando es ejecutado inmediatamente.


Cuando en un programa se especifica que dibuje algo, lo hace inmediatamente. Pero existe la
opcin de poner comandos en Display Lists. Una display list es una lista no editable de
comandos almacenados para una ejecucin posterior y se puede ejecutar ms de una vez.
Por ejemplo, se pueden usar para redibujar el grfico cuando el usuario cambia el tamao de
la ventana, tambin se puede utilizar para dibujar la misma forma ms de una vez si esta se
repite como un elemento de un grafico.

Sintaxis Comn: Todos los comandos de OpenGL utilizan la misma sintaxis. Todos ellos
usan el prefijo gl y despus la palabra que forma el comando con la primera letra en
mayscula. Tambin en algunos comandos va seguido como sufijo un nmero y una letra,
que indican el nmero de parmetros del comando y el tipo de sus argumentos. Por ejemplo:
glColor3f(1.0,1.0,1.0)
ste es un comando que permite cambiar el color activo (Color) y tiene 3 parmetros de
tipo float. Adems, algunos comandos pueden llevar la letra v al final que indica que el
parmetro de la funcin es un puntero a un array o vector.

Mquina de estados: OpenGL se puede considerar como una mquina de estados. Las
aplicaciones se pueden poner en varios estados que permanecen en efecto hasta que se
cambian. Por ejemplo el color, se puede poner un color y dibujar un objeto, y ese color
seguir activo hasta que se ponga otro color. OpenGL tiene las siguientes variables de
estado:

Color
Vista actual
Transformaciones de proyecciones
Posiciones
Luces
Propiedades de material.

Algunas de estas variables de estado se pueden habilitar o deshabilitar con los comandos
glEnable() o glDisable().
Cada variable de estado tiene un valor por defecto disponible en todo momento a la
consulta por parte del programador. Tambin es posible el almacenamiento del valor de estas
variables de estado para posteriormente recuperarlo. Las funciones que permiten hacer esto
son glPushAttrib() y glPopAttrib().

Variedad de lenguajes: OpenGL puede ser invocado desde cualquiera de los siguientes
lenguajes C, C++, Fortran, Ada, Java. Aunque se puede considerar C el ms popular, hecho
demostrado en que todos los manuales y documentacin de Opengl se desarrollan con C.
Otros lenguajes de programacin como Visual Basic que pueden invocar a funciones de C,
tambin podrn hacer uso de OpenGL.

Pipeline de renderizado: Con OpenGL se debe seguir un orden para la realizacin de las
operaciones graficas necesarias para renderizar una imagen en la pantalla. La mayor parte
de las implementaciones de OpenGL siguen un mismo orden en sus operaciones, una serie
de plataformas de proceso, que en su conjunto crean lo que se suele llamar el OpenGL
Rendering Pipeline

Tipos de datos propios: OpenGL tiene sus propios tipos de datos para as hacer el cdigo
ms fcilmente portable, aunque estos tipos de datos corresponden con los tipos de datos de
C, y por tanto se podrn utilizar unos u otros indistintamente. Es necesario tener en cuenta
que si se utilizan los tipos de datos de C, dependiendo del compilador y entorno habr unas

Mg. Johnny R. Avendao Q.

Pag. No. 6

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

reglas para planificar el espacio de memoria de varias variables. Por tanto se recomienda el
uso de los tipos de Opengl. Todos los tipos de Opengl tienen el sufijo gl y a continuacin el
tipo de C correspondiente.

6. VENTAJAS DE OpenGL

El estndar de la industria: Un consorcio independiente, el OpenGL Architecture Review


Borrad (Junta de Revisin de Arquitecturas), gua la especificacin OpenGL, acepta o
rechaza cambios y propone tests de conformidad. Con amplio soporte de la industria,
OpenGL es el nico verdaderamente abierto, vendedor neutral, estndar de grficos
multiplataforma.
Estable: Las implementaciones OpenGL han estado disponibles por ms de siete aos en
una amplia variedad de plataformas. Las adiciones para la especificacin estn
adecuadamente controladas, y las actualizaciones propuestas salen a la luz con el tiempo
para que los desarrolladores adopten cambios. Los requisitos retrasados de compatibilidad
aseguran que las aplicaciones existentes no se conviertan obsoletas.
Confiabilidad y portabilidad: Todas las aplicaciones OpenGL producen resultados visuales
uniformes de despliegue en cualquier hardware condescendiente a API OpenGL, a pesar del
sistema operativo o sistema de ventanas.
Constante evolucin: Por su diseo perfeccionista y de enfoque al futuro, OpenGL permite
que las nuevas innovaciones de hardware ser accesible a travs del API por el mecanismo de
la extensin OpenGL. De este modo, las innovaciones aparecen en el API en un momento
oportuno, permiten a los desarrolladores de aplicaciones y vendedores de hardware
incorporar nuevas caractersticas en su producto normal puesto en circulacin.
Escalable: Las aplicaciones basadas a API OpenGL pueden funcionar con sistemas de
rdenes subsiguientes de usuarios para PCs, las estaciones de trabajo, y las
supercomputadoras. Como resultado, las aplicaciones pueden escalar a cualquier clase de
mquina que el desarrollador pueda escoger para sus objetivos.
Fcil para usar: OpenGL est adecuadamente estructurado con un diseo intuitivo y
rdenes lgicas. Las rutinas eficientes OpenGL tpicamente dan como resultado aplicaciones
con menos lneas de cdigo que aquellos que generan programas utilizando otras bibliotecas
grficas u otros paquetes. Adems, los drivers OpenGL encapsulan informacin acerca del
hardware subyacente, liberando el desarrollo de aplicaciones de diseo para caractersticas
especificas de hardware.
Adecuadamente documentada: Numerosos libros han sido publicados acerca de OpenGL,
y una gran cantidad de cdigo de muestra est fcilmente disponible, generando informacin
acerca de OpenGL econmica y fcil para obtener.

OpenGL es una API (Applications Programming Interface), o sea una librera. Llamando
sucesivamente a sus funciones se consigue un comportamiento adecuado sin importarnos en un
primer momento que es lo que esta API est haciendo en realidad. Contamos pues con diversos
tipos de funciones:
Funciones primitivas, que definen todos los objetos a bajo nivel como pueden ser puntos,
lneas o polgonos ms o menos complejos.
Funciones atributivas, que nos permitirn definir las caractersticas de todo aquello que
dibujemos, por ejemplo "glColor".
Funciones de visualizacin, para posicionar la cmara, proyectar la geometra a la pantalla
o eliminar (Clipping) aquellos objetos fuera de nuestro ngulo de visin.
Funciones de transformacin, para girar, rotar, trasladar, escalar la geometra.
Funciones de entrada, para poder generar aplicaciones interactivas en las que el usuario
participe. Comnmente relativas al uso del teclado y del ratn.

Mg. Johnny R. Avendao Q.

Pag. No. 7

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Todas las llamadas a OpenGL empiezan siempre con las


letras gl, pero no solo se cuenta con estas funciones,
observe el siguiente diagrama adjunto.

De ms
alto

Programa
OpenGL

GL

GL
U

GL
UT

Frame Buffer

Al ms bajo
nivel!

Las libreras que forman la API OpenGL son:


Biblioteca
Gl

Archivos
Gl.h
Opengl32.lib

Glu

Glu.h
Glu32.lib

Aux

Glaux.h
Glaux.dll
Glaux.lib

Glut

Glut.h
Glut32.dll
Glut32.lib

Descripcin
OpenGL Library (GL): Funciones del ncleo de OpenGL.
Se limitan a facilitar las operaciones que podramos
denominar grficas puras, no existiendo procedimientos para
el uso de matrices, funciones cuadrticas y similares o
funciones de manejo de ventanas y eventos. Por ello, se
utiliza unas bibliotecas complementarias que son una
extensin a OpenGL para facilitar dichas operaciones.
OpenGL Utility Library (GLU): Librera de utilidades ms
comunes. Totalmente portable. Esta librera proporciona una
serie de funciones que sirven para tareas tales como
actualizar matrices para obtener orientaciones y
proyecciones del punto de vista adecuado, generar
superficies etc... Todas las funciones de esta librera
comienzan por las letras glu, y se irn describiendo a
medida que sean tiles.
OpenGL Auxiliary Library (AUX): Librera de recursos. Son
muy tiles y cubren una gran variedad de funciones como
gestionar las ventanas independientes de la plataforma,
gestionar los eventos de entrada a la aplicacin o dibujar
objetos complejos en 3D.
OpenGL Utility Toolkit (GLUT): Librera de recursos
posterior a la Aux. Aade nuevas prestaciones. GLUT ofrece
una interfaz comn para mltiples plataformas para el
manejo de ventanas, buffers, renderizacin de texto, entrada
por teclado y mens, por lo que, los desarrolladores podrn
usar un interface comn para el sistema de ventanas
independiente de la plataforma, es decir, las aplicaciones de
OpenGL que usan GLUT se pueden portar entre plataformas
sin tener que introducir muchos cambios en el cdigo fuente.

7. PREPARANDO EL VISUAL C++ PARA PROGRAMAR CON OpenGL sobre Windows XP con
Visual C++ 6.0

Paso 1: Desempaquetar el fichero OPENGL95.ZIP y copiar luego los archivos del OpenGL
en la ubicacin correcta:

Mg. Johnny R. Avendao Q.

Pag. No. 8

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

C:\Archivos de programa\Microsoft Visual


Studio\VC98\Include\gl

C:\ Archivos de programa\Microsoft Visual


Studio\VC98\lib

C:\windows\system32

Introduccin a la Programacin grafica con OpenGL

Gl.h
Glaux.h
Glu.h
Glut.h

GLAUX.lib
GLU32.lib
GLUT.lib
GLUT32.lib
OPENGL32.lib

glu.dll
GLU32.dll
glut.dll
glut32.dll
opengl32.dll
OPENGL32.dll

Paso 2: Crear un nuevo proyecto: al menu File - New y elegir en Proyects Win32 Console
Application o Win32 Application, eso va a depender del tipo de proyecto que quieres crear
si es para trabajar con GLUT utiliza Win32 Console Application y si vas a trabajar con las
Apis de Win32 utiliza Win32 Application, en ambos caso elegir un Project name y Location,
y en el siguiente cuadro de dialogo seleccionar An empty Project.

Nombre del
proyecto

Localizacin
del proyecto

Mg. Johnny R. Avendao Q.

Pag. No. 9

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Paso 2: Aadir un archivo para especificar el cdigo del programa que se desarrollara mas
adelante File New y finalmente seleccione la opcin C++ source file (archivo fuente).

Paso 3: Para compilar y ejecutar el programa debe especificar los enlaces (Link) con la
librera de OpenGL; vaya al Menu Proyect - Settings y en la pestaa Link en la seccin de
Proyect Options, agregar las libreras glut32.lib GLU32.LIB OPENGL32.LIB

8. PREPARANDO EL VISUAL C++ PARA PROGRAMAR CON OpenGL sobre Windows XP con
Visual Studio 2008

Paso 1: Desempaquetar el OPENGL95.ZIP y copie luego los archivos del OpenGL en la


ubicacin correcta:

C:\windows\system

Glu.dll
GLU32.dll
glut.dll
glut32.dll
opengl32.dll
OPENGL32.dll

C:\Archivos de
programa\Microsoft Visual Studio
2008\VC\ PlatformSDK
\Include\gl

Gl.h
Glaux.h
Glu.h
Glut.h

Mg. Johnny R. Avendao Q.

Pag. No. 10

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

C:\ Archivos de
programa\Microsoft Visual
Studio 8\VC\PlatformSDK\
lib

Introduccin a la Programacin grafica con OpenGL

GLAUX.lib
GLU32.lib
GLUT.lib
GLUT32.lib
OPENGL32.lib

Paso 2: Crear un nuevo proyecto: al men Archivo Nuevo- Proyecto.

Seleccionar Visual C++ - Win32 Aplicacin de consola Win32.

Paso 3: En Asistente para aplicaciones de Win32 seleccionar la configuracin de la


aplicacin. En tipo de aplicacin se escoge Aplicacin de consola y en opciones adicionales
Proyecto vaco.

Mg. Johnny R. Avendao Q.

Pag. No. 11

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Paso 4: Adicionar Cdigo fuente. En el men Proyecto Agregar nuevo elemento. En el


panel de Categoras seleccionar Visual C++ - Cdigo Archivo C++ (*.cpp). Escribir el
nombre del archivo en el cuadro de texto Nombre.

Paso 5: Para compilar y ejecutar el programa debe especificar los enlaces (LINK) con la
librera de OpenGL; vaya al nenu Proyecto Propiedades de y en el combo box
Configuracin seleccionar Todas las config, .

Mg. Johnny R. Avendao Q.

Pag. No. 12

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Seleccionar Propiedades de configuracin Vinculador Entrada Dependencias


adicionales.

9. PREPARANDO CODEBLOCKS PARA PROGRAMAR CON OpenGL

Paso 1: Desempaquetar el OPENGL95.ZIP (o la que obtuviese:


GLUT) y ubicarlo en un directorio (eleccin libre) de tal forma que la
estructura final de los archivos debe ser como sigue:

Mg. Johnny R. Avendao Q.

Pag. No. 13

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Paso 2: Crear un nuevo proyecto: al men Archivo Nuevo- Proyecto.


Seleccionar GLUT - Project.

Paso 3: En Asistente, indicar el nombre del proyecto.

Paso 4: Especificar la carpeta en donde se ubica la librera GLUT:

Mg. Johnny R. Avendao Q.

Pag. No. 14

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Paso 5: Finalmente seleccione


GNU GCC Compiler y Finish .

10. PROGRAMA EJEMPLO CON OpenGL


Motivacin:
Nos gustara generar los cinco vrtices de un pentgono sobre una circunferencia
circunscrita. Para esto podemos usar las siguientes ecuaciones paramtricas para describir la
circunferencia (donde 0 2):
=radio sen
=radio cos

Luego iremos incrementando el nmero de coordenadas para obtener una mejor


representacin grfica de la circunferencia.
Un programa realizado con el lenguaje C para resolver el problema planteado, se describe a
continuacin:
1.
2.
3.
4.
5.
6.
7.

#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#define GL_PI 3.1416f
void init(void);
void display(void);
void reshape(int,int);

8. int main(int argc, char** argv)


9. {
10.glutInit(&argc, argv);
Mg. Johnny R. Avendao Q.

Pag. No. 15

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

11.glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
12.glutInitWindowSize(250,250);
13.glutInitWindowPosition(100,100);
14.glutCreateWindow(argv[0]);
15.init();
16.glutDisplayFunc(display);
17.glutReshapeFunc(reshape);
18.glutMainLoop();
19.return 0;
20.}
21.void init(void)
22.{
23. glClearColor(0.0,0.0,0.0,0.0); //parametros: rojo, amarillo y azul, el cuarto es el parametro
alpha

24.glShadeModel(GL_FLAT);
25.}
26.void display(void)
27.{
28.GLfloat ang, radio = 8.0f, x, y;
29.glClear(GL_COLOR_BUFFER_BIT);
30.glPushMatrix();
// salva el estado actual de la matriz
31.glBegin(GL_POINTS);
for (ang = 0.0f; ang < 2 * GL_PI; ang += 2*GL_PI/5)
{
x = radio * sin(ang);
y = radio * cos(ang);
glVertex2f(x,y);
}
32.glEnd();
33.glPopMatrix(); // reecupera el estado del matriz
34.glFlush();
35.}
36.void reshape(int w, int h)
37.{
38.glViewport(0,0,(GLsizei)w, (GLsizei)h);
39.glMatrixMode(GL_PROJECTION);
40.glLoadIdentity();
41.glOrtho(-10.0,10.0,-10.0,10,-10.0,10.0);
42.glMatrixMode(GL_MODELVIEW);
43.glLoadIdentity();
44.}
11. BREVE EXPLICACIN ACERCA DEL CDIGO USADO EN EL EJEMPLO
Para comprender mejor el lenguaje, iremos lnea a lnea analizando qu significa y cmo se
utiliz el OpenGL en el problema anterior.
1.
2.
3.
4.

#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#define GL_PI 3.1416f

Las lneas del 1 al 4 es lo que se conoce como directiva del preprocesador, todos los
compiladores de C/C++ disponen de un preprocesador, un programa que examina el cdigo
antes de compilarlo. En el se incluyen los archivos de cabecera de las libreras del C/C++ y las
libreras del OpenGL que contienen las funciones utilizadas en el programa.

Mg. Johnny R. Avendao Q.

Pag. No. 16

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

5. void init(void);
6. void display(void);
7. void reshape(int,int);
Las lneas del 5 al 7 son las funciones prototipo usadas en el programa.
8. int main(int argc, char** argv)
9. {
10.glutInit(&argc, argv);
11.glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
12.glutInitWindowSize(250,250);
13.glutInitWindowPosition(100,100);
14.glutCreateWindow(argv[0]);
15.init();
16.glutDisplayFunc(display);
17.glutReshapeFunc(reshape);
18.glutMainLoop();
19.return 0;
20.}
Cualquier programa en C se caracteriza por su funcin main() o principal, funcin que se
llama automticamente al iniciar la ejecucin del programa. Debemos recoger los parmetros de
la lnea de comandos, argc y argv, mediante glutInit(), como sigue:
glutInit (&argc, argv);
Ahora hay que decirle al motor grfico como queremos "renderizar"; es decir, si hay que
refrescar la pantalla o no, que "buffers" hay que activar/desactivar y que modalidad de colores
queremos usar. Para ello empleamos las siguientes funciones:
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
Se puede definir tambien doble buffer (GLUT_DOUBLE) al igual que GLUT_SINGLE. Hay dos
posibilidades en el momento de colorear, podemos usar colores indexados, es decir referirnos a
ellos por un identificador y que el sistema los busque en una lista, o bien podemos usar la
convencin RGB. En nuestro caso le decimos al subsistema grfico que cada color a aplicar ser
definido por tres valores numricos, uno para el rojo (Red), otro para el verde (Green) y otro para
el azul (Blue). Recordar la teora aditiva del color, para esto usamos la constante GLUT_RGB.
Con un buffer simple, contamos tan solo con un rea de memoria que se redibuja
constantemente. Esto no es factible para aplicaciones donde la velocidad de render es muy alta
o el contenido grfico es elevado. En nuestro caso slo definimos un polgono y por lo tanto nos
conformaremos con el buffer simple. De todas formas casi siempre utilizaremos el buffer doble,
dos zonas de memoria que se alternan de manera que se dibuja primero una y en la siguiente
iteracin se dibuja la otra.
glutInitWindowSize (ANCHO, ALTO);
Con esta orden GLUT nos permite definir las medidas de nuestra ventana de visualizacin.
Estamos definiendo literalmente el ANCHO y ALTO de nuestra ventana (en pxeles).
glutInitWindowPosition (ORIGENX, ORIGENY);
Nos permite colocar la ventana en algn punto determinado de la pantalla. Despus
podremos moverla con el ratn, si no lo impedimos por cdigo; pero siempre hay que indicar un
punto de origen para la primera vez que ejecutamos la aplicacin.
glutCreateWindow ("Mi Grafico");
Una vez ya definido como "renderizar", con qu medidas de ventana y en qu posicin fsica
de la pantalla, creamos la ventana. Para ello le damos un nombre cualquiera que ser el ttulo

Mg. Johnny R. Avendao Q.

Pag. No. 17

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

que aparecer en esta. De hecho a la funcin se le pasa un array de caracteres, ya sea explcito
o sea el nombre entre comillas, o bien implcito, es decir, una variable que contiene el titulo.
glutDisplayFunc(funcion_Dibujar);
Con esto le decimos a la librera que cada vez que note que se debe redibujar, llame a una
funcin que hemos llamado dibujar (en la mayora de ejemplos aparece con DISPLAY).
glutReshapeFunc(funcion_ControlDeVentana);
Controla el cambio de tamao de la ventana de visualizacin.
glutMainLoop();
Usualmente se suele entrar en un bucle infinito que domine cualquier aplicacin OpenGL.
Con la funcin MainLoop, que siempre se pone al final del main, le decimos a la librera que
espere eternamente a que se produzcan "eventos", es decir, que hasta que no ocurra algo se
mantenga a la expectativa. En nuestro caso el nico evento posible es el propio "render" dado
que an no sabemos interactuar con el ratn, ni sabemos controlar que pasa cuando se mueve
la pantalla o se redimensiona (luego veremos ese tema).
21.void init(void)
22.{
23. glClearColor(0.0,0.0,0.0,0.0); //parametros: rojo, amarillo y azul, el cuarto es el parametro
alpha

24.glShadeModel(GL_FLAT);
25.}
Con esta funcin inicializamos ciertos parmetros como el color de la ventana a usar.
glClearColor(0.0, 0.0, 0.0, 0.0)
Con esto se define el color con el que se borrara el buffer al hacer un glClear(). Los 3
primeros parmetros son las componentes R, G y B, siguiendo un rango de [0,1]. La ltima es el
valor alpha, del que hablaremos ms adelante.
24.glShadeModel(GL_FLAT);
Las primitivas de OpenGL estn siempre sombreadas, pero el modelo de sombreado puede
ser plano (GL_FLAT) o suave (GL_SMOOTH). Si especificamos un color diferente para cada
vrtice, la imagen resultante variar con cada modelo de sombreado. Con el sombreado suave,
el color de los puntos interiores del polgono estar interpolado entre los colores especificados
para los vrtices. En el sombreado plano, el color especificado para el ltimo vrtice se usa en
toda la regin de la primitiva. La nica excepcin es GL_POLYGON, en cuyo caso el color usado
en toda la regin es el especificado para el primer vrtice.
25.void display(void)
26.{
27.GLfloat ang, radio = 8.0f, x, y;
28.glClear(GL_COLOR_BUFFER_BIT);
29.glPushMatrix();
// salva el estado actual de la matriz
30.glBegin(GL_POINTS);
31.for (ang = 0.0f; ang < 2 * GL_PI; ang += 2*GL_PI/5)
{
x = radio * sin(ang);
y = radio * cos(ang);
glVertex2f(x,y);
}
32.glEnd();
Mg. Johnny R. Avendao Q.

Pag. No. 18

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

% Funcin que permite dibujar los objetos.


27.GLfloat ang, radio = 8.0f, x, y;
Define los tipos de datos con la que va a trabajar el OpenGL. Las declaraciones de variables
usualmente definidas como enteras (int), reales (float) y de doble precisin (double) son definidas
mediante: Glint, Glfloat y Gldouble respectivamente. Los tipos de datos que usa el OpenGL son:
Tipo en OpenGL

Tipo de C

Representacin interna

GLbyte

char con signo

Entero de 8 bits

GLshort

short

Entero de 16 bits

GLint, GLsizei

int

Entero de 32 bits

GLfloat, GLclampf

float

Coma flotante de 32bits

GLdouble, GLclampd

double

Coma flotante de 64 bits

GLubyte, GLboolean

unsigned char

Entero de 8 bits sin signo

GLushort

unsigned short

Entero de 16 bits sin signo

GLuint, GLenum, GLbitfield

unsigned long

Entero de 32 bits sin signo

28.glClear(GL_COLOR_BUFFER_BIT)
Borra un buffer, o una combinacin de varios, definidos por flags. En este caso, el buffer de
los colores lo borra (en realidad, cada componente R G y B tienen un buffer distinto, pero aqu
los trata como el mismo). Para borrarlos utiliza el color que ha sido previamente definido en init()
mediante glClearColor(), en este caso, el (0,0,0,0) es decir, negro.
29.glPushMatrix();
Esta funcin se emplea para colocar la matriz actual en la pila de matrices actual. Esto se
emplea a menudo para almacenar la matriz de transformacin actual de manera que pueda
recuperarse ms tarde con una llamada a glPopMatrix.
30.glBegin(GL_POINTS);
for (ang = 0.0f; ang < 2 * GL_PI; ang += 2*GL_PI/5)
{
x = radio * sin(ang);
y = radio * cos(ang);
glVertex2f(x,y);
}
31.glEnd();
Objetos Begin y End: A partir de objetos bsicos podemos construir objetos cada vez ms
complejos (por ejemplo cualquier polgono), esto se consigue usando las funciones glBegin y
glEnd como sigue:
void glBegin(modo)
...// objetos
...// a encapsular
void glEnd(void)
El parmetro modo se encapsula entre las funciones glBegin y glEnd. El parmetro modo
que recibe la primera, sirve para decirle a OpenGL que tipo de objeto deseamos crear, para esto
hemos optado por indicarle que ser una nube puntos lo que se encapsular.

Mg. Johnny R. Avendao Q.

Pag. No. 19

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

El formato de los comandos de OpenGL para especificar vrtices (o coordenadas) es el


siguiente:
glVertex3fv( v )

Cantidad de
componentes
2 - (x,y)
3 - (x,y,z)
4 - (x,y,z,w)

Tipos de datos

Vector

b - byte
ub - unsigned byte
s - short
us - unsigned short
i - int
ui - unsigned int
f - float
d - double

Omitir v para la
forma escalar:
Glvertex3f(x,y,z)

36.void reshape(int w, int h)


37.{
38.glViewport(0,0,(GLsizei)w, (GLsizei)h);
39.glMatrixMode(GL_PROJECTION);
40.glLoadIdentity();
41.glOrtho(-10.0,10.0,-10.0,10,-10.0,10.0);
42.glMatrixMode(GL_MODELVIEW);
43.glLoadIdentity();
44.}
La funcin void reshape() controla el cambio de tamao de la ventana de visualizacin
38.glViewport(0,0,(GLsizei)w, (GLsizei)h);
glViewport(Glint x,Glint y,GLsizei w,Glsizei h);
Define un rea rectangular de ventana de visualizacin, donde (x,y) es la esquina inferior
izquierda, w y h son el ancho y la altura correspondientemente del Viewport, despus de
activarla, es ah en donde se dibuja.
39.glMatrixMode(GL_PROJECTION);
Ahora parametrizamos nuestra proyeccin, es decir, le decimos a OpenGL como debe
proyectar nuestros grficos en pantalla. Por ello y para empezar le decimos que active la matriz
de proyeccin que es la que vamos a retocar.
40.glLoadIdentity();
Limpia la matriz de proyeccin inicializndola con la matriz identidad.
41.glOrtho(-10.0,10.0,-10.0,10,-10.0,10.0);
glOrtho (x, ANCHO, y, ALTO, cercano,lejano);
Permite decirle a OpenGL de que manera proyectaremos los grficos en la ventana que se ha
creado. Usamos la funcin glOrtho(...), creando el volumen de visualizacin. Todo lo que est
dentro de este volumen ser proyectado de la forma ms simple, eliminando su coordenada Z, o
de profundidad. Esta proyeccin es la llamada de ortogrfica.
42.glMatrixMode(GL_MODELVIEW);

Mg. Johnny R. Avendao Q.

Pag. No. 20

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Esta funcin se usa para determinar qu pila de matrices (GL_PROJECTION,


GL_MODELVIEW o GL_TEXTURE) se usar con las operaciones de matrices.
Algunos atributos:
glClearColor (float a,float b,float c, flota alpha): Esta es algo genrica y se refiere al color
con el cual debe de "resetearse" el frame buffer cada vez que redibujemos toda la escena de
nuevo. En este caso el "fondo" de nuestra ventana ser como el fijado por esta funcin en el
frame buffer. El cuarto parmetro de la funcin se refiere al valor de alpha en cuanto al color.
Veremos mas adelante que el valor de alpha permite variar el grado de transparencia de un
objeto.
glColor3f(float a,float b,float c): En este caso definimos que todo lo que se dibuje desde
este momento ser del color especificado. Recordar que el orden de parmetros es Red,
Green, Blue ( RGB ).
glPointSize(grosor): Con esta llamada definimos que cada uno de nuestros puntos deber
tener un grosor de pxel en el momento de ser trasladado a pantalla.
glNormal3f(float a,float b,float c): cuando operemos con luces veremos que para cada cara
de un polgono hay que asociar un vector o normal. Esta funcin define como normal a partir
de este momento a un vector definido desde el origen con direccin positiva de las X. El
orden de los parmetros es X, Y, Z.
glMaterialfv(GL_FRONT,GL_DIFFUSE,blanco): por ultimo y tambin referido al tema de las
luces, cada objeto ser de un material diferente de manera que los reflejos que en el se
produzcan debidos a las luces de nuestra escena variaran segn su rugosidad, transparencia,
capacidad de reflexin; en este caso definimos que todas las caras principales FRONT, son
las caras que se ven del polgono) de los objetos dibujados a partir de ahora tendrn una
componente difusa de color blanco (asumiendo que el parmetro blanco es un vector de
reales que define este color). La componente difusa de un material define que color tiene la
luz que este propaga en todas las direcciones cuando sobre el incide un rayo luminoso. En
este caso se vera luz blanca emanando del objeto (s) dibujado (s) a partir de ahora, antes
hay que definir luces en nuestra escena y activarlas.
En cuanto a los colores. Trabajaremos con la convencin RGBA, es decir, grado de rojo,
verde, azul y transparencia. Los valores para cada componente se encontraran siempre dentro
del intervalo [0,1]. Si nos excedemos o nos quedamos cortos numricamente hablando, OpenGL
adoptara como valor 1 o 0 segn sea el caso. Es decir, que redondea automticamente, aunque
hay que evitarle clculos innecesarios y prever valores correctos. En el caso del valor para
alpha, 0 significa transparencia total y de aqu podemos usar cualquier valor hasta 1, objeto
totalmente opaco.
12. MANEJO DE PRIMITIVAS GRFICAS PARA POLILNEAS
Una vez definidos los vrtices con la que trabajaremos, estas pueden ser tratadas y
representadas de muchas maneras, dependiendo de los que deseemos ver o mostrar; para ello
OpenGL dispone de los siguientes parmetros para definir puntos, segmentos, tringulos,
polgonos y mallados:
GL_POINTS: para que todos los vrtices indicados entre ambas funciones se dibujen por
separado a modo de puntos libres.
GL_LINES: cada dos vrtices definidos, se traza automticamente una lnea que los une.
GL_POLYGON: se unen todos los vrtices formando un polgono.
GL_QUADS: cada 4 vrtices se unen para formar un cuadriltero.
GL_TRIANGLES: cada 3 vrtices se unen para formar un tringulo.
GL_TRIANGLE_STRIP: crea un tringulo con los 3 primeros vrtices, entonces
sucesivamente crea un nuevo tringulo unido al anterior usando los dos ltimos vrtices que
se han definido y el actual.
GL_TRIANGLE_FAN: Abanico de tringulos.
GL_LINE_STRIP: Series de lneas conectadas.
GL_LINE_LOOP: Mismo que el anterior, pero el ltimo y el primer vrtice cierran en bucle.
Mg. Johnny R. Avendao Q.

Pag. No. 21

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

GL_QUAD_STRIP: igual que en TRIANGLE_STRIP pero con cuadrilteros (vase la


orientacin de los vrtices).
Otras, consulte el manual de especificaciones del OpenGL (bibliografa).
V0
V4

V0

V5

V2

V3

V4

V3

V0
V1
V4
V1

V2
GL_LINES

GL_LINE_STRIP
V2

GL_LINE_LOOP
V2

V2

V1

V0

V3
V4

V0

V1

V5

V4
GL_POLYGON

V2

V1

V1
V3
V2

V0

V0

V3

V5
V7

V7

V4

V3

V0

V6
V5

V4
GL_TRIANGLE_FAN

V5

V3
GL_TRIANGLE_STRIP

GL_TRIANGLES

V1

V4

V0

V1

V3

V2

V1

V3

V5

GL_QUADS

V2
V4
GL_QUAD_STRIP

V6

13. ALGUNAS PRIMITIVAS BIDIMENSIONALES


OpenGL dispone de funciones que permiten obtener figuras planares, por ejemplo:

void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2):


dibuja un rectangulo plano definido por el vrtice inferior izquierdo (x1,y1) y el vrtice superior
derecho (x2,y2). Tambin puede recibir variables enteras o un arreglo de vrtices (vase las
referencias).

Se puede dibujar discos, discos huecos y discos parciales, para esto OpenGL emplea los objetos
cudricos, las cuales emplean modeladores cuadrticos para una mejor visualizacin; estas
funciones la provee la librera glu:

void gluDisk(GLUquadricObj *pt, GLdouble rinterior, GLdouble rexterior, GLint nlados,


GLint nvueltas):
dibuja un disco centrado sobre el plano XY, si rinterior=0 entonces dibuja un disco slido; el
borde se representa con nlados (nmero de lados del disco), mientrasque nvueltas
proporciona el nmero de anillos que se genera radialmente. Finamente *pu es una variable
de tipo Quadric.

Mg. Johnny R. Avendao Q.

Pag. No. 22

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

void gluPartialDisk(GLUquadricObj *pt, GLdouble rinterior, GLdouble rexterior, GLint


nlados, GLint nvueltas, GLdouble ang_ini, GLdouble ang_fin):
dibuja un disco cudrico parcial centrado sobre el plano XY, de manera similar a la anterior
funcin; ang_ini es al ngulo de partida del disco, siendo 0 en la parte superior y 90 a la
derecha, mientras que ang_fin especifica la porcin final del disco.

Ms adelante, abordaremos otras primitivas del tipo 3D emplendolos objetos cudricos que
hemos comentado.

Mg. Johnny R. Avendao Q.

Pag. No. 23

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

14. EJERCICIOS PROPUESTOS


Ejercicio 01:
En el programa ejemplo realice las siguientes modificaciones:
1. En vez de puntos, ahora trabaje con lneas (GL_LINES), con polilneas
(GL_LINE_STRIP), con polilnea cerrada (GL_LINE_LOOP), y ejecute el programa.
2. Use diferentes colores para los puntos de la figura y ejecute el programa.
3. Modifique en glShadeModel para GL_SMOOTH y observe el resultado.
4. Disee un objeto cualquiera, el que sea de su agrado.

Ejercicio 02:
Ahora efecte un grafico cualquiera de su agrado, puede ser una curva cualquiera, trate de
familiarizarse con esta API.
Ejercicio 03:
Disear un programa con OpenGL que permita leer por
teclado:
L: Longitud del lado del cuadrado mayor.
N: Nmero de cuadrados como se muestra en el grafico.
Se deber graficar empezando por el cuadrado ms grande
al ms pequeo. Si gusta puede centrar sus grficos en el
origen de coordenadas; y por ltimo tome sus precauciones
definiendo las dimensiones de la ventana inicial de forma
apropiada; maneje dimensiones relativamente grandes,
tanto como permita la resolucin de su monitor. El cdigo
deber mostrar una estructura repetitiva para graficar los
cuadrados.
Ejercicio 04:
Disear un programa con OpenGL que permita leer por
teclado:
L: Longitud del lado del triangulo equiltero.
N: Nmero de tringulos como se muestra en el grafico.
Se deber graficar empezando por el triangulo ms
grande al ms pequeo. Si gusta puede centrar sus
grficos en el origen de coordenadas; y por ltimo tome
sus precauciones definiendo las dimensiones de la
ventana inicial de forma apropiada.
Mg. Johnny R. Avendao Q.

Pag. No. 24

Universidad Nacional Mayor de San Marcos


Facultad de Ingeniera de Sistemas e Informtica
E.A.P. Ingeniera de Sistemas e Informtica
Departamento Acadmico de Ciencias de la Computacin
Laboratorio de Computacin Grafica 2011 II

Introduccin a la Programacin grafica con OpenGL

Ejercicio 05:
Hacer un programa usando OpenGL para generar las siguientes curvas cerradas:

Caracol: () = 2 + 4 sen ()

Cardioide: () = 3 - 3 sen ()

Rosal: () = 3 cos (2)

Espiral: () =

15. REFERENCIAS
OpenGL Superbible. R. Wright and M. Sweet. Waite Group, Inc 1996
OpenGL Programming Guide: The Official Guide to Learning OpenGL. D. Sheiner, M.
Wood, J. Neider and T. Davis. Addison Wesley, 2007
The OpenGL Utility Toolkit (GLUT) Programming Interface (API Version 3). Mark J.
Kilgard, Silicon Graphics, Inc 1996
The OpenGL Graphics System: A Specification (Version 1.2). Mark segal & Kurt Akeley.
Silicon Graphics, Inc 1998.
http://es.wikipedia.org/wiki/FLTK
http://www.taringa.net/posts/ebooks-tutoriales/2449209/Maya-the-fundamentals-tutorialesprofecionales-maya-2009.html
http://usuarios.lycos.es/andromeda_studios/paginas/tutoriales/tutgl001.htm

Mg. Johnny R. Avendao Q.

Pag. No. 25

También podría gustarte