Sei sulla pagina 1di 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

Vertex

Pixel
Operations

Scan
Conversion

Texture
Memory

Fragment
Operations

Framebuffer

Images

Geometry
Primitive
Operations

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
Funcin

Tipo de
argumentos

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

Nmero de
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,
GLbitfield

unsigned long

Entero 32 bits sin signo

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);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
int main(){
glutCreateWindow("simple1");
glutDisplayFunc(myDisplay);
glutMainLoop();
}

Funcin callback de desplegado

Creacin de una ventana


Creacin de una ventana
Definicin de la funcin
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);
glutInitWindowPosition(0,0);

Definicin de propiedades de la ventana

glutCreateWindow("simple2");
glutDisplayFunc(myDisplay);
initializeGL();
glutMainLoop();
}

Inicializacin de propiedades (nuestra


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:

Potrebbero piacerti anche