Licenciatura em Engenharia Informática e de Computadores Computação Gráfica Mapeamento de Texturas
Texturas Quando o resultado começa a parecer real Superfícies no mundo real são muito complexas Não se pode modelar todos os pequenos detalhes Como podemos então adicionar detalhe na superfície? Modelo Geométrico Modelo Geométrico + 2013 Corpo docente de Computação Gráfica Sombreamento / CG&M / DEI / IST / UTL Modelo Geométrico + Sombreamento + Texturas
Motivação Limites da Modelação Geométrica Placas gráficas pintam +100M polígonos / segundo Insuficiente para criar realismo em Nuvens Relva Terreno Pele
Exemplo Modelação de uma Laranja Queremos modelar uma laranja Começamos com uma esfera laranja Demasiado simples Substituir esfera por forma mais complexa Não trivial representar detalhes Demasiados polígonos necessários
Exemplo Modelação de uma Laranja Solução: Tirar foto de uma laranja Aplicar imagem na esfera Texture Mapping Não é suficiente porque esfera é lisa É necessário alterar a forma Usa-se bump-mapping Bump Mappping
Mapeamento de Texturas Três tipos diferentes de mapeamento Texture Mapping Usa imagens para preencher os polígonos Bump Mapping Altera as normais à superfície durante a visualização Environment (reflection) Mapping Usa um snapshot da cena para fazer texture mapping Permite simular superfícies altamente especulares sem traçado de raios
Modelo Sombreado
Texture Mapping
Environment Mapping
Bump Mapping
Onde acontece o mapeamento? No final do pipeline Eficiente porque poucos polígonos passam o recorte
Mapeamento de texturas: é simples? Apesar de ser simples mapear imagem na superfície Há 3 ou 4 sistemas de coordenadas envolvidos 2D image 3D surface
Sistemas de Coordenadas Coordenadas da Textura (s, t) Parameteriza pontos na textura com 2 coordenadas: (s,t) Coordenadas do Mundo (x, y, z) Conceptualmente, onde o mapeamento tem lugar Coordenadas do Dispositivo Onde a imagem final é realmente reproduzida (viewport coord + depth info)
Mapeamento Texturas parametric coordinates texture coordinates world coordinates device coordinates
Mapeamento de coordenadas Textura Superfície n Considere o mapeamento das coordenadas da textura para um ponto na superfície: dada uma posição (s,t) na textura, qual é a posição (x,y,z) na superfície? n Aparentemente precisamos de: n x = X(s, t) n y = Y(s, t) t (x,y,z) n z = Z(s, t) s n Mas na realidade queremos fazer exactamente o inverso The image cannot be displaye t s
Backward Mapping Na realidade queremos andar para trás Dado um fragmento, queremos saber a que ponto do objecto corresponde Dado um ponto no objecto, queremos saber a que ponto na textura ele corresponde Precisamos de ter um mapeamento s = s(x,y,z) t = t(x,y,z) Estas funções difíceis de determinar genericamente Com polígonos: Especificam-se as coordenadas (s,t) nos vértices Interpola-se (s,t) para os restantes pontos
Mapeamento de Texturas Mapeamento de Textura adiciona detalhe na superficie ao mapear padrões de textura na superfície. O padrão pode ser repetido. Por examplo, o padrão de textura (texture pattern) para o cubo à direita é: Texel = texture element. Um texel é um pixel numa textura. Por examplo, uma textura 128x128 tem 128x128 texels. No ecrã isto podem resultar em mais ou menos pixeis dependendo da distância a que está o objecto e como está escalado.
Como definir coordenadas de textura (s,t)? Defnir as coordenadas manualmente Definirmos nós as coordenadas para cada vértice Calcular as coordenadas automaticamente Usar um algoritmo que define as coordenadas da textura para nós
Especificação Manual Podemos especificar manualmente as coordenadas para cada vértice:
Mapeando Textura em Polígonos. gltexcoord2f(0.5, 0.5); glvertex3fv (10.2,3.4,4.5);.
Texturas em OpenGL Passos básicos Criar um objecto textura e espeficar a textura para esse objecto (glgentextures() and glbindtexture()); Definir os parâmetros da textura (gltexparameter(), glteximage() and gltexenv()); Activar o uso de texturas Desenhar a cena, fornecendo as coordenadas da geométricas e da textura
Criar um Objecto Textura
Especificar uma textura imagem Definir a textura imagem a partir de um array de texels em memória Glubyte my_texels[512][512][4]; Activar mapeamento de texturas glenable(gl_texture_2d)
Definir Imagem como Textura Chamar glteximage2d. Carrega a textura da memória do CPU para a memória vídeo do OpenGL, onde fica pronta a usar. glteximage2d(target, level, components, w, h, border, format, type, texels ); target: tipo textura, e.g. GL_TEXTURE_2D level: usado para mipmapping (não estudado em CG) components: elementos por texel na memória vídeo w, h: largura e altura border: usado para suavizar o repeat (não estudado em CG) format and type: descreve os texels na memória do CPU texels: ponteiro para o array de texels Example: set the current image texture: glteximage2d(gl_texture_2d, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, my_texels);
Convertendo uma imagem em textura OpenGL requer que as dimensões das texturas sejam potências de 2 Dimensões não inferiores a 64x64 Se as dimensões da image não são uma potência de 2 gluscaleimage( format, w_in, h_in, type_in, *data_in, w_out, h_out, type_out, *data_out ); data_in is source image data_out is for destination image A imagem é interpolada e filtrada durante a escala
Mapeando a Textura Baseado nas coordenadas parametricas da textura gltexcoord*() especificado em cada vértice t 0, 1 Texture Space a 1, 1 Object Space (s, t) = (0.2, 0.8) A c b 0, 0 1, 0 s (0.4, 0.2) B C (0.8, 0.4)
Código Típico
Wrapping Modes Atribuir coordenadas de textura fora do intervalo [0,1]: cortar ou repetir a textura Clamping: if s,t > 1 use color at 1, if s,t < 0 use color at 0 gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_CLAMP); Repeating : use s,t modulo 1 gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_REPEAT);
Tiling Repetitivo de Texturas Uma textura pode ser repetida através da superfície repetindo a parametrização (s,t) ao longo da superfície Os melhores efeitos obtém quando a textura facilmente composta em azulejos Isto significa que o lado direito da textura se junta suavemente com o lado esquerdo (o mesmo para o topo e fundo)
Magnification and Minification Mais de um texel para um pixel (minification) Mais de um pixel para um texel (magnification) point sampling (nearest texel) ou filtro linear (filtro 2 x 2) para obter valor da textura Textura Magnification Polígono Textura Minification Polígono
Modos de Filtragem Modos determinados por gltexparameteri( target, type, mode ) gltexparameteri(gl_texture_2d, GL_TEXURE_MAG_FILTER, GL_NEAREST); gltexparameteri(gl_texture_2d, GL_TEXURE_MIN_FILTER, GL_LINEAR); Nota: Filtro linear requer a margem com extra texel para filtrar nas arestas (border = 1) 31
Filtro de Minification Um pixel mapeia a vários texels Comum em vistas perspectivas Mau mapeamento de texturas deforma o tabuleiro Usando Mipmaps melhora-se o mapeamento, reduzindo a deformação do tabuleiro
Mipmaps Ideia base: criar texturas de tamanho decrescente usar a subtextura apropriada Pre-filtrar as texturas (mipmaps)
Mipmaps: Optimização no Armazenamento Lados da textura devem ser potências de 2
Sumário sobre Flitragem Zoom-in => filtro Magnification Zoom-out => filtro Minification Filtros mais avançados necessitam mais tempo de computação mas produzem melhores resultados Mipmapping é um filtro Minification avançado
Texturas em Mipmap Mipmapping permite o uso de texturas pre-filtradas de resoluções decrescentes Reduz erros de interpolação para pequenos objectos texturados Declara-se o nível do mipmap durante a definição da textura glteximage2d( GL_TEXTURE_*D, level, ) Nota: Não têm de usar mipmaps nos laboratórios!
Exemplo point sampling linear filtering mipmapped point sampling mipmapped linear filtering
Função de Textura Controla como a textura é aplicada gltexenv{fi}[v](gl_texture_env, prop, param ) prop pode ser: GL_TEXTURE_ENV_MODE GL_TEXTURE_ENV_COLOR Modos GL_TEXTURE_ENV_MODE modes GL_MODULATE: modula com o sombreamento calculado GL_BLEND: mistura com uma cor ambiente GL_REPLACE: usa só a cor da textura Example: gltexenvi(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_MODULATE); Definir cor de blending com GL_TEXTURE_ENV_COLOR e usar em conjunto com GL_BLEND
GL_TEXTURE_ENV_MODE modes RGBA MODE f = fragmento, t = textura, c = GL_TEXTURE_ENV_COLOR
Correcção de Perspectiva Coordenadas da textura e interpolação da cor Podem ser lineares no espaço do dispositivo Ou pode-se usar valores de profundidade/perspectiva (+lento) Especialmente para polígonos on edge glhint( GL_PERSPECTIVE_CORRECTION_HINT, hint ) Em que hint pode ser: GL_DONT_CARE GL_NICEST GL_FASTEST
Aplicar Texturas 1. Especificar texturas dos objectos 2. Definir o filtro de textura 3. Definir o Wrapping Mode 4. Definir a função de textura 5. Fazer o bind ao objecto textura 6. Activar o uso de texturas 7. Indicar coordenadas de textura para cada vértice
Exemplo do uso de Texturas A textura é imagem de 256 x 256 mapeada num polígono rectangular visualizado em perspectiva