TEXTURAS A utilização de luzes e tonalização conferem um certo realismo ao cenário porém nem sempre são suficientes para transmitir um visual natural ou um aspecto áspero ao material, por exemplo. A aspereza de uma superfície pode ser reproduzida através do refinamento de malha representando pequenas reentrâncias e/ou saliências acompanhadas de uma iluminação adequada. Dessa forma seria possível modelar a casca de uma laranja com suas variações de tonalidade e aparência rugosa... ou a lataria de um automóvel,...
REFINAMENTO DE MALHA
TEXTURAS Problema: a estratégia baseada apenas no refinamento da malha pode gerar um modelo geométrico muito pesado. A alternativa mais prática é utilizar técnicas tais como a texturização e/ou bumping mapping.
Comparativo Apenas Iluminação Mapeamento de textura + Iluminação Bumping mapping + Iluminação
TEXTURAS Uma das técnicas mais simples de texturização aplica o conceito de mapeamento de textura. No mapeamento de textura existe em um espaço de textura o qual é mapeado para o espaço do objeto e deste para a janela no dispositivo gráfico de saída. É necessário uma função de mapeamento entre coordenadas (s,t) do espaço de textura para coordenadas (x,y,z) no espaço do objeto. Esse mapeamento pode ser direto ou utilizar uma superfície auxiliar intermediária.
Uma das estratégias de realização de textura é através de um mapeamento direto (mapping). Edward Angel,2000 Uma função mapeia coordenadas de textura em coordenadas geométricas do objeto as quais são projetadas em coordenadas de tela. Um texel T(s,t) no padrão de textura é mapeado em um pixel p(u,v). Esse mapeamento é inversível.
Edward Angel,2000 Um texel T(s,t) no padrão de textura é mapeado em um pixel p(u,v). Esse mapeamento é inversível. u u min u max u min = s s min s max s min O mesmo raciocínio para a dimensão v em relação a r v v min v max v min = r r min r max r min
O mapeamento direto é de fácil aplicação porém não leva em conta a curvatura dos objetos. Seu uso é limitado a superfícies planas simples. Uma outra maneira de realizar o mapeamento é chamada Two- part mapping, a qual utiliza um objeto intermediário entre a textura (plana) e o objeto final.
A esfera é facilmente parametrizável e utilizada para esse fim... (π/4 ϕ π/2, 0 θ π/2) e (0 s 1, 0 t 1)
NA PRÁTICA O PROCESSO É INVERSO: do objeto para a textura De maneira simplória é como se raios saíssem do centro do modelo (cubo) interceptando um ponto (x,y,z) mapeado para a esfera (φ,θ) e desta para a textura em (s,t).
então o ponto da esfera é mapeado para o espaço (s,t) da textura... Através das inversas das expressões: x(φ,θ)=senφsenθ y(φ)= cosφ z(φ,θ)=senφcosθ Obtemos os ângulos (φ,θ), então utilizando: φ=π/4 π/4 t, θ= π/2 s determinamos (s,t) e o valor da textura na imagem de textura.
O ponto da esfera é mapeado para o espaço (s,t) da textura... O ponto (x,y,z) do objeto é então pintado com o valor determinado na textura em (s,t)... O processo é repetido e a textura aplicada ao objeto como um todo...
Alternativamente, um cilindro também pode ser aplicado com a mesmo finalidade...
Bumping Mapping O mapeamento de textura pode não ser suficiente A imagem de textura não varia o aspecto em função de uma rotação sob luz ambiente por exemplo. Em complemento, é usual utilizar outras técnicas, tais como: Bumping mapping: perturbação da normal de maneira que a tonalização, no ponto, exiba uma variação que simula uma mudança na superfície do objeto.
Anti-aliasing - Mip Mapping Os objetos texturizados são desenhados a distancias variadas do observador. Isto provoca um efeito visual desagradável e pouco natural (imagem esquerda) devido ao fenômeno chamado aliasing. Uma maneira de tratar esta situação é aplicar o mip mapping. Mip mapping é o processo pelo qual é produzido um conjunto de mapas de textura de resoluções gradualmente menores. Através do Mipmapping o OpenGL aplica o nível apropriado de detalhe para uma textura durante a renderização (Imagem direita).
glbindtexture(gl_texture_2d, texture_id[index]); Associa um identificador de textura a uma textura bidimensional O Array de textura pode ser criado em memória ou lido/carregado a partir de um arquivo gráfico com a imagem de textura: void CarregaTextura(char* Filename, GLuint Index){ imagemtextura = auxdibimageload(filename); glgentextures(1, &texture_id[index]); glbindtexture(gl_texture_2d, texture_id[index]);... } Carga de um arquivo gráfico seguida de glgentextures() e glbindtexture() para parametrizar a textura carregada glgentextures(1, &texture_id[index]); Determina um nome para a textura carregada referenciada por texture_id[index]
Algumas funções OpenGl para TEXTURA gltexcoord2f(0.0,0.0) glvertex3fv(1.0,1.0.1.0) Associa a origem das coordenadas de textura com o vértice determinado pelo ponto (1,1,1) glenable(...): habilita a texturização
Algumas funções OpenGl para TEXTURA gltexparameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); gltexparameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); Controla como a textura é tratada ao ser aplicada sobre o objeto, no caso, nas direções s e t do espaço de textura, a textura será repetida no objeto.
Algumas funções OpenGl para TEXTURA glteximage2d( GL_TEXTURE_2D,..., width,height,..., image) Especifica uma série de parâmetros importantes, tais como: o modo de textura, as dimensões do array do padrão de textura, o ponteiro para o os dados de textura...
A operação de texturização pode ser entendida como uma parte da tonalização A medida que os valores de textura são determinados, a tonalização é aplicada para os pontos visíveis (testados através do algoritmo do z- buffer, por exemplo) esfera e o cilindro são duas superfíto utilizadas como intermediárias. A imagem de textura tem que ter dimensões na base dois: 128x128, 256x64, 1024x512... Problemas podem acontecer: Edward Angel, 2000
Boas fontes http://www.flipcode.com/archives/advanced_opengl_texture_mapping.sh http://fly.cc.fer.hr/~unreal/theredbook/chapter09.html www.nullterminator.net/gltexture.html http://www.inf.pucrs.br/~manssour/cg/p-textura/index.html
Exercícios: 1) Mapeamento direto: Considere o espaço de imagem com 32x32 pixels e um espaço de textura (U,W), conforme abaixo. Encontre a função de mapeamento do intervalo de pixels [(16,16),(32,32)] em relação ao espaço de textura. Pinte os pixels de acordo conm esse mapeamento.
2) Two-Part-Mapping: considere o setor da esfera os seguintes pixels (espaço de imagem) associados aos respectivos pontos do modelo 3D (espaço do objeto): Px Py x y z 21 15 0.795 0.493 0.341 22 15 0.826 0.479 0.296 22 16 0.802 0.532 0.272 21 16 0.771 0.545 0.329 Determine as coordenadas (ϕ,θ) mapeamento para o setor da esfera (objeto auxiliar de texturização exibido abaixo) e respectivas coordenadas (u,w) no espaço de textura. (π/4 ϕ π/2, 0 θ π/2) e (0 u 1, 0 w 1) Px Py ϕ θ u w 21 15 22 15 22 16 21 16