Sie sind auf Seite 1von 13

UNIVERSIDAD CENTRAL DE VENEZUELA

FACULTAD DE CIENCIAS
ESCUELA DE COMPUTACIN
FUNDAMENTOS Y TCNICAS EN COMPUTACIN GRFICA
Taller #1 : Shaders, buer objects y modos de
renderizacin en OpenGL
Carlos Zapata Conforto
30/06/2014
Qu es un Shader?
Un shader bsicamente es un programa que se utiliza para realizar sombreado en
una aplicacin grca, es decir, se encarga de producir los niveles de color propios
de una imgen, procesando vrtices y pxeles. Por lo general los shaders se en-
cuentran escritos en un lenguaje de programacin particular para su codicacin
como lo son por ejemplo HLSL (High level shading language) para plataformas
Microsoft especcamente Direct3D y GLSL (OpenGL shading language) para
sistemas Linux, Mac OS X y Windows especcamente para OpenGL.
Algunos efectos que podemos lograr con shaders son los siguientes :
OpenGL Shading Language (GLSL)
Es un lenguaje de alto nivel para llevar a cabo el desarrollo de shaders y su
sintaxis esta basada en el lenguaje de programacin C. Fue creado para darle la
oportunidad a los desarrolladores tener un control ms directo del pipeline sin
tener que depender de un lenguaje especco para el hardware que se pudiera
encargar de esta tarea.
1
El pipeline de OpenGL
En OpenGL se implementa lo que es comunmente denomidado pipeline de ren-
derizacin que no es ms que una secuencia de etapas que se van encargando
de procesar los datos de una determinada aplicacin para producir una imgen
nal. Las etapas de este pipeline se representan mediante shaders, las etapas
son : Vertex shading stage, tessellation shading stage, geometry shading stage,
fragment shading stage.
Vertex shading stage
Esta etapa se encarga de recibir los vrtices y los datos asociada a cada uno
de ellos cargados previamente en un determinado buer object, este shader se
encarga de procesar cada vrtice de forma individual.
Tessellation shading stage
En la etapa de teselacin en caso de haberse indicado su uso, se va a encargar de
crear primitivas grcas adicionales para una mejor visualizacin de los datos,
gracias a la informacin provista del vertex shader y la data asociada a cada
vrtice.
Geometry shading stage
En la etapa de geometrizacin se recibe como entrada un conjunto de primitivas
bsicas como una coleccin de vrtices, este conjunto de primitivas se repre-
sentan mediante arreglos. Esta etapa se encarga de operar sobre una primitiva
bsica como unidad permitiendo su modicacn.
Fragment shading stage
En la etapa del fragment shader el pipeline de OpenGL se encaga de determinar
que fragmentos se van a convertir en pxeles. En esta etapa se lleva a cabo el
clculo del color de un fragmento y los valores de profundidad asociados a cada
fragmento.
2
Vertex Buer Objects (VBOs)
Los vertex buer object son los principales objetos proveedores de datos en
OpenGL. Podemos verlos como trozos de memoria que son manejados interna-
mente por OpenGL y con ellos nos encargaremos de enviar al pipeline : vrtices,
normales, coordenadas de textura, tangentes, bitangentes etc.
Su generacin se realiza de la siguiente manera:
gl GenBuf f er s ( 1 , <vbo_var >);
gl Bi ndBuf f er (GL_ARRAY_BUFFER, <vbo_var >);
gl Buf f er Dat a (GL_ARRAY_BUFFER, <dim>, <ptr >, <mode>);
glGenBuers(n, <vbo_var>) : Esta instruccin se encarga de solici-
tarle a OpenGL la creacin de una determinada cantidad de vertex buer
objects. El parametro n representa la cantidad de vertex buer objects
que vamos a generar y <vbo_var> representa la variable a la que le
vamos a dar el identicador del vertex buer object, esta ltima variable
debe ser un puntero y del tipo entero sin signo.
glBindBuer(GL_ARRAY_BUFFER, <vbo_var>) : Esta instruc-
cin se encarga de decirle a OpenGL que se va a enlazar un VBO. El primer
parmetro GL_ARRAY_BUFFER representa el ag que le notica a
OpenGL que vamos a enlazar un VBO, el segundo parmetro <vbo_-
var> representa la variable que generamos como un buer object en la
instruccin anterior.
glBuerData(GL_ARRAY_BUFFER,<dim>,<ptr>,<mode>) :
Esta instruccin se encarga de especcar los datos que le vamos a asignar
a un VBO. El primer parmetro GL_ARRAY_BUFFER representa
el ag asociado al buer object al que le vamos a asignar los en este caso
es un VBO. El segundo parmetro <dim> es la dimensin de nuestra
data, esta debe estar especcada en bytes. El tercer parmetro <ptr>
es el puntero a nuestra data. El cuarto parmetro <mode> representa
el comportamiento de nuestro VBO con respecto a la data que el va a
manejar.
3
Index Buer Objects (IBOs)
Son objetos de OpenGL que manejan ndices. Su nalidad yace en evitar la
redundancia de datos que se encuentran en los VBO (vrtices, normales, coor-
denadas de textura etc) y formar un determinado patrn de renderizacin de
una determinada primitiva bsica haciendo uso de los ndices a los que el hace
referencia.
Su generacin se realiza de la siguiente manera :
gl GenBuf f er s ( 1 , <ibo_var >);
gl Bi ndBuf f er (GL_ELEMENT_ARRAY_BUFFER, <ibo_var >);
gl Buf f er Dat a (GL_ELEMENT_ARRAY_BUFFER, <dim>, <ptr >, <mode>);
glGenBuers(n,<ibo_var>) : Esta instruccin se encarga de solic-
itarle a OpenGL la generacin de una determinada cantidad de index
buer objects. El parmetro n representa la cantidad de index buer ob-
jects que vamos a generar y <ibo_var> representa la variable a la que
le vamos a dar el identicador del index buer object, esta ltima variable
debe ser un puntero y del tipo entero sin signo.
glBindBuer(GL_ELEMENT_ARRAY_BUFFER,<ibo_var>)
: Esta instruccin se encarga de noticarle a OpenGL que se va a enlazar
un IBO. El primer parmetro GL_ELEMENT_ARRAY_BUFFER
representa el ag que le notica a OpenGL que vamos a enlazar un IBO,
el segundo parmetro <ibo_var> representa la variable que generamos
como un buer object en la instruccin anterior.
glBuerData(GL_ELEMENT_ARRAY_BUFFER,<dim>,<ptr>,<mode>)
: Esta instruccin se encarga de especicar los datos que le vamos a
asignar a un IBO. El primer parmetro GL_ELEMENT_ARRAY_-
BUFFER representa el ag asociado al buer object al que le vamos a
asignar los datos en este caso es un IBO. El segundo parmetro <dim>
es la dimensin de nuestra data, esta debe estar especcada en bytes.
El tercer parmetro <ptr> es el puntero a nuestros datos. El cuarto
parmetro <mode> representa el comportamiento de nuestro IBO con
respecto a los datos que el va a manejar.
4
Vertex Array Objects (VAOs)
Son un objetos de OpenGL cuya nalidad es almacenar estados o formatos de
envo de datos al pipeline, intuitivamente esto nos lleva a pensar que los VAOs
son los que se encargan de almacenar ciertos tipos de buer objects pues el-
los son los que especican como se surten los datos y sus propiedades hacia el
pipeline.
Su generacin se realiza de la siguiente manera :
gl GenVertexArrays ( 1 , <vao_var >);
gl Bi ndVertexArray(<vao_var >);
gl Enabl eVertexAttri bArray(<id_0 >);
gl Bi ndBuf f er (GL_ARRAY_BUFFER, <vbo_var_0 >);
gl Ver t exAt t r i bPoi nt er (<i d >, <comp>, <type >, <nor >, <s t r >, <o f f s e t >);
gl Enabl eVertexAttri bArray(<id_1 >);
gl Bi ndBuf f er (GL_ARRAY_BUFFER, <vbo_var_1 >);
gl Ver t exAt t r i bPoi nt er (<i d >, <comp>, <type >, <nor >, <s t r >, <o f f s e t >);
.
.
.
gl Enabl eVertexAttri bArray(<id_k >);
gl Bi ndBuf f er (GL_ARRAY_BUFFER, <vbo_var_k>);
gl Ver t exAt t r i bPoi nt er (<i d >, <comp>, <type >, <nor >, <s t r >, <o f f s e t >);
gl Bi ndVertexArray ( 0 ) ;
glGenVertexArrays(n, <vao_var>): Esta instruccin se encarga de
solicitarle a OpenGL la creacin de una determinada cantidad de vertex
array objects. El parmetro n representa la cantidad de vertex array ob-
jects que vamos a generar y <vao_var> representa la variable a la que
le vamos a dar el indicador del vertex array object, esta ultima variable
debe ser un puntero y del tipo entero sin signo.
glBindVertexArray(<vao_var>): Esta instruccins se encarga de no-
ticarle a OpenGL que se va a enlazar un VAO. El nico parmetro que
recibe esta instruccin es la variable <vao_var> generada por la ante-
rior instruccin.
5
glEnableVertexAttribArray(<id>) : Esta instruccin se encarga de
habilitar el ndice asociado al atributo que queremos enviar al pipeline. El
parmetro <id> representa ese ndice.
glBindBuer(GL_ARRAY_BUFFER, <vbo_var_k>) : Esta in-
struccin se encarga de informarle a OpenGL que se va a enlazar el k-
simo VBO. El primer parmetro GL_ARRAY_BUFFER representa
el ag que le notica a OpenGL que vamos a enlazar un VBO, el segundo
parmetro <vbo_var_k>representa la k-sima variable que generamos
como un VBO.
glVertexAttribPointer(<id>, <comp>, <type>, <nor>, <str>,
<oset>) : Esta instruccin se encarga de denir un arreglo de datos
genrico. Sus parmetros son : Primero <id>, representa el ndice aso-
ciado al atributo que queremos enviar al pipeline. Segundo <comp>,
la cantidad de componentes que se van a tener por unidad de data, para
el caso de un vrtice tenemos 3 componentes (x,y,z), para las normales
3 componentes (x,y,z), para las coordenadas de textura 2 componentes
(x,y) y as sucesivamente dependiendo de los datos que vayamos a enviar
al pipeline. Tercero <type>, representa el tipo de dato que estamos
manejando. Cuarto <nor>, es un ag que nos permite noticar que nue-
stros datos est o no normalizados. Quinto <str>, representa el stride,
no es ms que un oset en bytes entre unidades de datos consecutivos con-
tenidos en un bloque de datos y nalmente como sexto y ltimo parmetro
tenemos <oset> que presenta como su nombre lo dice un oset que nos
permite indicar mediante un apuntador donde comienza la primera com-
ponente de un bloque de datos.
6
Render Buer Objects (RBOs)
Los render buer objects son objetos de OpenGL que almacenan imgenes, son
creados y utilizados especcamente por los Framebuer objects (FBOs), ellos
estan optimizados para ser los targets de renderizacin, estan optimizados para
hacer rendering fuera de pantalla y almacenan los pxeles en el formato nativo,
esto hace que renderizar un RBO sea ms rpido que renderizar una textura.
Otro aspecto muy interesante de los RBOs es que permiten una rpida trans-
ferencia de pxeles entre ellos permitiendo cuando se usa la tcnica del doble
buer lograr un eciente swapping entre buers.
Su generacin se hace de la siguiente manera :
gl GenRenderbuf f ers ( 1 , <rbo_var >);
gl Bi ndRender buf f er (GL_RENDERBUFFER, <rbo_var >);
gl Render buf f er St or age (GL_RENDERBUFFER, <i f ormat >, <texw>, <texh >);
glGenRenderbuers(n, <rbo_var>) : Esta instruccin se encarga de
generar un render buer object, el primer parametro n representa la can-
tidad de RBOs que vamos a crear y el segundo parmetro <rbo_var>
representa la variable a la que le vamos a dar el indicador del render buer
object, esta ltima variable debe ser un puntero y del tipo entero sin signo.
glBindRenderbuer(GL_RENDERBUFFER, <rbo_var>) : Esta
instruccin lo que hace es indicarle a OpenGL que se va a enlazar un RBO.
El primer parmetro GL_RENDERBUFFER es el ag que le notica
a OpenGL que vamos a enlazar un RBO, el segundo parmetro representa
la variable que generamos como un render buer object en la instruccin
anterior.
glRenderbuerStorage(GL_RENDERBUFFER, <depthc>, <texw>,
<texh>) : Esta instruccin le notica a OpenGL como va a ser el
contenido de nuestro render buer object. El primer parmetro GL_-
RENDERBUFFER representa el ag asociado al buer object al que le
vamos a denir el contenido en este caso es un RBO. El segundo parmetro
<iformat>representa el formato interno que va a manejar el RBO, puede
ser un formato interno de color, profundidad o stencil. El tercer parmetro
<texw> representa el ancho que va a tener la imgen que se va almace-
nar en el RBO y el cuarto parmetro <texh> representa el alto que va
a tener la imgen que se va almacenar en el RBO.
7
Frame Buer Objects (FBOs)
Los frame buer objects son objetos de OpenGL que representan una extensin
para realizar rendering fuera de pantalla, para realizar esto, el FBO se vale del
manejo de texturas. Tambin, los FBOs se pueden utilizar para hacer un post-
procesamiento de imgenes, es una herramienta muy poderosa y muy exible
porque adicionalmente no requiere cambio de contexto y puede utilizar la infor-
macin del depth buer, color buer y del stencil buer para crear y almacenar
frames.
Su generacin se realiza de la siguiente manera :
gl GenFramebuf f ers (1, <fbo_var >);
gl Bi ndFramebuf f ers (GL_FRAMEBUFFER,<fbo_var >);
gl Framebuf f erTexture2D(GL_FRAMEBUFFER,<t_att >,<t exf >,<tex >,<mmap>);
gl Fr amebuf f er Render buf f er (GL_FRAMEBUFFER,<att >,GL_RENDERBUFFER,<rbo_id >);
glGenFramebuers(n, <fbo_var>) : Esta instrucin se encarga de
noticarle a OpenGL que vamos a generar una determinada cantidad de
frame buer objects. El primer parmetro n representa la cantidad de
FBOs que vamos a crear. El segundo parmetro <fbo_var> representa
la variable que va a tener el indicador del frame buer object, esta ltima
variable debe ser un apuntador y del tipo entero sin signo.
glBindFramebuers(GL_FRAMEBUFFER, <fbo_var>) : Esta
instruccin le indica a OpenGL que vamos a enlazar un frame buer ob-
ject. Su primer parmetro GL_FRAMEBUFFER es el ag que le
notica a OpenGL que vamos a enlazar un FBO. El segundo parmetro
<fbo_var> representa la variable que generamos como un frame buer
object en la instruccin anterior.
glFramebuerTexture2D(GL_FRAMEBUFFER, <t_att>, <texf>,
<tex>, <mmap>) : Esta instruccin se encarga de enlazarle una tex-
tura al frame buer object. Su primer parmetro GL_FRAMEBUFFER
representa el ag asociado al buer object al que le vamos a enlazar la tex-
tura, en este caso es un FBO. El segundo parmetro <t_att> representa
el punto de unin entre la textura y el frame buer object, este punto de
unin puede estar asociado al buer de color, profundidad o stencil. El
tercer parmetro <texf> representa el formato de textura que se va a
enlazar. El cuarto parmetro <tex> representa el identicador asociado
a la textura. El cuarto parmetro <mmap> representa los niveles de
mipmapping que se desea para la textura.
8
glFramebuerRenderbuer(GL_FRAMEBUFFER, <att>, GL_-
RENDERBUFFER, <rbo_id>) : Esta instruccin representa el en-
lace entre los frame buer objects y los render buer objects. El primer
parmetro representa el ag asociado al buer object al que le vamos a
enlazar un RBO, en este caso es un FBO. Como segundo parmetro ten-
emos <att> que representa el punto de unin entre el FBO y el RBO,
el punto de union puede estar asociado al buer de color, profundidad
o stencil. El tercer parmetro GL_RENDERBUFFER representa el
ag asociado al RBO. El cuarto parmetro <rbo_var> representa el
identicador asociado al RBO.
9
Modos de renderizacin
Display list
Las display list son objetos de OpenGL que han estado presentes desde versiones
viejas del mismo, son creadas y almacenadas en memoria y pueden ser llamadas
mltiples veces para renderizar una determinada geometra. En lo que se invoca
a la display list se ejecutaran las instrucciones en el orden que se le especaron.
Las display list se encargan de mejorar el rendimiento, es una buena prctica
usarlas cuando se quiere renderizar una determinada geometra muchsimas ve-
ces.
Un ejemplo de una display list puede ser el siguiente :
// < I ni t di s pl ay l i s t > //
voi d i n i t ( voi d )
{
l i stName = gl GenLi s t s ( 1 ) ;
gl NewLi st ( l i stName , GL_COMPILE) ;
gl Col or 3f ( 1. 0 , 0. 0 , 0 . 0 ) ;
gl Begi n (GL_TRIANGLES) ;
gl Ve r t e x2f ( 0 . 0 , 0 . 0 ) ;
gl Ve r t e x2f ( 1 . 0 , 0 . 0 ) ;
gl Ve r t e x2f ( 0 . 0 , 1 . 0 ) ;
glEnd ( ) ;
gl Tr ans l at e f ( 0 . 0 , 2. 0 , 0 . 0 ) ;
gl EndLi st ( ) ;
}
// < Di spl ay f unc t i on > //
voi d di s pl ay ( voi d )
{
gl Cl e ar (GL_COLOR_BUFFER_BIT) ;
gl Col or 3f ( 1. 0 , 1. 0 , 1 . 0 ) ;
f or ( i = 0; i < 1000; i ++)
g l Ca l l Li s t ( l i stName ) ;
gl SwapBuf f ers ( ) ;
}
10
Array of structures (AOS)
Un arreglo de estructuras no es ms que una idea de como se debe organizar la
data dentro de los VBOs para posteriormente ser renderizada por OpenGL. La
idea de los AOS consiste en ir creando bloques compuestos de datos (vrtices,
normales, coordenadas de textura etc) en arreglos muy grandes que contiene
estos bloques de forma consecutiva. Un ejemplo ms grco de esta estructura
es el siguiente :
Structure of arrays (SOA)
Una estructura de arreglos es otra forma de organizar la data alternativa al AOS
pero usando VAOs (Vertex Array Objects). La idea es crear varios VBOs aso-
ciados los datos que se van a enviar y almacenar dentro de un VAO, un ejemplo
grco de esta estructura es la siguiente :
Indexed structure of array (ISOA)
Esta estructura representa la versin no redundante del SOA, ya que se en-
carga de manejar un VAO usando un IBO, as, cada ndice que se maneja hace
referencia a un dato en los distintos VBOs que maneja el VAO.
11
Algunas libreras de extensiones de OpenGL
OpenGL Extension Wrangler (GLEW)
Es una librera multiplataforma escrita en C/C++ que se encarga de la lectura
y consulta de las extensiones de OpenGL. GLEW provee mecanismos ecientes
para determinar en tiempo de ejecucin cuales extensiones de OpenGL estan
soportadas en la plataforma sobre la que se ejecuta, cabe destacar que todas
las extensiones se encuentran en un nico archivo de cabecera y esta disponible
para una gran variedad de sistemas operativos incluyendo Windows, Linux, Mac
OS X, etc.
GL3W
Es una librera enfocada en los en la carga de los puntos de entrada de los
cores 3 y 4 de OpenGL. Est soportada para Windows, Linux etc. La principal
diferencia entre GLEW y GL3W yace en que GL3W no carga las funciones de
extensin porque solamente crea los puntos de acceso a un determinado core
de OpenGL, si se desea cargar una extensin esta debe ser cargada de forma
manual.
12
Algunas libreras para el manejo de ventanas en
OpenGL
GLFW
Es una libreria de cdigo abierto multiplataforma para la creacin de ventanas
con contextos de OpenGL, se encarga de manejar la entrada del usuario y el
manejo de eventos. Es sencillo de integrar en aplicaciones grcas que no re-
quieran de un main loop. GLFW est escrito en el lenguaje de programacin C
y tiene soporte nativo para Windows, Mac OS X y Linux.
Freeglut
Es una alternativa completamente open source para la librera OpenGL Utility
Toolkit (GLUT). Freeglut le permite al usuario poder crear y manejar ventanas,
contextos y eventos de OpenGL, esta disponible para una gran cantidad de
plataformas, esta librera lo que ha buscado es reemplazar a GLUT extendiendo
sus funcionalidades, pero, tiene muy pocas diferencias con respecto a GLUT,
cabe destacar que esta librera esta en constante actualizacin.
Simple DirectMedia Layer (SDL)
Es una librea multiplataforma que est diseada para proveer un acceso a bajo
nivel via OpenGL y Direct3D al hardware grco, al audio, al teclado, al mouse,
joysticks etc. Es usada por software de reproduccin de video, emuladores y jue-
gos. SDL est soportada para Windows, Mac OS X, Linux, iOS y Android. SDL
est escrita en el lenguaje de programacin C y trabaja nativamente con C++,
adicionalmente existen formas de enlazar SDL para otros lenguajes incluyendo
C# y Python.
13

Das könnte Ihnen auch gefallen