Você está na página 1de 33

Introduo Computao Grfica

Texturas

Claudio Esperana
Paulo Roma Cavalcanti
Detalhes de Superfcies

Modelos de iluminao no so apropriados para


descrever todas as diferenas de cor observveis em
uma superfcie
Superfcies pintadas com padres ou imagens
A capa ou uma pgina de um livro
Superfcies com padres regulares
Tecidos ou uma parede de tijolos
Em princpio possvel modelar esses detalhes com
geometria e usando materiais de propriedades
ticas distintas
Na prtica, esses efeitos so modelados usando uma
tcnica chamada mapeamento de textura
Mapeamento de Textura

A idia reproduzir sobre a superfcie de algum


objeto da cena as propriedades de alguma funo
ou mapa - bidimensional (cor, por exemplo)
Propriedades Mapeveis

Quais parmetros ou
propriedades pode-se
reproduzir a partir de mapas:
Cor (coeficientes de reflexo
difusa)
Coeficientes de reflexo
especular e difusa
Mapeamento de ambiente
Perturbao do vetor normal
Bump Mapping
Perturbao da superfcie na
direo da normal
Displacement Mapping
Transparncia / opacidade
Espao de Textura
Texturas 2D so funes T (s, t) t
cujo domnio um espao
bidimensional e o 1
contradomnio pode ser cor,
opacidade, etc
comum ajustar a escala da
imagem de tal forma que a
imagem toda se enquadre no
intervalo 0 s, t 1
Normalmente a funo em si
derivada de alguma imagem
capturada 0
Se a imagem est armazenada 0 1 s
numa matriz
Im [0..N1 , 0..M1]
Ento
T (s, t) = Im [ (1 s) N , t M ]
Espao de Textura

Pode ser vantajoso assumir


que o padro da imagem se
repete fora desse intervalo
T (s, t) =
Im [ (1 s) N mod N,
t M mod M ]
A funo de textura pode
ser tambm definida
algebricamente:

T ( s, t ) ( s 0.5) 2 (t 0.5) 2
Funo de Mapeamento

Retorna o ponto do objeto correspondente a cada


ponto do espao de textura
(x, y, z) = F (s, t)
Corresponde forma com que a textura usada
para embrulhar (wrap) o objeto
Na verdade, na maioria dos casos, precisamos de uma
funo que nos permita desembrulhar (unwrap) a
textura do objeto, isto , a inversa da funo de
mapeamento
Se a superfcie do objeto pode ser descrita em forma
paramtrica esta pode servir como base para a
funo de mapeamento
Parametrizao da Esfera
Funo de mapeamento
z
x( , ) sin cos t
y ( , ) sin sin 2 s

z ( , ) cos

y

Funo de mapeamento inversa

x arccos z
arccos z t

y y
arctan arctan
x x
s
2
Parametrizao do Cilindro
Funo de mapeamento
z
x cos 2 s
y sin z t
zz

Funo de mapeamento inversa


x
arctan
y
s
x 2
zz tz
Parametrizando Objetos Genricos
O que fazer quando o objeto no
comporta uma parametrizao natural?
Uma sugesto usar um mapeamento
em 2 estgios [Bier e Sloan]:
Mapear textura sobre uma superfcie
simples como cilindro, esfera, etc
aproximadamente englobando o
objeto
Mapear superfcie simples sobre a
superfcie do objeto. Pode ser feito de
diversas maneiras
Raios passando pelo centride do
objeto
Raios normais superfcie do objeto
Raios normais superfcie simples
Raios refletidos (environment mapping)
Exemplos

Parametrizao Projetada em Projetada em


cbica uma esfera um cilindro
Exemplos

Parametrizao Projetada em Projetada em


cilndrica uma esfera um cubo
Exemplos

Parametrizao Projetada em Projetada em


esfrica um cubo um cilindro
Processo de Mapeamento de Texturas
Projeo do pixel sobre a Mapeamento inverso
superfcie Coordenadas dos vrtices
Pontos da superfcie no espao de textura
correspondentes aos
vrtices do pixel Mdia
Parametrizao Cor mdia dos Texels
Coordenadas paramtricas proporcional rea coberta
dos vrtices do pixel pelo quadriltero
projetados
T-1 vis * T-1
u texel i
v
j
pixel

Tvis T s
Mapeamento de Texturas em Polgonos

Polgonos so freqentemente usados para


representar fronteiras de objetos
Em OpenGL, alm das coordenadas dos
vrtices e do vetor normal, possvel
tambm especificar coordenadas de textura:
glBegin (GL_POLYGON);
glNormal3fv (N);
glTexCoord2fv (T);
glVertex3fv (V);
...
glEnd ();
Mapeamento de Texturas em Polgonos

A maneira mais simples e rpida:


Projetar os vrtices do polgono na imagem
A cada vrtice projetado Pi corresponde um
ponto Qi no espao de textura
Um pixel P do polgono na imagem dado
por uma combinao afim. Ex.:
P = 1P1 + 2P2 + 3P3
Pixel P pintado com a cor do texel obtido
com a mesma combinao afim. Ex.:
Q = 1Q1 + 2Q2 + 3Q3
Mapeamento de Texturas em Polgonos
Problemas da abordagem
simples:
Aliasing
Pixel <> Texel
Solues:
Interpolao
Mip-mapping
Deformao
Combinaes afim no
so preservadas em
projees perspectivas
Solues:
Mais vrtices
Coordenadas
homogneas
Mapeamento de Texturas em OpenGL

1. Ligar o mapeamento de texturas


glEnable(GL_TEXTURE_2D);
2. Especificar a textura
Usar glTexImage2D que tem o formato
void glTexImage2D (GLenum target, GLint level, GLint
internalFormat, GLsizei width, GLsizei height, GLint border,
GLenum format, GLenum type, const GLvoid *pixels);
Exemplo:
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0,
GL_RGBA, GL_UNSIGNED_BYTE, img);
Mapeamento de Texturas em OpenGL
1. Configurar diversos parmetros
Modos de filtragem
Magnificao ou minificao
Filtros mipmap de minificao
Modos de repetio de padres
Cortar ou repetir
Funes de aplicao de textura
Como misturar a cor do objeto com a da textura
Misturar, modular ou substituir texels
2. Especificar coordenadas de textura
Por vrtice
glTexCoord*
Coordenadas computadas automaticamente
glTexGen*
Especificando Poly.
Per
Vertex

imagem de textura CPU DL


Texture
Raster Frag FB

Pixel

Imagem de textura normalmente carregada a


partir de um array de texels na memria
principal
glTexImage2D( target, level, components,
w, h, border, format, type, *texels );
Tamanho da imagem tem ser potncia de 2
Cores dos texels so processadas pela parte
do pipeline que processa pixels
Boa parte do repertrio de operaes sobre
bitmaps pode ser usada
Convertendo Imagem de Textura

Se o tamanho da imagem no uma potencia de 2


gluScaleImage( format, w_in, h_in,
type_in, *data_in, w_out, h_out,
type_out, *data_out );
*_in = imagem original
*_out = imagem destino
Imagem interpolada e filtrada durante a escala
Outros mtodos para especificar texturas

Usar o frame buffer como fonte da imagem de textura


glCopyTexImage1D(...)
glCopyTexImage2D(...)
Modificar parte de uma textura pr-definida
glTexSubImage1D(...)
glTexSubImage2D(...)
glTexSubImage3D(...)
Mapeando a Poly.
Per
Vertex

Textura
CPU DL Raster Frag FB
Texture
Pixel

Baseado em coordenadas paramtricas de textura


Chamar glTexCoord*() para cada vrtice

Espao de Textura Espao do Objeto


t 1, 1 (s, t) = (0.2, 0.8)
0, 1 A
a

c (0.4, 0.2)
b
B C
0, 0 1, 0 s (0.8, 0.4)
Gerando Coordenadas de Texturas
Automaticamente
Habilitar a gerao automtica de coordenadas de textura
glEnable (GL_TEXTURE_GEN_{STRQ});
Especificar parmetros
void glTexGen{ifd} (GLenum coord, GLenum pname, TYPE param);
void glTexGen{ifd}v (GLenum coord, GLenum pname, TYPE *param);
Qual coordenada de textura?
Coord = GL_S / GL_T / GL_R / GL_Q
Plano de referncia
Pname = GL_OBJECT_PLANE / GL_EYE_PLANE
Param = coeficientes A/B/C/D do plano
Modos de gerao de coordenadas
Pname = GL_TEXTURE_GEN_MODE
Param = GL_OBJECT_LINEAR / GL_EYE_LINEAR /
GL_SPHERE_MAP
Gerao Automtica de Coordenadas de
Textura
GL_EYE_LINEAR
Gerao Automtica de Coordenadas de
Textura
GL_OBJECT_LINEAR
GL_NEAREST

Filtragem GL_LINEAR
GL_NEAREST_MIPMAP_NEAREST
GL_NEAREST_MIPMAP_LINEAR
GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_LINEAR_MIPMAP_NEAREST
GL_TEXTURE_1D GL_TEXTURE_MIN_FILTER GL_LINEAR_MIPMAP_LINEAR

Exemplo:
glTexParameteri( target, type, mode );

Textura Polgono Textura Polgono


Magnificao Minificao
Texturas Mipmap

Textura original

Imagens minificadas
pr-filtradas
Texturas Mipmap

Permite que texturas de diferentes nveis de resoluo


sejam aplicadas de forma adaptativa
Reduz aliasing devido a problemas de interpolao
O nvel da textura na hierarquia mipmap especificada
durante a definio da textura
glTexImage*D( GL_TEXTURE_*D, level, )
GLU possui rotinas auxiliares para construir texturas
mipmap com filtragem adequada
gluBuild*DMipmaps( )
OpenGL 1.2 suporta facilidades mais sofisticadas para
nveis de detalhe (LOD)
Modos de Repetio

Exemplo:
glTexParameteri( GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_CLAMP )
glTexParameteri( GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_REPEAT )

s
GL_REPEAT GL_CLAMP
textura
Modos de Aplicao de Textura

Controla como a cor da textura afeta a cor do


pixel
glTexEnv{fi}[v](GL_TEXTURE_ENV, prop, param )
Modos (prop = TEXTURE_ENV_MODE)
GL_MODULATE
GL_BLEND
GL_REPLACE
Cor a ser misturada (GL_BLEND)
Especificada com prop = GL_TEXTURE_ENV_COLOR
Correo Perspectiva
Mapeamento de texturas em polgonos pode ser
feito:
Da forma simples e rpida (interpolao linear)
Usando interpolao em coordenadas homogneas
Comportamento do OpenGL influenciado por
dicas (hints)
glHint( GL_PERSPECTIVE_CORRECTION_HINT, hint )
onde hint pode ser
GL_DONT_CARE
GL_NICEST
GL_FASTEST
O OpenGL no necessariamente obedece!
Outras Facilidades

Objetos de Textura (Texture Objects)


Permite mudar rapidamente de texturas durante a
renderizao de diversos objetos
Controle de espao na memria de texturas
Texturas residentes na placa so mais rpidas
Multitexturas (Extenses OpenGL)
Placas + modernas (NVidia GeForce /ATI Radeon)
Mais de uma textura mapeada no mesmo objeto
Permite uma srie de efeitos interessantes
Shadow mapping
Bump mapping