1
OpenGL
VyGLab – Lab. de Investigación y Desarrollo en Visualización
y Computación Gráfica
Dpto. de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
El pipeline gráfico
En los inicios de la CG todos los aspectos del proceso gráfico eran programables.
Las APIs permitieron escribir programas gráficos muy buenos y mucho más fácilmente
porque cubrían muchas de las funcionalidades del proceso gráfico. Pero se pagaba el
precio de no poder hacer todo lo que la API no podía hacer.
A medida que se desarrollaron los procesadores gráficos se desarrollaron
funcionalidades específicas para soportar la programación de características que las
APIs de funcionalidad fija no permitían.
Esta funcionalidad tiene ahora sus estándares incluyendo el lenguaje GLSL que es parte
del estándar OpenGL 2.1.
Los shaders son los programas que pueden cargarse en las tarjetas gráficas para llevar a
cabo operaciones fuera de las del pipeline de funcionalidad fija.
CG 2013
2
La Interface del Programador
El programador ve al sistema gráfico a través de una interface de
software, la API (Application Programming Interface).
CG 2013
OpenGL es una API
Origen de OpenGL
Silicon Graphics (SGI) revolucionó las estaciones de trabajo gráficas
implementando el pipeline en hardware (1982). Los programadores de
aplicaciones usaban una librería denominada IRIS GL
IRIS GL permitió programar aplicaciones interactivas 3D de modo
relativamente simple.
El éxito de IRIS GL condujo al desarrollo de OpenGL (1992), una API
independiente de la plataforma que era:
Fácil de usar
Lo suficientemente cercana al hardware para tener una excelente
performance
Enfocada en el rendering
No posee primitivas para manejar ventanas o para obtener
entradas del usuario; tampoco posee primitivas de alto nivel para
describir modelos de objetos tridimensionales.
CG 2013
3
Qué es OpenGL
• Open Graphics Library
– Especificación de una API gráfica 3-D
– “a software interface to graphics hardware”
– Librería de gráficos raster
• procesa vértices, normales y otros datos de una
escena
• Permite obtener pixels
– Es un estándar de la industria
• Soportado en muchas plataformas
– Mac OS, Windows, Linux, iPhone, PSP…
• Especificación públicamente disponible
CG 2013
Qué es OpenGL
Originalmente controlada por el Architectural Review Board (ARB)
Los miembros provenían de distintas empresas como SGI,
Microsoft, Nvidia, HP, 3DLabs, IBM,…….
Actualmente (desde 2006) es el Kronos Group
Era relativamente estable (hasta la versión 3.0)
Era compatible hacia atrás
Su evolución reflejó las nuevas capacidades que se desarrollaban
en el hardware
Programas de vértices y de fragmentos
Permite características específicas de la plataforma a través de las
extensiones.
.
CG 2013
4
Qué es OpenGL
Una implementación de hardware de OpenGL usualmente toma
la forma de un driver de una tarjeta gráfica. En la Figura se
muestra su relación con la aplicación.
Las llamadas de la API OpenGL se pasan a un driver de HW.
La interfaz del driver se realiza directamente con el HW del
display gráfico.
CG 2013
OpenGL actualmente
La performance se logra utilizando extensivamente la GPU más que la
CPU
Se controla la GPU a través de programas que se denominan shaders
La tarea de la aplicación es enviar los datos a la GPU
Todo el rendering se realiza en la GPU
.
CG 2013
5
El pipeline de Rendering de OpenGL
Vértices Primitivas Fragmentos Pixels
Escena Imagen Rasterizada
Procesamiento
Geométrico Rasterización
Operaciones
de Fragmentos
CG 2013
Qué es OpenGL
OpenGL no es un lenguaje de programación; es una API.
Cuando decimos que tenemos una aplicación OpenGL nos
referimos a que tenemos una aplicación escrita en algún
lenguaje de programación (tal como C, C++,...) que llama una o
más librerías de OpenGL.
Otros lenguajes de programación — tales como Visual Basic —
que pueden invocar funciones de librerías en C, también
pueden usar OpenGL. También se dispone de distintas formas
de hacer que OpenGL esté disponible para usarse desde
muchos otros lenguajes de programación.
CG 2013
6
Qué es OpenGL
OpenGL es una máquina de estados
• El estado actual de OpenGL (llamado colectivamente contexto)
contiene datos que describen cómo debe llevarse a cabo el proceso
de rendering
• El estado no cambia hasta que se establezca explícitamente
• Cuando se debe renderizar, hay muchos factores que determinan
cómo se verá la escena. OpenGL se hace varias preguntas antes de
renderizar.
• Las respuestas a todas estas preguntas se encuentran en la
configuración del estado de renderizado que es seteado por el
programador.
CG 2013
Sintaxis de primitivas en OpenGL
Una vez que inicializamos el contexto de OpenGL y
configuramos el estado de renderizado, ¿cómo le decimos qué
dibujar?
Como OpenGL es una API de muy bajo nivel, el bloque básico
para el rendering es un vértice.
Los vértices consisten, como mínimo, en una posición; también
pueden contener normales, información de color y coordenadas
de textura. Esto es para el pipeline de funcionalidad fija.
Para almacenar un vértice podemos crear un objeto vértice o
podemos almacenar cada componente del mismo en un arreglo
separado.
CG 2013
7
Sintaxis de primitivas en OpenGL
Podemos decir entonces que las funciones de OpenGL son de
2 tipos:
Generación de primitivas
Generan una salida en el display si la primitiva es visible
El estado controla cómo se procesan los vértices de las
primitivas y cuál es la apariencia de la misma
Cambios de estado
Funciones de transformación
Funciones de atributos
Bajo el OpenGL 3.1 la mayoría de las variables de estado
están definidas por la aplicación y enviadas a los shaders
CG 2013
Sintaxis de primitivas en OpenGL
Las primitivas comienzan con el prefijo gl, seguido de una
mayúscula para cada una de las palabras que constituyen la
primitiva:
glClearColor()
Las constantes se definen también comenzando por GL y usan
letras mayúsculas. Las palabras se separan con guión bajo:
GL_COLOR_BUFFER_BIT
Todas las funciones de OpenGL tienen el siguiente formato:
<Prefijo librería><Primitiva><cant de arg:opc><tipo de arg: opc>
Ejemplo:
glColor3f(...), glVertex3f(...)
CG 2013
8
Sintaxis de primitivas en OpenGL
Ejemplo
CG 2013
glUniform3f(x,y,z)
Pertenece a la librería GL
Nombre de la función
x,y,z son floats
glUniform3fv(p)
p es un puntero a un arreglo
dimensiones
Sintaxis de primitivas en OpenGL
Hay varias maneras de pasar a OpenGL la información de los
vértices. La más simple es el modo inmediato.
A partir de la versión 3.1 ya no se puede usar. No era eficiente
en términos de velocidad de uso de memoria. La información se
delimitaba mediante los comandos glBegin y glEnd.
Para pasar información de los vértices se usaban, por ejemplo,
las funciones glVertex, glNormal, glColor y glTexCoord.
glBegin(GL_POINT);
glNormal3f(0,0,1);
glColor4f(1,0,0,0.5);
glVertex3f(0, 1, 2.5);
glEnd();
CG 2013
9
Versión OpenGL Versión GLSL Fecha
1.0 1992
1.1 1997
1.2 1998
1.3 2001
1.4 2002
1.5 2003
2.0 1.0 2004
2.1 1.2 2006
3.0 1.3 2008
3.1 1.4 2009
3.2 1.5 2009
3.3 3.3 2010
4.0 4.0 2010
4.1 4.1 2010
4.2 4.2 2011
4.3 4.3 2012 CG 2013
OpenGL 3.1
Está totalmente basado en shaders
NO hay shaders por defecto
Cada aplicación debe proveer tanto un shader de vértices como
uno de fragmentos
No permite el modo inmediato
Tiene pocas variables de estado
No se requiere compatibilidad hacia atrás
.
CG 2013
10
public Triangulo()
{
posicionVertices = new Vector4[]{
new Vector4(-0.5f, 0.0f, 0.0f, 1.0f),
new Vector4(0.5f, 0.0f, 0.0f, 1.0f),
new Vector4(0.0f, 0.75f, 0.0f, 1.0f),
};
crearVBO();
}
private void crearVBO()
{
GL.GenBuffers(1, out triangVBO);
GL.BindBuffer(BufferTarget.ArrayBuffer, triangVBO);
GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(posicionVertices.Length * Vector4.SizeInBytes), posicionVertices, BufferUsageHint.StaticDraw);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
} CG 2013
OpenGL y GLSL
GLSL es el lenguaje de shaders de OpenGL
Es C-like con
Tipos definidos para matrices y vectores (2, 3, 4 dimensional)
Operadores sobrecargados
Constructores como C++
Similar a Cg de Nvidia y a HSLS de Microsoft
El código es enviado a los shaders como código fuente
Hay nuevas funciones de OpenGL para compilar, linkear y obtener
información de los shaders
.
CG 2013
11
string fragmentShaderSource = @"
#version 130
out vec4 colorSalida;
flat in vec4 elColor;
void main()
{
colorSalida = elColor;
}";
CG 2013
Otras versiones de OpenGL
OpenGL ES
Sistemas embebidos
Versión 1.0 (OpenGL 2.1 simplificado)
Version 2.0 (OpenGL 3.1 simplificado)
Basado en shaders
WebGL
Implementación Javascript de ES 2.0
Soportado en los browsers más nuevos
OpenGL 4.1 y 4.2
Adiciona shaders geométricos y teseladores
.
CG 2013
12
Bibliografía
Angel, E., Shreiner, D. Interactive Computer Graphics: A top-down approach with shader-based
OpenGL, Addison Wesley, 6th. Ed., 2011.
Buss, S., 3-D Computer Graphics, A Mathematical Introduction with OpenGL, Cambridge
University Press, New York, 2003.
Foley, J., van Dam, A., Feiner, S. y Hughes, J., Computer Graphics. Principles and Practice,
Addison Wesley, 1992, 2nd Edition.
Hill, F. Jr, Kelley, S., Computer Graphics Using OpenGL, Prentice Hall, 3rd Ed., 2006.
Rost, R., Licea-Kane, B., Ginsburg, D., Kessenich, J., OpenGL Shading Language, Addison-
Wesley Professional, 3rd Edition, 2009.
Shreiner, D., The Khronos OpenGL ARB Working Group, OpenGL Programming Guide: The
Official Guide to Learning OpenGL, Versions 3.0 and 3.1 7th Edition, 2009.
Wright, R., Haemmel, N., Sellers, G., Lipchak, B., OpenGL Superbible: Comprehensive Tutorial
and Reference, Addison-Wesley Professional; 5th edition, 2010.
http://openglbook.com/the-book/
http://arcsynthesis.org/gltut/index.html
CG 2013
CG 2013
Top Related