Introducción a la

programación en
OpenGL (2)

Primitivas
Primitivas
GL_QUAD_STRIP GL_QUAD_STRIP
GL_POLYGON GL_POLYGON
GL_TRIANGLE_STRIP GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN GL_TRIANGLE_FAN
GL_POINTS GL_POINTS
GL_LINES GL_LINES
GL_LINE_LOOP GL_LINE_LOOP GL_LINE_STRIP GL_LINE_STRIP
GL_TRIANGLES GL_TRIANGLES
GL_QUADS GL_QUADS

Todas las primitivas son definidas por sus
vértics

Características a definir
Características a definir

Puntos: se puede especificar el tamaño de los
puntos dibujados con GL_POINTS

glPointSize(GLfloat size_in_pixels);

Usar un tamaño diferente a 1 tiene diferentes
efectos dependiendo si se ha habilitado el
antialiasing de puntos.

glEnalbe(GL_POINT_SMOOTH);

Características a definir
Características a definir

Líneas: se puede especificar el grosor de las
líneas dibujadas con GL_LINES

glLineWit!(GLfloat "it!_in_pixels);

También se puede especificar un patrón:

glLineStipple(GLint fa#to$%GL&s!o$t
patte$n);

glEnable(GL_LINE_STIPPLE);

Características a definir
Características a definir

Polígonos: se puede especificar la forma en la
que sern dibujados los polígonos

glPol'gonMoe(GLen&( fa#e%GLen&( (oe)

face: se refiere a la cara del polígono
– GL_)*ONT_+N,_-+./
– GL_)*ONT
– GL_-+./

mode: se refiere a la forma de dibujado
– GL_POINT
– GL_LINE
– GL_)ILL

Características a definir
Características a definir

Wireframe: es un modo de dibujado con un
nombre propio. !ólo se dibujan las aristas:

GlPol'gonMoe( GL_)*ONT_+N,_-+./%
GL_LINES);

Características a definir
Características a definir

!e puede especificar como "pen#$ determina
la cara frontal de un polígono

gl)$ont)a#e(GLen&( (oe);

GL_..W: antihorario %por defecto&

GL_.W: horario

Backface culling
Backface culling

's una técnica que permite acelerar el dibujado
de polígonos eliminando aquellos cu(a cara
frontal )" sea vista. *sto pasa cuando se usan
polígonos para definir superficies cerradas.

Todo polígono cu(a cara frontal +no sea visible,- se
encontrar oculto por otros polígonos cu(a cara frontal
+!. son visibles,

gl.&llMoe(GLen&( (oe);
– GL_)*ONT

GL_-+./ %valor por defecto&
– GL_)*ONT_+N,_-+./

glEnable(GL_.0LL_)+.E);

ransformaciones Geom!tricas
ransformaciones Geom!tricas

!e usan para:

definir la vista

orientación de la cmara

definir el tipo de pro(ección

posicionar los objetos en la escena

mapeo a la pantalla

"nalogía con la C#mara
"nalogía con la C#mara
cámara
trípode
modelo
Volumen de vista

"nalogía con la C#mara
"nalogía con la C#mara

Transformaciones de pro(ección

/justar los lentes de la cmara

Transformaciones de vista

!e define la posición ( orientación del volumen de
vista en el mundo: posicionar la cmara

Transformaciones del modelo

0osicionar el modelo en el mundo

Transformaciones del 1ie2port

/grandar o reducir la fotografía física

ransformaciones Geom!tricas
ransformaciones Geom!tricas

0ipeline funcional:

Objetivo:

3eali4ar transformaciones sobre los objetos de
modo de llevar su descripción tridimensional a una
bidimensional evaluando su iluminación (
eliminando los que no se vean.

Nota: la iluminación se calcula antes de que se
realice el clipping o se utilice el 45buffer para
determinar si el polígono es visible66
Transformaciones
de modelos y vista
Iluminación Proyección
Recorte
(Clipping)
Mapeo en
pantalla
2D 3D

ransformaciones Geom!tricas
ransformaciones Geom!tricas

7odelos:

"riginalmente los objetos estn definidos en su
sistema local de coordenadas %model space&

!e les aplica una transformación que los orienta (
posiciona %model tranform& definida por una matri4
898 homogénea. !e transforman sus vértices (
normales.

!e obtienen coordenadas del modelo en el espacio
global absoluto %2orld space&

$odelos de color
$odelos de color

!e puede trabajar con dos modos de color:

glS!aeMoel( GLen&( (oe );

mode:

GL_)L+T: asigna un :nico color a toda la superficie del
polígono

GL_SMOOTH: el color interior al polígono es el resultado
de interpolar el color de sus vértices %#ouraud !hading&

Iluminación
Iluminación

'stado que se encarga de los clculos a
reali4arse cuando ha( definidas luces en el
sistema.

!e aplica a TODO los vértices transformados-
tambi!n a los no visibles"

Utili4a el modelo de iluminación clsico
implementado por las /0;s: ecuación de la lu4

!e pueden utili4ar otros modelos de iluminación

Utili4ando 0i9el ( 1erte9 !haders

Iluminación
Iluminación
!ólo con técnicas avan4adas
%0i9el !hader ( 1erte9 !hader&

$apeo de e%turas
$apeo de e%turas

!istema mediante el
cual se puede aplicar
una imagen a un
polígono

0ermite aumentar el
realismo de la
geometría
Imagen original: archivo
*.jpg, *.png, etc.
Triángulo
mapeado
x
y
z
Geometría

$apeo de e%turas
$apeo de e%turas
x
y
z
imagen
geometría
frameuffer
!arge "#$%&
Textura "cuerpo&

$apeo de e%turas
$apeo de e%turas

;mgenes ( geometría flu(en desde ductos
separados que se juntan en el rasteri4ador

'sto significa que puede tratarse al mapeo de
te9turas como un estado ms de "pen#$
geometry pipeline
vertice'
pixel pipeline
image
ra'terizer

$apeo de e%turas
$apeo de e%turas

'l mapeo de te9turas se especifica por cada
vértice.

$as coordenadas de te9turas estn en el rango
<=- 1>
s
t
1, 1
0, 1
0, 0 1, 0
(s, t) = (0.2, 0.8)
(0.4, 0.2)
(0.8, 0.4)
A
B C
a
b
c
('pacio de textura ('pacio de )jeto

&nvolventes
&nvolventes

?uando las coordenadas de te9tura se
encuentran fuera del intervalo <=- 1> es
necesario indicar como se tiene que dibujar el
polígono
– glTexPa$a(ete$i(GL_TE1T0*E2,%t'pe%(oe)
t#pe mode
#$@T'ATU3'@B3/0@! #$@?$/70- #$@3'0'/T-
#$@?$/70@T"@C"3D'3-
#$@?$/70@T"@'D#'-
#$@7;33"3'D@3'0'/T
#$@T'ATU3'@B3/0@T #$@?$/70- #$@3'0'/T-
#$@?$/70@T"@C"3D'3-
#$@?$/70@T"@'D#'-
#$@7;33"3'D@3'0'/T
#$@T'ATU3'@C"3D'3@?"$"3
3#C/ en el rango <=-1>

&nvolventes
&nvolventes
#$@?$/70
#$@3'0'/T

&nvolventes
&nvolventes
#$@?$/70@T"@C"3D'3
#$@7;33"3'D@3'0'/T
#$@?$/70@T"@'D#'
#$@T'ATU3'@C"3D'3@?"$"3

&nvolventes
&nvolventes
$L%&'P'(T

'iltrado
'iltrado

#eneralmente las te9turas ( los polígonos no
tienen las mismas dimensiones

$a correspondencia de te9els ( pi9els no es 1 a 1

"pen#$ debe aumentar o disminuir los te9els
para aplicarlos a la geometría
Textura
*olígono
Magnificación un pi!el de la te!tura
(te!el) genera varios en el pol"gono final
Minimi#ación muc$os te!els de la
Te!tura caen en el mismo p"!el del pol"gono
*olígono
Textura

'iltrado
'iltrado

$a definición del filtrado de te9turas se hace
con la función
– glTexPa$a(ete$i(GL_TE1T0*E_2,%t'pe%(oe);

t(pe:
– GL_TE1T0*E_MIN_)ILTE*
– GL_TE1T0*E_M+G_)ILTE*

mode:

GL_NE+*EST: no interpola- elije el te9el ms cercano

GL_LINE+*: interpola los colores de los pi9els del
polígono usando la información de los colores de los
te9els ad(acentes

'iltrado
'iltrado
#$@)'/3'!T #$@$;)'/3

$ip$apping
$ip$apping

'n la magnificación la interpolación lineal
funciona bastante bien.

!in embargo en la minimi4ación no ocurre lo
mismo: la interpolación genera +alias, cuando la
geometría es lejana %ha( que filtrar ms&
te)tura
Te)el elegido
alias

$ip$apping
$ip$apping

Un filtrado de ms calidad que funcionara bien
para todos los grados de escala implica un
pocesamiento de un nivel que es mu( costoso
de reali4ar en tiempo real.

oluci*n: reali4ar el clculo off5line utili4ando
te9turas filtradas con diferente grado de
minimi4ación.

$ip$apping
$ip$apping

'n el momento de aplicar las te9turas "pen#$
decide el nivel a utili4ar en función de la
cantidad de minimi4ación a aplicar.

'ste clculo es soportado directamente por
hard2are.
+
,
-
.
%a te!tura original (level
&) es utili#ada para
generar diferentes
niveles a '( )*+( )*),(
etc-
%a te!tura original (level
&) es utili#ada para
generar diferentes
niveles a '( )*+( )*),(
etc-

$ip$apping
$ip$apping

$ip$apping
$ip$apping

#lu provee una primitiva que genera los
mipmaps directamente a partir de una te9tura
base ( carga los datos en la memoria de
video:

gl&-&il2,Mip(aps(GL_TE.T0*E_2,% 3
an#!o% alto%444% atos);

$a imagen corresponde al nivel =

!i no se quiere usar 7ipmaps la primitiva a
usar es

glTexI(age2,(GL_TE1T0*E_2,% 3% an#!o%
alto%444% atos);

O()etos de e%tura
O()etos de e%tura

/ cada te9tura se le asigna un identificador %int&
que se utili4a para indicarle al "pen#$ cual es
la te9tura con la que estamos trabajando.

0ara la generación de identificadores

glGenText&$es( n% 5textIs );

!e piden n identificadores consecutivos- ( se
almacena el primer identificador en te)t+ds

?ada ve4 que queremos definir una te9tura o
utili4arla

gl-inText&$e( GL_TE1T0*E_2,% i );

'unciones de com(inación
'unciones de com(inación

?uando se le aplica una te9tura a un polígono-
el mismo (a tiene un color ( ha( que indicarle a
"pen#$ como combinarlo con el color de la
te9tura.

GlTexEn6f( GL_TE1T0*E_EN7%
GL_TE1T0*E_EN7_MO7E%pa$a();

param:

GL_*EPL+.E: la te9tura reempla4a los otros colores.

GL_,E.+L: igual que GL_*EPL+.E pero considerando
valores alpha de las te9turas.

GL_MO,0L+TE: se multiplica el color del polígono por el
de la te9tura utili4ando la información de iluminación.

'unciones de com(inación
'unciones de com(inación
$L%D',(L

'unciones de com(inación
'unciones de com(inación
$L%-OD.L(T'

Nota: en este ejemplo el efecto de spot se
logra teselando la geometría ( aplicando un
sombreado #ourdaud

ransparencias ((lend)
ransparencias ((lend)

"pen#$ permite controlar la forma en la que
los pi9els de las primitivas que estamos
dibujando son me4clados con los (a e9istentes
en el colorbuffer.

0ara ello es necesario activar la funcionalidad
de blending usando:

glEnable(GL_-LEN,);

'actores de com(inación
'actores de com(inación

Durante el blending los pi9els de la primitiva
%fuente& son combinados con los (a e9istentes
en el buffer %destino&.

$a forma como se combinan se define usando:
– gl-len)&n#( fa#to$)&ente% fa#to$,estino);

?ada factor es un valor 3#C/ que multiplica a
los valores fuente ( destino respectivamente.

'l valor final se obtiene sumando ambos
resultados:

finalE%fuenteFfactorGuente H destinoFfactorDestino&

Constantes de com(inación
Constantes de com(inación

$a siguiente tabla muestra los diferentes
factores de combinación que utili4a "pen#$
I

Constantes de com(inación
Constantes de com(inación

$a transparencia se logra usando:
gl-len)&n#(GL_S*._+LPH+%GL_ONE_MIN0S_S*._+LPH+)

Ja( que dibujar primero las primitivas ms
lejanas ( luego las ms cercanas.

"dditive Blending
"dditive Blending

gl-len)&n#(GL_ONE%GL_ONE)

'sta función de combinación es conmutativa.

$os colores tienden a quedar ms claros.

"dditive Blending
"dditive Blending

!e puede utili4ar para dejar una te9tura ms
brillante.

!e dibuja la primer ve4 sin blending ( la
segunda ve4 %la misma te9tura en el mismo
lugar& activando este blend.

*u(tractive Blending
*u(tractive Blending

gl-len)&n#(GL_8E*O%
GL_ONE_MIN0S_S*._.OLO*)

$os colores tienden a quedar ms oscuros

" tener en cuenta+++
" tener en cuenta+++

$as transparencias no son compatibles con el
K5Cuffer.

$os polígonos transparentes no oclu(en a los que
tienen menor K.

Deshabilitar el K5Cuffer obliga a dibujar la
geometría en orden.

Una alternativa es:
1.Dibujar primero la geometría opaca con el K5Cuffer
activado
L.Dibujar luego la geometría transparente con el K5
Cuffer desactivado. Tener en cuenta el orden6

,so eficiente del -ard.are
,so eficiente del -ard.are

$odos de funcionamiento
$odos de funcionamiento
Difieren ./sicamente en cómo
se divide la carga del tra.a0o
entre la CP1 y la 2P1
Difieren ./sicamente en cómo
se divide la carga del tra.a0o
entre la CP1 y la 2P1

$odos de funcionamiento
$odos de funcionamiento

-odo inmediato

$as primitivas son enviadas al pipeline (
desplegadas una a una.

)o ha( memoria de las entidades grficas que
pasaron.

'jemplo:
glTex.oo$9f(444);
gl7e$tex9f(444); ::p$i(e$ 6;$ti#e
glTex.oo$9f(444);
gl7e$tex9f(444); ::seg&no 6;$ti#e

$odos de funcionamiento
$odos de funcionamiento

Displa# Lists

!e puede almacenar una secuencia de comandos
"pen#$ para ser utili4ados luego.

$as Display Lists se compilan ( almacenan en el
servidor grfico %#0U&

0ueden ser desplegadas con diferentes estados
%aplicado a toda la compilación&

Ja( ciertos comandos "pen#$ que no son
compilados %ver la especificación de glNe"List&

$odos de funcionamiento
$odos de funcionamiento

Displa# Lists /cont01

'jemplo
int ispla'List < glGenLists(=);
glNe"List(ispla'List% GL_.OMPILE);
gl7e$tex9f(444);
gl7e$tex9f(444);
glEnList();
gl.allList(ispla'List); ::ib&>ano
glT$anslatef(444);
gl.allList(ispla'List); ::ib&>ano

$odos de funcionamiento
$odos de funcionamiento

Verte) (rra#s

!e pueden ejecutar muchas primitivas grficas con
una sola llamada a "pen#$.

$os datos se almacenan en buffers de estructura
fija- lo que permite una gran optimi4ación.

$os verte9 arra(s proveen mejor rendimiento de las
aplicaciones porque formatean los datos para un
mejor acceso de memoria.

$odos de funcionamiento
$odos de funcionamiento

Verte) (rra#s /cont01

?uando se dibuja un cubo- se tiene que transmitir M
veces la información de cada vértice

Usando vertex arrays se almacena la información
de cada vértice sólo una ve4 en el hard2are
grfico- que luego se la puede utili4ar varias veces
%menos invocaciones a funciones de "pen#$&

$odos de funcionamiento
$odos de funcionamiento

Verte) (rra#s /cont01

!e pueden manejar hasta N arra(s con información
– 7E*TE1_+**+?
– .OLO*_+**+?
– NO*M+L_+**+?
– TE1T0*E_.OO*,_+**+?
– E,GE_)L+G_+**+?
– IN,E1_+**+?

$odos de funcionamiento
$odos de funcionamiento

Verte) (rra#s /cont01

'jemplo
GLfloat #olo$es@23A < B444C; ::D #olo$es
GLfloat 6e$ti#es@23A < B444C; ::D 6;$ti#es
GL&b'te ini#es@23A < B444C; ::E F&as
glEnable.lientState(GL_.OLO*_+**+?);
glEnable.lientState(GL_7E*TE1_+**+?)G
gl.olo$Pointe$(9%GL)loat%H%#olo$es);
gl7e$texPointe$(9%GL)loat%H%6e$ti#es);
gl,$a"Ele(ents(GL_I0+,S% 23%
GL_0NSIGNE,_-?TE% ini#es);

emas avan/ados
emas avan/ados

*-aders
*-aders

!istema mediante el cual se puede asociar un
programa a cada punto que es procesado por
la tarjeta de video.

$as primeras versiones eran mu( limitadas en
cuanto al tamaño del programa asociado.

$as :ltimas versiones soportan loops ( arra(s.

0ermiten implementar el modelo de iluminación
de 0hong en tiempo real.

&)emplos
&)emplos

#eneración de imgenes foto5realistas

&)emplos
&)emplos

!e puede aumentar la calidad del modelo sin
aumentar la cantidad de polígonos.

&)emplos
&)emplos

'fectos no foto5realistas %cel shading&

&)emplos
&)emplos

'fectos no foto5realistas %hatching shader&

0ocumentación
0ocumentación

'specificación

http:OO222.opengl.orgOdocumentationOspecsOversion1.POglspec1P.pdf

"pen#$ 3eference 7anual

http:OO222.opengl.orgOdocumentationOblue@booQO

"pen#$ 0rogramming #uide

http:OO222.opengl.orgOdocumentationOred@booQO

"tra información

http:OO222.opengl.orgO

http:OO222.sgi.comOproductsOsoft2areOopenglO

http:OO222.sgi.comOproductsOsoft2areOopenglOe9amplesOinde9.html

http:OO222.mesaMd.orgO