Mapeamento de Texturas
Motivação - Cenas mais realistas
● Imagine que você precisa
criar um ambiente com uma parede como a
representada pela imagem ao lado
● Solução 1: Dividir a cena
em polígonos
suficientemente pequenos para representar os
detalhes
● Problema: Difícil de
Sumário
●
Hoje veremos como utilizar a técnica de
mapeamento de textura para adicionar
detalhes aos objetos em sistemas de CG
●
Discutiremos seu sistema de coordenadas e
Motivação - Cenas mais realistas
●
A principal motivação de utilizarmos texturas
é adicionar realismo com o menor custo
computacional possível
●
Objetos renderizados com os modelos de
reflexão vistos anteriormente fornecem uma
aparência pouco realista
Noção de Textura
●Uma
textura
pode ser
uma imagem com
componentes RGB e
alpha.
●
O
mapeamento de
textura
é um método
para criar complexidade
numa imagem sem o
ônus de construir
Definições
●
Técnica foi desenvolvida por Catmull (1974),
Blinn e Newell (1976) e outros pesquisadores
●
Em mapeamento de texturas, o pixel é
chamado de texel (abreviatura de
texture
element
)
●
Uma textura de resolução 128 x 128 possui
Propriedades Mapeáveis
● Quais parâmetros ou propriedades pode-se reproduzir a partir de
mapas de textura?
● Cor (coeficientes de reflexão
Propriedades Mapeáveis
● Quais parâmetros ou propriedades pode-se reproduzir a partir de
mapas de textura?
● Cor (coeficientes de reflexão
difusa)
● Coeficientes de reflexão especular
e difusa
Propriedades Mapeáveis
● Quais parâmetros ou propriedades pode-se reproduzir a partir de
mapas de textura?
● Cor (coeficientes de reflexão
difusa)
● Coeficientes de reflexão especular
e difusa
● Mapeamento de ambiente
● Perturbação do vetor normal
Propriedades Mapeáveis
● Quais parâmetros ou propriedades pode-se reproduzir a partir de
mapas de textura?
● Cor (coeficientes de reflexão
difusa)
● Coeficientes de reflexão especular
e difusa
● Mapeamento de ambiente
● Perturbação do vetor normal
● Bump Mapping
● Perturbação da superfície na
direção da normal
Propriedades Mapeáveis
● Quais parâmetros ou propriedades pode-se reproduzir a partir de
mapas de textura?
● Cor (coeficientes de reflexão
difusa)
● Coeficientes de reflexão especular
e difusa
● Mapeamento de ambiente
● Perturbação do vetor normal
● Bump Mapping
● Perturbação da superfície na
direção da normal
● Displacement Mapping
Mapeamento de textura
● Texturas 2D são funções T (s, t) cujo domínio é um
espaço bidimensional e o contradomínio 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
t
s
1
1 0
Mapeamento de Textura
● Problema: Que ponto da textura será utilizado
em um dado ponto da superfície?
● A textura é simplesmente uma imagem com um
sistema de coordenadas 2D (s,t)
● Define-se o mapeamento de (x,y,z) do domínio
da cena para o domínio da textura (s,t) ● Para determinar a cor em (x,y,z) usa-se o
correspondente (s,t) da textura nesse ponto
● Com polígonos, especifica-se (s,t) nos vértices e
Mapeamento de Textura
● O problema básico está em encontrar a função
(mapping) que mapeia a textura para a superfície
● Dada uma posição (s,t) da textura, qual é a
posição (x,y,z) na superfície?
● Este problema requer 3 funções paramétricas:
● x = X(s, t)
● y = Y(s, t)
● z = Z(s, t)
● No caso da superfície já estar formulada
Mapeamento de texturas em polígonos
●
Especificamos explicitamente as
coordenadas (
u, v
) nos vértices do polígono,
ou seja, afixamos a textura nos vértices
●
Faz-se então a interpolação dentro do
polígono durante o processo de rasterização,
de forma semelhante ao que é feito no
Função de Mapeamento
● Uma função de mapeamento retorna o ponto do
objeto correspondente a cada ponto do espaço de textura
(x, y, z) = F (s, t)
● Corresponde à forma com que a textura é usada
para “embrulhar” (wrap) o objeto
● Na maioria dos casos precisamos de uma função que
nos permita “desembrulhar” (unwrap) a textura do objeto, isto é, a inversa da função de mapeamento (mesmo vale para o próprio modelo)
● Se a superfície do objeto puder ser descrita em
Função de mapeamento
●
Algumas formas paramétricas que podem ser
utilizadas em mapeamento de textura são:
Parametrização cúbica
Parametrização
Parametrização Cilíndrica
Parametrização cilíndrica
Projetada em um cubo
Parametrização esférica
Parametrização
Parametrizando Objetos Genéricos
● O que fazer quando o objeto não
comporta uma parametrização natural?
● Uma sugestão é usar um mapeamento
em 2 estágios [Bier e Sloan]:
● Mapear textura sobre uma superfície
simples como cilindro, esfera, etc aproximadamente englobando o objeto
● Mapear superfície simples sobre a
superfície do objeto. Pode ser feito de diversas maneiras
● Raios passando pelo centróide do objeto ● Raios normais à superfície do objeto
● Raios normais à superfície simples
UV Mapping
●
Outra técnica muito utilizada em
aplicações 3D é fazer o processo inverso
– mapear o modelo sobre a textura plana
●
Para tal, é necessário “planificar” a malha
poligonal (também conhecido como
UV
Unwrapping)
●
A textura será projetada diretamente sobre
UV
Map
pin
g -
Exemp
lo
UV
Map
pin
g -
Exemp
lo
UV
Map
pin
g -
Exemp
lo
UV
Map
pin
g -
Exemp
lo
Mapeamento de Texturas em OpenGL
●
Como já discutido, polígonos são
frequentemente usados para representar
fronteiras de objetos
●
Em OpenGL, além das coordenadas dos
vértices e do vetor normal, é possível
também especificar coordenadas de textura:
glBegin (GL_POLYGON);
glNormal3fv (N); glTexCoord2fv (T); glVertex3fv (V); ...
Mapeamento de Texturas em OpenGL
●
Ligar o mapeamento de texturas
glEnable(GL_TEXTURE_2D);
●
Especificar a textura
→ Usar o comando glTexImage2D que tem o formato
void glTexImage2D (GLenum target, GLint mipMapLevel,
GLint internalFormat, GLsizei width, GLsizei height, GLint borderWidth, GLenum format, GLenum type,
const GLvoid *pixels);
→ Exemplo de utilização:
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);
→ Detalhes sobre este comando aqui
● As cores dos texels são processadas pela parte do
● Baseado em coordenadas paramétricas de textura ● Chamar glTexCoord*() para cada vértice
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
Espaço de Textura Espaço do Objeto
Modos de aplicação de Textura
● Ao utilizarmos texturas temos várias opções que
alterarão a forma como ela será aplicada. Entre elas abordaremos:
● Modificação da cor dos objetos com textura
● Wrapping Modes
Modificação da cor dos objetos
● Veja abaixo as principais opções de mistura entre
a cor de uma determinada superfície e a textura a ser aplicada:
● modulate: multiplica a cor da superfície pela
cor da textura (apropriado para sistemas com efeitos de iluminação);
● replace: substitui cor da superfície pela cor da
textura (ignora efeitos de iluminação);
● blend: semelhante à modulate, mas a mistura é
Modificação da cor dos objetos
●
O comando abaixo será utilizado para alterar a
cor dos objetos com aplicação de textura
glTexEnv{fi}[v](GL_TEXTURE_ENV, prop, param )
onde se
prop = TEXTURE_ENV_MODE, parampode
assumir os valores:
● GL_MODULATE (modo default) ● GL_REPLACE
● GL_BLEND (para este modo a cor a ser misturada é
definida pelo comando glTexEnv com
Modificação da cor dos objetos
GL_REPLACE GL_MODULATE GL_BLEND
Wrapping Modes
●
Para definir como as texturas se comportarão
fora da área definida entre [0,1] (para
s
e
t
)
podemos definir os seguintes
Wrapping Modes:
● Repeat – repete a textura
● Clamp – Estende a borda da textura
● Exemplos:
Wrapping Modes
Filtragem
Textura Polígono Magnificação Minificação Polígono Textura Exemplo:glTexParameteri( target, type, mode );
GL_TEXTURE_2D
GL_TEXTURE_1D GL_TEXTURE_MAG_FILTERGL_TEXTURE_MIN_FILTER
Filtro de minificação
● Usado quando um pixel é mapeado para muitos texels ● Comum em cenas com perspectiva
Perspectiva (foreshortening) e
Filtro de magnificação
● Quando um pixel é mapeado para uma pequena
porção de um texel, o resultado é que muitos pixels são mapeados para o mesmo texel
● Sem um método de filtragem surge o fenômeno de
aliasing
● O filtro de magnificação suaviza a transição entre os
pixels
Texturas Mipmap
● Permite que texturas de diferentes níveis de resolução sejam
aplicadas de forma adaptativa
● Reduz problemas de aliasing gerados por erros de
interpolação
● O nível (level) da textura na hierarquia mipmap é
especificada durante a definição da textura
glTexImage*D( GL_TEXTURE_*D, level, … )
● GLU possui rotinas auxiliares para construir texturas mipmap
com filtragem adequada
gluBuild*DMipmaps( … )
● OpenGL suporta facilidades mais sofisticadas para níveis de
Texturas Mipmap
Algumas Facilidades do OpenGL
● Objetos de Textura (Texture Objects)
● Permite mudar rapidamente de texturas durante a
renderização de diversos objetos
● Controle de espaço na memória de texturas
● Texturas residentes na placa são mais rápidas
● Multitexturas (Extensões OpenGL)
● Suportado por placas da NVidia e ATI
● Mais de uma textura mapeada no mesmo objeto ● Permite uma série de efeitos interessantes
Saiba mais!
● Computação Gráfica - Teoria e
Prática.
● Capítulo 7
Na Seção 7.4 deste capítulo há um detalhamento das técnicas de
Saiba mais!
● OpenGL Programming Guide
Seventh Edition
● Capítulo 9
Neste capítulo há um enfoque
Saiba mais!
● Computer Graphics, C Version
● Capítulo 14
Na seção 14.9 os principais métodos de mapeamento de
Saiba mais!
● Learn OpenGL
● Capítulo 7
A forma como texturas são
trabalhadas com shaders é
bastante semelhante à feita
pelo OpenGL tradicional,
porém, possui novos
recursos. Neste capítulo
Resumo
●
Vimos nesta aula como podemos aumentar o
detalhamento de objetos 3D através do
mapeamento de texturas
●
Um dos principais problemas no processo de
mapear uma textura em um objeto é
encontrar uma função que faça o
mapeamento dos vértices que compõem um
polígono sobre as coordenadas de textura
●
Finalmente vimos que o OpenGL fornece
Prática 1
● Execute o tutorial “Texture” do Nate Robins
(arquivo tutors.zip) para entender o
Prática 2
● Abra o projeto Texture Mapping
● Analise o funcionamento do sistema de texturas
Prática 3
● Abra o projeto
Textured OBJ Files
● Verifique no código como
é feito o carregamento dos objetos via arquivo e as texturas com um leitor externo de arquivos PNG
Exercício 1
● Faça modificações no
arquivo original (Projeto
Texture Mapping) para
criar um cubo com texturas como a figura ao lado
● Para isso, não utilize o
cubo disponível no
OpenGL. Crie um cubo manualmente, com as coordenadas de textura
corretas e centro na origem
Exercício 2
● A ideia do exercício é criar
um cilindro texturizado
● Para tal, siga os seguintes
passos:
● Utilize as texturas "wood.png" e "woodtop.png" disponíveis na pasta "data"
● Pesquise (ou formule) formas de parametrizar um cilindro para que a textura seja