Está en la página 1de 47

Conceptos bsicos de OpenGL

Lo que OpenGL hace


OpenGL se ha vuelto un estndar:
No trata de hacer demasiadas cosas
Solo dibuja la imagen, no maneja ventanas, modelado,
sonido o animacin de alto nivel

Hace lo suficiente
Efectos tiles de sntesis con alto rendimiento
Dibuja Objetos
Ve Objetos
Especifica modelos de color
Aplica Iluminacin
Mejora Imgenes
Manipula Bitmaps e Imgenes
Mapea Texturas
OpenGL para el Programador

Aplicacin

Aplicacin Paquete de Grficas

API de OpenGL

Hardware y Software

Dispositivos de Entrada Dispositivos de Salida


OpenGL Rendering Pipeline
La mayor parte de las implementaciones de OpenGL siguen un
mismo orden en sus operaciones, lo que se conoce como
rendering pipeline de OpenGL

Geometry
Vertex Primitive
Operations Scan Fragment

Framebuffer
Conversion Operations

Pixel Texture
Images
Operations Memory
Libreras de OpenGL
OpenGL Core Librery
OpenGL32 en Windows
Provee principalmente funcionalidad para
renderear

OpenGL Utility Library (GLU)


Provee funcionalidad de una nivel ms alto que
utiliza los comandos de bajo nivel de OpenGL
Proyecciones, superficies, etc.
Libreras de OpenGL
OpenGL Utility Toolkit (GLUT)
Provee capacidades bsicas de ventanas
Utilizado para el manejo de eventos de entrada:
Mouse, teclado, mes
Rutinas callback
Interface comn para mltiples plataformas
Libreras de OpenGL
OpenGL como una Mquina de Estados
Hay estados por default para todo

Los estados internos de OpenGL no cambian


hasta que uno los cambia
OpenGL como una Mquina de Estados
Se pueden hacer cambios sobre estados de
render, por ejemplo:
glColor3F(0.0,1.0,0.0);
glPointSize(4.0);
glLineWidth(2.0);

Se pueden recuperar los estados actuales, por


ejemplo:
glGetFloat(GL_POINT_SIZE_RANGE, sizes);
glutGet(GLUT_WINDOW_WIDTH);
OpenGL no es Orientado a Objetos
OpenGL no es OO

Existen mltiples funciones para una operacin


lgica, por ejemplo:
glVertex3f
glVertex2i
glVertex3dv
Nombres de Funciones
Las funciones de OpenGL siguen una
convencin de nombre que se refiere a:
A qu librera pertenece dicha funcin
El nombre de la funcin
Y el nmero y tipo de los argumentos que recibe
Nombres de Funciones
Nombre de la Tipo de
Funcin argumentos

glColor3f(x,y,z)
Pertenece a la Nmero de
librera GL argumentos

glVertex3fv(p)
El argumento es un
apuntador a un arreglo
#defines
La mayora de las constantes estn definidas en
los archivos:
gl.h, glu.h y glut.h
Nota: glut.h incluye automticamente a las otras

Ejemplos de elementos definidos:


Funciones: glBegin, glClear,
Constantes: GL_POLYGON,
Tipos de datos: Glfloat, Gldouble,
Tipos de Datos
Para hacer ms fcil el portar cdigo OpenGL
de una plataforma a otra, ste define sus
propios tipos de datos

Todos los tipos de datos empiezan con GL para


denotar que vienen de la librera OpenGL,
seguidos del tipo de dato correspondiente a C
Tipos de Datos
Tipo OpenGL Tipo C Tamao
GLbyte signed char Entero 8 bits
GLshort short Entero 16 bits
GLint, GLsizei long Entero 32 bits
GLfloat, GLclampf float Flotante 32 bits
GLdouble, GLclampd double Flotante 64 bits
GLubyte, GLboolean unsigned char Entero 8 bits sin signo
GLushort unsigned short Entero 16 bits sin signo
GLuint, GLenum, unsigned long Entero 32 bits sin signo
GLbitfield
Estructura de un Programa
La mayora de los programas que usan
OpenGL contienen:
main()
Abre 1 o ms ventanas
Define las funciones callback
Entra al ciclo de eventos (ltima instruccin)

Funciones callback
Funcin de desplegado
Funciones para el manejo de eventos de entrada y de
ventanas
Funcin de reposo (Idle)
Programa Sencillo
Dibujar un cuadro blanco en una ventana de
fondo negro
simple1.c
#include <GL/glut.h> Librera necesaria

void myDisplay(){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5); Funcin callback de desplegado
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
int main(){ Creacin de una ventana
glutCreateWindow("simple1"); Creacin de una ventana
glutDisplayFunc(myDisplay);
Definicin de la funcin
glutMainLoop(); callback de desplegado
}
Entrada al ciclo de eventos
Ciclo de Eventos
La funcin principal (main) siempre termina con el
programa introducindose en un ciclo de eventos:
glutMainLoop()

El programa siempre define una funcin callback


de desplegado: myDisplay()
La funcin callback ser llamada cada vez que se
produzca un evento, como presionar una tecla o
cambiar de tamao la ventana
La funcin callback termina con un glFlush() (obliga a
ejecutar cualquier instruccin que haya quedado
pendiente)
Defaults
GLUT provee valores por default para cmaras,
colores, parmetros de la ventana, etc.

simple1.c hace uso de los valores por default, por


eso queda tan sencillo

Ahora haremos cambios en diferentes propiedades


de:
Ventana
Colores
Vistas
simple2.c
#include <GL/glut.h>

int main( ){

glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(300,300); Definicin de propiedades de la ventana
glutInitWindowPosition(0,0);

glutCreateWindow("simple2");
glutDisplayFunc(myDisplay);

initializeGL();
Inicializacin de propiedades (nuestra
glutMainLoop(); funcin)
}
Propiedades de la Ventana
gluInitDisplayMode
Color RGB

glutWindowSize
Tamao en pixeles

glutWindowPosition
Posicin de la esquina superior izquierda

glutCreateWindow
Creacin dando el ttulo simple2
Inicializacin
void initializeGL()
{
Color negro de fondo
Opaco
glClearColor (0.0, 0.0, 0.0, 1.0);

glColor3f(1.0, 1.0, 1.0);


Color blanco para pintar
glMatrixMode(GL_PROJECTION);
Vista
glLoadIdentity();

Inicializacin de la matriz de la vista


gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

Dibujo en 2D
Sistemas Coordenados
No se tiene que usar toda la ventana para
desplegar la imagen:
glViewport(x,y,width,height)
x, y definen la esquina inferior izquierda
width y height el ancho y alto
En pixeles
Algunas Primitivas de Dibujo
Puntos
GL_POINTS
Lneas
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
Formas
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_POLYGON
GL_QUAD_STRIP
Puntos y Lneas (ver simple3.c)
Formas (ver simple4.c)
Polgonos
OpenGL desplegar correctamente nicamente
polgonos que cumplan con ser:
Simples
Convexos
Planos
El programa del usuario debe verificar que lo anterior
se cumpla

Nota: Los tringulos satisfacen todas estas


condiciones
Polgonos Simples
Las aristas no se cruzan
Polgonos Convexos
Todos los puntos en un segmento de lnea
entre dos puntos dentro del polgono
quedarn tambin dentro del polgono
Polgonos Planos
Todos los vrtices estn dentro del mismo
plano
Atributos
Los atributos son:
Parte de la librera OpenGL
Determinan la apariencia de los objetos
Ejemplos
Color (puntos, lneas, polgonos)
Tamao y ancho (puntos, lneas)
Patrones (lneas, polgonos)
Modo poligonal
Desplegado relleno
Desplegado slo de aristas
Atributos -- Color
glColor3f(Glfloat rojo, Glfloat verde, Glfloat azul)
Atributos basados en Vrtices
glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 1.0); // blanco
glVertex2f(-0.5, -0.5);
glColor3f(1.0, 0.0, 0.0); // rojo
glVertex2f(-0.5, 0.5);
glColor3f(0.0, 0.0, 1.0); // azul
glVertex2f( 0.5, 0.5);
glColor3f(1.0, 0.0, 1.0); // morado
glVertex2f( 0.5, -0.5);
glEnd();

ver simple5.c
Interpolacin Lineal
glBegin(GL_LINES);
glColor3f(1.0, 0.0, 0.0); // rojo
glVertex2f( 0, 0);
glColor3f(0.0, 0.0, 1.0); // azul
glVertex2f( 1, 0);
glEnd();
Atributos Tamao del Punto
glPointSize(GLfloat size)
Cambia el ancho en pixeles para renderear puntos
El tamao deber ser mayor a 0.0 y por default es
1.0.
Atributos Ancho de Lnea
glLineWidth(GLfloat width):
Cambia el ancho en pixeles para rederear lneas
El tamao debe ser mayor a 0.0 y por default es
1.0.
Atributos Patrn de Lnea
Se puede habilitar o deshabilitar:
glEnable (GL_LINE_STIPPLE)
glDisable(GL_LINE_STIPPLE)
Se cambia el patrn de la lnea con:
glLineStipple(GLint scaleFactor,
GLushort pattern)
Atributos Patrn de Lnea
glLineStipple(GLint scaleFactor, GLushort pattern)
Patrn hexadecimal (16 bits de 0s y 1s)
El patrn se repite cuantas veces sea necesario a lo largo
de la lnea
Los 1s indican que hay dibujo, los 0s que no hay
El patrn puede escalarse utilizando un factor que
multiplica la longitud del patrn
Por ejemplo: si tres 1s consecutivos aparecen en el
patrn, entonces se extendern a 6 si el factor es igual a
dos

ver simple6.c
Transparencia
Conocida como el canal Alfa del color, determina que
tanto se puede ver a travs del objeto

El color necesita 4 componentes ahora:


glColor4f(R, G, B, Alfa);

El parmetro alpha cambia el nivel de opacidad


glColor4f(R, G, B, 1.0); // opaco
glColor4f(R, G, B, 0.0); // transparente
glColor4f(R, G, B, 0.5); // semi-transparente
Transparencia
Se necesita habilitar la mezcla de transparecia:
glEnable(GL_BLENDING)

Y se necesita cambiar el mtodo de mezcla


con:
glBlendFunc(GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA)
Esto hace que la funcin sea controlada por el
cuarto canal del color que es alfa
Una Lnea Parcialmente Transparente

habilitar mezcla de transparencia


glEnable(GL_BLEND);

cambiar el modo de mezcla

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glBegin(GL_LINES);

glColor4f(0, 1.0, 0, 1.0); verde opaco


glVertex2f(0.0, 0.0);

glColor4f(0, 1.0, 0, 0.0); verde transparente


glVertex2f(1.0, 0.0);

glEnd();
Una Lnea Parcialmente Transparente

ver simple7.c
Modelos de Sombreado
El modo por default es el sombreado suave
(smooth shading)
glShadeModel(GL_SMOOTH)
OpenGL interpola los colores en los vrtices a
travs del polgono
Modelos de Sombreado
Otro modo es el sombreado plano (flat
shading)
glShadeModel(GL_FLAT)
El color del primer vrtice determina el color de
relleno de todo el polgono
Modo de Dibujo de Lneas
El modo por default es jagged lines
glDisable(GL_LINE_SMOOTH)
Rpido de calcular, pero no se ve bien
50x aumento:
Lneas Suaves Anti-Aliasing
Puede habilitarse el modo de dibujo suave
para lneas
glEnable(GL_LINE_SMOOTH)
Ms lento de calcular, pero se ve mejor
50x aumento:

También podría gustarte