antónio ramires fernandes + luís paulo santos- computação gráfica 08/09 computação gráfica...

34
ntónio Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08 ntónio Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08 Computação Gráfica Texturas

Upload: internet

Post on 17-Apr-2015

104 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09

Computação Gráfica

Texturas

Page 2: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 2

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)

Page 3: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 3

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).

Page 4: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 4

Texturas

• Texturas e Geometria seguem caminhos separados no pipeline gráfico, encontrando-se na fase de raster.

Page 5: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 5

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

Page 6: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 6

Texturas - Utilização

• Definição

D.1 - Carregar a imagemD.2 - Criar uma textura em OpenGLD.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

Page 7: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

D.1 – Leitura Imagem

• OpenGL não tem nenhuma função para carregar texturas de ficheiro: usar bibliotecas, tais como DeViL

DI-UM Computação Gráfica 08/09 7

#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);}

Page 8: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

D.2 – Criar Textura

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

• Criar um OBJECTO de TEXTURA identificado pior um ID único

Page 9: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

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

DI-UM Computação Gráfica 08/09 9

// 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);

Page 10: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 10

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.

glBindTexture(GL_TEXTURE_2D,texID);glBegin(GL_QUADS); glTexCoord2f(0,0);glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(1,0);glVertex3f( 1.0f, -1.0f, 0.0f); glTexCoord2f(1,1);glVertex3f( 1.0f, 1.0f, 0.0f); glTexCoord2f(0,1);glVertex3f(-1.0f, 1.0f, 0.0f);glEnd();

t in [0 .. 1]

s in [0 .. 1]

Page 11: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 11

A.1 – Aplicar Textura

glBindTexture(GL_TEXTURE_2D,1);glBegin(GL_QUADS);

glTexCoord2f(0,0);glVertex3f(-1.0f, -1.0f, 0.0f);glTexCoord2f(1,0);glVertex3f( 1.0f, -1.0f, 0.0f);glTexCoord2f(1,1);glVertex3f( 1.0f, 1.0f, 0.0f);glTexCoord2f(0,1);glVertex3f(-1.0f, 1.0f, 0.0f);

glEnd();

Page 12: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 12

A.1 – Aplicar Textura

• A escolha de coordenadas no espaço das texturas é "livre".

Page 13: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 13

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();

Page 14: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

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

Page 15: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 15

D.3 – Parameterização Revisitada

Imagem Original

// Parameterise Texture glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glBindTexture(GL_TEXTURE_2D,texID);glBegin(GL_QUADS); glTexCoord2f(0,0);glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(4,0);glVertex3f( 1.0f, -1.0f, 0.0f); glTexCoord2f(4,4);glVertex3f( 1.0f, 1.0f, 0.0f); glTexCoord2f(0,4);glVertex3f(-1.0f, 1.0f, 0.0f);glEnd();

GL_REPEAT

// Parameterise Texture glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

GL_CLAMP

Page 16: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 16

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_NEARESTAo pixel é aplicado o texel que nelemapeia

• GL_LINEARAo pixel é aplicada uma média dos texel que nele mapeiam

Page 17: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 17

Texturas - Filtros: Min

• Utilizado quando a um pixel da imagem corresponde mais do que um texel da textura

• GL_NEARESTAo pixel é aplicado o texel que nelemapeia

• GL_LINEARAo pixel é aplicada uma média dos texel que nele mapeiam

Page 18: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 18

Texturas - Filtros

Mag:Nearest

Page 19: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 19

Texturas - Filtros

Mag: Linear

pode parecerdesfocado ao perto!

Page 20: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 20

Texturas - Demos

Apresentar DEMO

Page 21: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 21

Texturas

• 1D– glTexImage1D(GL_TEXTURE_1D,...)

• 3D– glTexImage3D(GL_TEXTURE_3D,...)

Page 22: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 22

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

Page 23: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 23

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).

Page 24: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 24

Texturas - Mipmapping

• Figura do Red Book:

Page 25: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 25

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.

Page 26: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 26

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);

Page 27: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 27

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

Page 28: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

Texturas - Billboard

• Em vez de utilizar uma malha de polígonos para representar um objecto:

DI-UM Computação Gráfica 08/09 28

• Podemos usar um único polígono com uma textura correspondente às cores do objecto:

Page 29: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

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

Page 30: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

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)

DI-UM Computação Gráfica 08/09 30

(camX,camZ)

(objX,objZ)

ZZ

XX

α

obj2camobj2cam = normalize(camZ-objZ, camX-objX)

α = acos (obj2camZ)

No entanto, como cos(a)=cos(-a), if (obj2camX>0) rotate around YYif (obj2camX<0) rotate around –YY

Rotatef (a*180/PI, 0., obj2camX, 0.)

Page 31: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

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

Page 32: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

Texturas - Billboard

DI-UM Computação Gráfica 08/09 32

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(); }

Page 33: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

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

Page 34: António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Computação Gráfica Texturas

DI-UM Computação Gráfica 08/09 34

Referências

• OpenGL Programming Guide, aka Red Book, OpenGL ARB