Computação Gráfica
Texturas
António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09
Texturas
• Aplicar imagens 1D,2D ou 3D a primitivas geométricas
• Utilizações:
– Simular materiais: madeira, granito, tijolo
– Reduzir complexidade geométrica
– Simulação de fenómenos naturais (reflexões, refracção, luz,
lens flare)
DI-UM Computação Gráfica 08/09
2
Texturas – Conceito
• Para aplicar uma textura a uma entidade geométrica é necessário
definir um mapeamento entre pontos (pixels ??) da textura e
pontos (vértices??) da geometria.
• Exemplo: As texturas 2D
têm coordenadas
nos eixos s (=x),t (=y).
• glTexCoord2f(s,t).
DI-UM Computação Gráfica 08/09
3
Texturas
• Texturas e Geometria seguem caminhos separados
no pipeline gráfico, encontrando-se na fase de
raster.
DI-UM Computação Gráfica 08/09
4
Texturas
• Imagem: dimensões são potências de 2. Por exemplo: 512x512,
256 x 128, …
mas actualmente já é possível trabalhar sem esta restrição
• Exemplos de Formatos: LUMINANCE, RGB, RGBA,...
• OpenGL não tem nenhuma função para carregar texturas de
ficheiro: usar bibliotecas, tais como tgalib ou DeViL
DI-UM Computação Gráfica 08/09
5
Texturas - Utilização
• Definição
D.1 - Carregar a imagem
D.2 - Criar uma textura em OpenGL
D.3 - Definir parâmetros da textura
• Aplicação
A.1 - Definir mapeamento das coordenadas das texturas nas
coordenadas das primitivas geométricas
A.2 – Transformações geométricas das texturas
DI-UM Computação Gráfica 08/09
6
D.1 – Leitura Imagem
• OpenGL não tem nenhuma função para carregar texturas de
ficheiro: usar bibliotecas, tais como DeViL
#include <IL/il.h>
unsigned char *il_imgData;
int width, height, format, il_img;
void Load_img (char *filename) {
ilInit ();
ilGenImages (1, &il_img); // get an unique ID
ilBindImage(il_img);
// Bind this image name.
if (!ilLoadImage(filename)) return 0; // Load the image
width = ilGetInteger (IL_IMAGE_WIDTH);
height = ilGetInteger (IL_IMAGE_HEIGHT);
il_imgData = ilGetData();
format = ilGetInteger(IL_IMAGE_FORMAT);
}
DI-UM Computação Gráfica 08/09
7
D.2 – Criar Textura
• Criar um OBJECTO de TEXTURA identificado pior um ID único
int texID;
void CreateTexture () {
// create GL texture
glGenTextures (1, &texID); // get texture unique ID
glBindTexture (GL_TEXTURE_2D, texID); // bind it
// associate with data read with DevIL
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format,
GL_UNSIGNED_BYTE, il_imgData);
// Release data space created with DevIL
ilDeleteImages(1, &il_img);
}
DI-UM Computação Gráfica 08/09
8
D.3 – Parameterizar textura
• A parameterização da textura (que pode ser alterada em
qualquer momento) permite controlar alguns aspectos do seu
mapeamento na geometria
// Parameterise Texture
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
DI-UM Computação Gráfica 08/09
9
A.1 – Aplicar Textura
A especificação dos vértices dos polígonos é precedida da
especificação do ponto da textura (texel) que aí mapeia.
t in [0 .. 1]
s in [0 .. 1]
glBindTexture(GL_TEXTURE_2D,texID);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(-1.0f,
glTexCoord2f(1,0);glVertex3f( 1.0f,
glTexCoord2f(1,1);glVertex3f( 1.0f,
glTexCoord2f(0,1);glVertex3f(-1.0f,
glEnd();
DI-UM Computação Gráfica 08/09
-1.0f,
-1.0f,
1.0f,
1.0f,
0.0f);
0.0f);
0.0f);
0.0f);
10
A.1 – Aplicar Textura
glBindTexture(GL_TEXTURE_2D,1);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(-1.0f,
glTexCoord2f(1,0);glVertex3f( 1.0f,
glTexCoord2f(1,1);glVertex3f( 1.0f,
glTexCoord2f(0,1);glVertex3f(-1.0f,
glEnd();
DI-UM Computação Gráfica 08/09
-1.0f,
-1.0f,
1.0f,
1.0f,
0.0f);
0.0f);
0.0f);
0.0f);
11
A.1 – Aplicar Textura
• A escolha de coordenadas no espaço das texturas é "livre".
DI-UM Computação Gráfica 08/09
12
A.2 – Transformação de Texturas
• Matriz para Texturas
– Permite realizar transformações geométricas sobre a
textura.
glMatrixMode(GL_TEXTURE);
glTranslatef(0.5,0,0);
glRotatef(45,0,0,1);
glMatrixMode(GL_MODELVIEW);
glBegin(GL_QUADS);
...
glEnd();
DI-UM Computação Gráfica 08/09
13
Activar a aplicação de Texturas
• Por defeito a aplicação de texturas NÃO está
activada
glEnable (GL_TEXTURE_2D);
DI-UM Computação Gráfica 08/09
14
D.3 – Parameterização Revisitada
Imagem Original
glBindTexture(GL_TEXTURE_2D,texID);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(-1.0f,
glTexCoord2f(4,0);glVertex3f( 1.0f,
glTexCoord2f(4,4);glVertex3f( 1.0f,
glTexCoord2f(0,4);glVertex3f(-1.0f,
glEnd();
-1.0f,
-1.0f,
1.0f,
1.0f,
0.0f);
0.0f);
0.0f);
0.0f);
GL_REPEAT
// Parameterise Texture
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
GL_CLAMP
// Parameterise Texture
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
DI-UM Computação Gráfica 08/09
15
Texturas - Filtros: Mag
• Utilizado quando a um texel da textura corresponde mais que
um pixel da imagem final, ou seja quando a textura é ampliada
• GL_NEAREST
Ao pixel é aplicado o texel que nele
mapeia
• GL_LINEAR
Ao pixel é aplicada uma média dos texel
que nele mapeiam
DI-UM Computação Gráfica 08/09
16
Texturas - Filtros: Min
• Utilizado quando a um pixel da imagem corresponde mais do que
um texel da textura
• GL_NEAREST
Ao pixel é aplicado o texel que nele
mapeia
• GL_LINEAR
Ao pixel é aplicada uma média dos texel
que nele mapeiam
DI-UM Computação Gráfica 08/09
17
Texturas - Filtros
Mag:Nearest
DI-UM Computação Gráfica 08/09
18
Texturas - Filtros
Mag: Linear
pode parecer
desfocado ao perto!
DI-UM Computação Gráfica 08/09
19
Texturas - Demos
Apresentar DEMO
DI-UM Computação Gráfica 08/09
20
Texturas
• 1D
– glTexImage1D(GL_TEXTURE_1D,...)
• 3D
– glTexImage3D(GL_TEXTURE_3D,...)
DI-UM Computação Gráfica 08/09
21
Texturas - Mipmapping
• Do Latim “multum in parvo”.
• Problema: alterações inesperadas ao encolher
texturas à medida que a camera se afasta.
• Causa: O processo de aplicação de filtros a uma
imagem muito encolhida pode implicar alterações
abruptas à imagem projectada.
DEMO
DI-UM Computação Gráfica 08/09
22
Texturas - Mipmapping
• Solução: Utilizar múltiplas texturas de diferentes
resoluções para utilizar a escalas diferentes.
• Por exemplo: textura original 32 x 16
• Fornecer texturas: 32x16, 16x8, 8x4, 4x2, 2x1, 1x1.
• É necessário fornecer uma sequência de níveis
consecutivos (potências de 2).
DI-UM Computação Gráfica 08/09
23
Texturas - Mipmapping
• Figura do Red Book:
DI-UM Computação Gráfica 08/09
24
Texturas - Mipmapping
4 combinações disponíveis para filtrar uma textura
(GL_MIN_FILTER):
•
•
•
•
GL_NEAREST_MIPMAP_NEAREST
GL_LINEAR_MIPMAP_NEAREST
GL_NEAREST_MIPMAP_LINEAR
GL_LINEAR_MIPMAP_LINEAR
O primeiro filtro diz respeito à textura, o segundo ao mipmapping.
DI-UM Computação Gráfica 08/09
25
Texturas - Mipmapping
•
O OpenGL exige que se especifiquem as diferentes imagens para os
diferentes níveis da pirâmide de resolução:
glTexImage2D
(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, imgData0);
glTexImage2D
(GL_TEXTURE_2D, 1, GL_RGBA, width/2, height/2,
0, format, GL_UNSIGNED_BYTE, imgData1);
…
•
GLU permite a criação automática dos níveis necessários para o
mipmapping:
gluBuild2DMipmaps
(GL_TEXTURE_2D, GL_RGBA, width, height,
GL_RGBA, GL_UNSIGNED_BYTE, imageData);
DI-UM Computação Gráfica 08/09
26
Texturas - Mipmapping
glBindTexture(GL_TEXTURE_2D,texName[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
GL_NEAREST_MIPMAP_NEAREST);
,
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height,
GL_RGB, GL_UNSIGNED_BYTE, imageData);
DEMO
DI-UM Computação Gráfica 08/09
27
Texturas - Billboard
• Em vez de utilizar uma malha de polígonos para representar um
objecto:
• Podemos usar um único polígono
com uma textura
correspondente às cores do
objecto:
DI-UM Computação Gráfica 08/09
28
Texturas - Billboard
• A técnica de billboarding pode ser usada para reduzir
o número de polígonos necessários para modelar um
objecto, desde que:
– A câmara não se aproxime demasiado do billboard
– O billboard esteja sempre orientado de forma a apresentar a
sua face à câmara
DI-UM Computação Gráfica 08/09
29
Texturas - Billboard
• Suponhamos que o polígono é desenhado no ponto (objX,objZ),
paralelo ao eixo dos YY e com a face frontal orientada ao longo
do eixo dos XX
• A câmara está na posição (camX,camZ) com uma view direction
igual a 0 em YY (olha na horizontal)
(objX,objZ)
ZZ
obj2cam
α
(camX,camZ)
XX
DI-UM Computação Gráfica 08/09
obj2cam = normalize(camZ-objZ, camX-objX)
α = acos (obj2camZ)
No entanto, como cos(a)=cos(-a),
if (obj2camX>0) rotate around YY
if (obj2camX<0) rotate around –YY
Rotatef (a*180/PI, 0., obj2camX, 0.)
30
Texturas - Billboard
void billboardBegin(float cX, float cZ, float oX, float oZ) {
float obj2Cam[3], onorm, angleCos;
glPushMatrix();
obj2Cam[XX] = camX - objPosX ;
obj2Cam[YY] = 0;
obj2Cam[ZZ] = camZ - objPosZ ;
onorm = sqrt(obj2Cam[XX]*obj2Cam[XX]+obj2Cam[ZZ]*obj2Cam[ZZ]);
obj2Cam[XX] /= onorm;
obj2Cam[ZZ] /= onorm;
angleCos = obj2Cam[ZZ];
if ((angleCos < 0.99990) && (angleCos > -0.9999))
glRotatef(acos(angleCos)*180/PI, 0., obj2Cam[XX], 0.);
}
DI-UM Computação Gráfica 08/09
31
Texturas - Billboard
void billboardEnd() {
glPopMatrix();
}
void drawTree () {
billboardBegin(cam_pos[XX], cam_pos[ZZ], x, z);
glColor3f(0.0,0.0,0.0);
glBindTexture (GL_TEXTURE_2D, treeTex);
glBegin(GL_QUADS);
glTexCoord2f(0.,0.); glVertex3f (-2.,0.,0.);
glTexCoord2f(1.,0.); glVertex3f (2.,0.,0.);
glTexCoord2f(1.,1.); glVertex3f (2.,5.,0.);
glTexCoord2f(0.,1.); glVertex3f (-2.,5.,0.);
glEnd();
billboardEnd();
}
DI-UM Computação Gráfica 08/09
32
Texturas – Billboard: transparência
• R,G,B,A – Alpha: medida de opacidade
• A=0 : pixel transparente
• A=1 : pixel opaco
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0);
// o pixel da textura só é desenhado se
alpha for maior do que 0
DI-UM Computação Gráfica 08/09
33
Referências
• OpenGL Programming Guide, aka Red Book, OpenGL ARB
DI-UM Computação Gráfica 08/09
34
Download

03-Texturas - HPC