Vous êtes sur la page 1sur 17

Trabalho

Texturas

Computao Grfica
Aulas prticas

Departamento de Engenharia Informtica Faculdade de Cincias e Tecnologia Universidade de Coimbra

JHenriques, BCabral, DBaccan

Maro de 2010

Computao Grfica | Trabalho 4 Texturas

ndice
ndice...................................................................................... ndice...................................................................................... 1 ................................................................ ................................................................ ......................................... 1. Introduo ......................................................................... 2 1.1 Descrio .............................................................................................2 1.2 Aces .................................................................................................2 ......................................................... 2. Texturas em OpenGL ......................................................... 3 2.1 2.2 2.3 2.4 Introduo............................................................................................3 Criao de texturas ...............................................................................4 Aplicao de texturas ............................................................................5 Parmetros/propriedades.......................................................................5
2.4.1 Ler uma Imagem ............................................................................................ 6 2.4.2 Modo de mapeamento ................................................................................... 6 2.4.3 Parmetros da textura (filtros e repeties) ....................................................... 7 2.4.4 Construir a textura .......................................................................................... 8 2.4.5 Aplicao de texturas..................................................................................... 9

2.5 Objectos Esfricos...............................................................................11 ................................................................ 3. Implementao ................................................................ 12 3.1 O que est implementado ...................................................................12 3.2 O que se pretende implementar ...........................................................12 3.3 Cdigo fornecido................................................................................12

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

1. Introduo
Este trabalho tem como objectivo principal o estudo e a aplicao de texturas. Em concreto, pretende-se efectuar a integrao destes efeitos cena (mesa+chaleira+quadro) da aula anterior.

1.1

Descrio
Assume-se que so aplicadas texturas distintas a cada um dos objectos: mesa chaleira quadro Assume-se ainda que aplicada a cada uma das paredes uma textura (plano XY e plano YZ) assim como ao cho (plano XZ).

1.2

Aces
Alm disso numa das paredes (plano YZ) a textura deve ser definida custa de um azulejo (que se repete um determinado nmero de vezes). O quadro mostra, sucessivamente, um determinada imagem. assim, deve ser possvel ao utilizador: Modificar a posio do observador (tal como na aula anterior) Setas: Up, Down, Left, Right Alterar a imagem no quadro No programa apresentado: r ou R alterna entre as vrias imagens. Alterar o nmero de azulejos na parede No programa apresentado: t ou T incrementa o nmero de azulejos.

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

2. Texturas em OpenGL
2.1 Introduo
No contexto de Computao Grfica, o mapeamento de texturas 2D consiste na aplicao de uma imagem sobre as faces de um objecto 3D. Uma textura uma imagem rectangular. Cada um dos pixeis de uma textura denominado de textel (por analogia com pixel de uma imagem). Em OpenGL existe o conceito de "objectos textura geridos pelo prprio OpenGL. No objectos textura", entanto, da responsabilidade do utilizador carregar as texturas a partir de ficheiros de imagem para um array na memria e, a parir desta, proceder criao de um objecto textura. O OpenGL copia e guarda a informao num formato conveniente, e devolve um identificador de textura para uso posterior. Em OpenGL podem ser criadas e coexistir vrias texturas, existindo no entanto a noo de "textura activa isto , a textura que est a ser usada no momento da textura activa", definio/alterao dos seus parmetros ou a que deve ser usada quando se procede ao desenho de um objecto com texturas. Sendo assim, as texturas em OpenGl no tm propriedades globais, mas sim cada uma possui as suas prprias propriedades. Antes de desenhar um objecto com uma textura, basta activar a textura correspondente, usando para o efeito o seu identificador, e depois proceder ao desenho do objecto. O uso de texturas requer a execuo de dois passos distintos: a criao e a aplicao da textura. Assume-se neste trabalho tratarem-se de texturas 2D.

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

2.2

Criao de texturas
Para a sua criao devem-se realizar os seguintes passos:

Deve0. Deve-se activar o modo de textura


glEnable(GL_TEXTURE_2D)

1. Criar o identificador de uma textura


Gluint texture; glGenTextures(1, &texture);

2. Criar um objecto anteriormente criado

textura

associandoassociando-o ando

ao

identificador

glBindTexture(GL_TEXTURE_2D, texture);

3. Especificar a imagem para o objecto a ser usado na textura


RgbImage imag("sol.bmp");

4. Especificar a forma de mapeamento (combinao da imagem e textura)


glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

5. Especificar parmetros da textura (filtros e repeties)


glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_LINEAR ); GL_LINEAR ); GL_REPEAT ); GL_REPEAT );

construir 6. Finalmente construir a textura


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imag.GetNumCols(), imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, imag.ImageData() );

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

2.3

Aplicao de texturas
Para a aplicao da textura preciso especificar a textura desejada e criar uma relao entre os vrtices da textura e o vrtice do polgono sobre os quais se desenha mapear a textura escolhida. Por exemplo:

glBindTexture(GL_TEXTURE_2D, texture); // activar a textura desejada glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(x1, y1, z1); glTexCoord2f(1.0, 0.0); glVertex3f(x2, y2, z2); glTexCoord2f(1.0, 1.0); glVertex3f(x3, y3, z3); glTexCoord2f(0.0, 1.0); glVertex3f(x4, y4, z4); glEnd();

2.4

Parmetros/propriedades
Depois de se proceder identificao de um objecto textura (atravs da criao de um nome) para representar a imagem de textura.

void glGenTextures( GLsize i, GLuint *textura);


e de se proceder criao de um objecto textura propriamente dito, associando-a a um nome textura criado anteriormente,

void glBindTexture( GLenum target, GLuint textura);


deve-se proceder definio das suas propriedades e atribuio da imagem desejada para a textura. Note-se que uma depois destes procedimentos anteriores a textura as propriedades da textura j se encontram definidas (valores por omisso). Podem, no entanto, ser modificados recorrendo funo glTexImage2D glTexImage2D.

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

2.4.1 uma 2.4.1 Ler uma Imagem


A biblioteca OpenGL no suporta a leitura de imagens em formatos grficos, como o BMP, GIF, JPEG. No entanto, capaz de ler as imagens de uma matriz em memria. Assim, as imagens devem ser previamente carregadas em memria utilizando outras funes externas e depois utilizadas em OpenGL. Neste caso utiliza-se a funo LoadBmpFile (a ser disponibilizada) para leitura de ficheiros BMP. Construtor RgbImage imag("sol.bmp"); Mtodos imag.LoadBmpFile("terra.bmp"); // ler uma imagem Atributos imag.GetNumCols(), // nmero de colunas (pixeis horizontais) da imagem lida imag.GetNumRows(), // nmero de linhas (pixeis verticais) da imagem lida imag.ImageData()); // imagem propriamente dita n m importante referir que em OpenGL as texturas devem ter dimenses 2 x 2 , onde n e m so nmeros inteiros. So exemplos de dimenses vlidas (64,64), (128,256), etc.

2.4. 2.4.2 Modo de mapeamento


Um das propriedades a especificar consiste na forma como vai ser combinada a textura com o objecto existente. Existem quatro possibilidades. Duas delas so

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);


Basicamente distinguem-se pelas propriedades do objecto (cor dos pixeis) serem ou no consideradas. No primeiro caso (MODULATE) a cor dos pixeis do objecto considerada para o resultado final: resulta da combinao (multiplicao) da cor do objecto pela cor da textura. No segundo caso (DECAL) feito um decalque da textura sobre o objecto, no tendo em conta a cor dos pixeis do objecto.

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

2.4. 2.4.3 Parmetros da textura (filtros e repeties)


Podem ser definidos dois tipos de propriedades/comportamentos da textura quando aplicada ao objecto.

1. Filtros
Caso as dimenses da textura no coincidam com as dimenses do objecto deve-se proceder a uma ampliao (MAG MAGNIFICATION) ou a uma reduo (MIN MINIMIZATION) da MAG MIN textura. Neste caso o OpenGL permite considerar dois tipos principais de tcnica na reduo/aumento da imagem: NEAREST/LINEAR. No primeiro (NEAREST) considerado simplesmente o pixel mais prximo, No segundo (LINEAR) efectuada uma mdia com os pixeis adjacentes. Assim o LINEAR mais perfeito, mas obviamente mais pesado computacionalmente. Os seguintes comandos implementam a reduo e ampliao LINEAR

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


Os comandos seguintes que a reduo e ampliao seja NEAREST

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_ NEAREST);


Note-se que possvel especificar propriedades distintas para a reduo/ampliao.

2. Repetio/Corte Outra das propriedades possvel de especificar relaciona-se com a repetio da mesma textura na superfcie do objecto. O OpenGl permite distinguir essa repetio nas direces horizontal e vertical. Assim, caso de deseje efectuar a repetio (REPEAT da textura na horizontal e na REPEAT) REPEAT vertical deve-se efectuar (S a direco horizontal e T vertical) S
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

Caso no se deseje efectuar a repetio (CLAMP e a textura aplicada seja CLAMP), CLAMP apenas a original, faz-se
Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_ CLAMP);


Note-se que possvel especificar propriedades distintas para a horizontal e vertical. Por exemplo

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_ CLAMP);


Refira-se ainda que para estas propriedades terem efeito necessrio que as coordenadas da textura tenham valores superiores a 1, como se explica mais frente.

2.4. textura 2.4.4 Construir a textura


Deve-se finalmente, depois de definidas as propriedades, especificar a imagem para o objecto de textura criado anteriormente

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA imag.GetNumCols(), imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, imag.ImageData());


Neste caso : Tipo=GL_TEXTURE_2D , pretende-se criar uma textura 2D, Tipo Level=0 , significa uma nica imagem de textura. Note-se que podem existir Level vrias e, neste contexto, usa-se a tcnica de mip-mapping para obter nveis de detalhe diferente nas texturas Internalformat= Internalformat GL_RGBA, descreve a representao interna da textura (em OpenGL). Width, Width Tamanho (largura) da imagem em pixeis Heigth, Heigth Tamanho (altura) da imagem em pixeis Border=0, indica se desejamos uma borda de 0 ou mais pixels. Border Format=GL_RGB, correspondem ao formato original da imagem Format Type= Type GL_UNSIGNED_BYTE , tipo de dados usados no formato da imagem Pixels, Pixels corresponde ao array (bidimensional, neste caso) de imagem propriamente dito.

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

2.4. 2.4.5

Aplicao de texturas

Como se disse, em OpenGl existe o conceito de textura activa. Ou seja, depois de definidas as vrias texturas estas podem ser aplicadas a um objecto, activando a textura desejada para o efeito. Sempre que se deseje aplicar com um textura deve-se chamar a funo glBindTexture que permite definir a textura corrente (activa) Depois de activada definir (activa). (selecciona) a textura procede-se a sua aplicao ao objecto. Para a aplicao da textura preciso criar uma relao entre os vrtices da textura e os vrtices dos polgonos sobre os quais se desenha mapear a textura escolhida. Na figura seguinte as letras A, B, C e D definem os vrtices da textura e os vrtices A1, B1, C1 e D1 os vrtices de polgono 3D onde deve ser mapeada esta textura. O processo de mapeamento de texturas em OpenGL consiste em "aplicar" a imagem 2D sobre o polgono 3D de forma que os pontos A, B, C e D sejam mapeados sobre os pontos A1, B1, C1 e D1.

Para permitir a construo desta correspondncia entre a imagem 2D e o polgono 3D usa-se a funo glTexCoord2f antes da definio do ponto 3D. Por exemplo,

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


especifica que o ponto (0.0, 0.0) da textura 2D corresponde ao ponto (1.0, -1.0, 1.0) do polgono 3D. O sistema de coordenadas da textura tem como (0,0) o ponto inferior esquerdo da imagem e como (1,1) o ponto superior direito.

Jh, bc, db

Computao Grfica | Trabalho 4 Texturas

Concluindo, o mapeamento da textura sobre um polgono consegue-se atravs de:

glBindTexture(GL_TEXTURE_2D, texture); // activar a textura desejada glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(x, y, z); glTexCoord2f(1.0,0.0); glVertex3f(x, y, z); glTexCoord2f(1.0, 1.0); glVertex3f(x, y, z); glTexCoord2f(0.0, 1.0); glVertex3f(x, y, z); glEnd();

Repeat/Clamp
Para que as aces de Repeat/Clamp necessrio que as dimenses da textura sejam superiores s do objecto. Para tal deve ser especificado coordenadas de textura superiores a 1. Por exemplo, considere-se uma textura base, como se ilustra a seguir:

A aplicao da textura da seguinte forma

glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glTexCoord2f(3.0,0.0); glTexCoord2f(3.0, 3.0); glTexCoord2f(0.0, 3.0); glEnd();

glVertex2f(0.0, 0.0); glVertex2f(1.0, 0.0); glVertex2f(1.0, 1.0); glVertex2f(0.0, 1.0);

resulta no seguinte (pode ser repetida 3 vezes)

Wrap S : GL_CLAMP Wrap T : GL_CLAMP

Wrap S : GL_CLAMP Wrap T : GL_REPEAT

Jh, bc, db

10

Computao Grfica | Trabalho 4 Texturas

Wrap S : GL_REPEAT Wrap T : GL_CLAMP

Wrap S : GL_REPEAT Wrap T : GL_REPEAT

2.5

Objectos Esfricos
Para activar a aplicao da textura a um objecto tridimensional esfrico deve-se usar o conceito de qudricas em OpenGL. Segue-se, sem explicaes, o cdigo de como o conseguir:
glBindTexture(GL_TEXTURE_2D, textura); GLUquadricObj* s = gluNewQuadric ( ); gluQuadricDrawStyle ( s, GLU_FILL ); gluQuadricNormals ( s, GLU_SMOOTH ); gluQuadricTexture ( s, GL_TRUE ); gluSphere ( s, raioEsfera, numLONG, numLAT); gluDeleteQuadric ( s ); // seleco da textura a aplicar

Jh, bc, db

11

Computao Grfica | Trabalho 4 Texturas

3. Implementao

3.1

O que est implementado


No programa que lhe fornecido implementada um textura: A uma parede Ao quadro chaleira mesa (que na realidade uma esfera)

3.2

O que se pretende implementar


Pretende-se implementar: Textura na outra parede (x=0, plano yz), a partir da repetio de uma textura simples (azulejo). Alternar a textura do quadro.

3.3

Cdigo fornecido
#include #include #include #include <stdio.h> <math.h> "RgbImage.h" <GL/glut.h>

//--------------------------------- Definir cores #define BLACK 0.0, 0.0, 0.0, 1.0 #define PI 3.14159 //================================================================================ //===========================================================Variaveis e constantes //------------------------------------------------------------ Sistema Coordenadas GLfloat xC=15.0, yC=15.0, zC=30.0; GLint wScreen=800, hScreen=600; GLfloat mesa=3.0; GLfloat bule=1.3; GLfloat quad=6.0; GLfloat mesaP[]= {4, 0, 10}; GLfloat buleP[]= {4, 0, 10}; GLfloat quadP[]= {4, 4, 0.1};

//------------------------------------------------------------ Observador

Jh, bc, db

12

Computao Grfica | Trabalho 4 Texturas

GLint GLfloat GLfloat GLfloat

defineProj=1; raio = 16; angulo = 0.37*PI; obsP[] = {raio*cos(angulo), 3.5, raio*sin(angulo)};

//------------------------------------------------------------ Texturas GLint repete=4; GLint maxR =20; GLint numQuadro =5; //================================================================================ //=========================================================================== INIT //------------------------------------------------------------ Texturas GLuint texture[4]; GLuint tex; RgbImage imag; void criaDefineTexturas() { //----------------------------------------- Mesa glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); imag.LoadBmpFile("mesa.bmp"); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D(GL_TEXTURE_2D, 0, 3, imag.GetNumCols(), imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, imag.ImageData()); //----------------------------------------- Chaleira glGenTextures(1, &texture[1]); glBindTexture(GL_TEXTURE_2D, texture[1]); imag.LoadBmpFile("chaleira.bmp"); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D(GL_TEXTURE_2D, 0, 3, imag.GetNumCols(), imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, imag.ImageData()); //----------------------------------------- Parede z=0 glGenTextures(1, &texture[2]); glBindTexture(GL_TEXTURE_2D, texture[2]); imag.LoadBmpFile("parede.bmp"); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D(GL_TEXTURE_2D, 0, 3, imag.GetNumCols(), imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, imag.ImageData()); //----------------------------------------- Quadro1 glGenTextures(1, &texture[3]); glBindTexture(GL_TEXTURE_2D, texture[3]); imag.LoadBmpFile("jh.bmp"); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D(GL_TEXTURE_2D, 0, 3, imag.GetNumCols(),

Jh, bc, db

13

Computao Grfica | Trabalho 4 Texturas

imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, imag.ImageData()); //???????????????????????????????????????????????? // Definicao das texturas //???????????????????????????????????????????????? } void init(void) { glClearColor(BLACK); glShadeModel(GL_SMOOTH); criaDefineTexturas( ); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); } void resizeWindow(GLsizei w, GLsizei h) { wScreen=w; hScreen=h; glutPostRedisplay(); } void drawScene(){ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Mesa glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,texture[0]); glPushMatrix(); glTranslatef( mesaP[0], mesaP[1]+mesa/2, mesaP[2]); glRotatef ( 90, -1, 0, 0); GLUquadricObj* y = gluNewQuadric ( ); gluQuadricDrawStyle ( y, GLU_FILL ); gluQuadricNormals ( y, GLU_SMOOTH ); gluQuadricTexture ( y, GL_TRUE ); gluSphere ( y, 0.5*mesa, 150, 150); gluDeleteQuadric ( y ); glPopMatrix(); glDisable(GL_TEXTURE_2D); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Chaleira glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,texture[1]); glPushMatrix(); glTranslatef(buleP[0], buleP[1]+mesa+bule/2, buleP[2]); glutSolidTeapot(bule); glPopMatrix(); glDisable(GL_TEXTURE_2D); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Quadro glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,texture[3]); glPushMatrix(); glTranslatef(quadP[0], quadP[1], quadP[2]); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex3i( quad, 0, glTexCoord2f(1.0f,0.0f); glVertex3i( 0, 0, glTexCoord2f(1.0f,1.0f); glVertex3i( 0, quad, glTexCoord2f(0.0f,1.0f); glVertex3i( quad, quad, glEnd(); glPopMatrix(); glDisable(GL_TEXTURE_2D); //????????????????????????????????????????? // Actualizao da imagem do quadro //?????????????????????????????????????????? //????????????????????????????????????????? // Textura da parede x=0 (plano YZ) // Deve-se repetir um padrao //??????????????????????????????????????????

0); 0); 0); 0);

Jh, bc, db

14

Computao Grfica | Trabalho 4 Texturas

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Parede glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,texture[2]); glPushMatrix(); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex3i( 0, 0, glTexCoord2f(1.0f,0.0f); glVertex3i( xC, 0, glTexCoord2f(1.0f,1.0f); glVertex3i( xC, yC, glTexCoord2f(0.0f,1.0f); glVertex3i( 0, yC, glEnd(); glPopMatrix(); glDisable(GL_TEXTURE_2D); } void display(void){

z=0

0); 0); 0); 0);

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ Apagar ] glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ Janela Visualizacao ] glViewport (0,0,wScreen, hScreen); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ Projeccao] glMatrixMode(GL_PROJECTION); glLoadIdentity(); switch (defineProj) { case 1: gluPerspective(104.0, wScreen/hScreen, 0.1, zC); break; default: glOrtho (-xC,xC,-yC,yC,-zC,zC); break; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ Modelo+View(camera/observador) ] glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(obsP[0], obsP[1], obsP[2], 0,0,0, 0, 1, 0); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ Objectos ] drawScene(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Actualizacao glutSwapBuffers(); } //======================================================= EVENTOS void keyboard(unsigned char key, int x, int y){ switch (key) { //--------------------------- Textura Repeticao case 'r': case 'R': break; //?????????????????????????????????????? // Implementar repeticao da textura //?????????????????????????????????????? //--------------------------- Textura do quadro case 't': case 'T': break; //?????????????????????????????????????? // Implementar alternar o quadro //?????????????????????????????????????? //--------------------------- Projeccao case 'q': case 'Q': defineProj=defineProj+1;

Jh, bc, db

15

Computao Grfica | Trabalho 4 Texturas

defineProj=defineProj%2; glutPostRedisplay(); break; //--------------------------- Escape case 27: exit(0); break; } } void teclasNotAscii(int key, int x, int y){ if(key == GLUT_KEY_UP) if(key == GLUT_KEY_DOWN) if(key == GLUT_KEY_LEFT) if(key == GLUT_KEY_RIGHT) glutPostRedisplay(); } //======================================================= MAIN int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); glutInitWindowSize (wScreen, hScreen); glutInitWindowPosition (100, 100); glutCreateWindow ("{jh,pjmm}@dei.uc.pt-CG (left,right,up,down, 'q') "); init(); glutSpecialFunc(teclasNotAscii); glutDisplayFunc(display); glutReshapeFunc(resizeWindow); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }

Jh, bc, db

16

Vous aimerez peut-être aussi