1 / 34

Computação Gráfica

Computação Gráfica. Texturas. 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). Texturas – Conceito .

marged
Download Presentation

Computação Gráfica

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Computação Gráfica Texturas

  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) 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). 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. 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 DI-UM Computação Gráfica 08/09

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

  7. 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> unsignedchar*il_imgData; intwidth, height, format, il_img; voidLoad_img (char*filename) { ilInit (); ilGenImages (1, &il_img); // getanunique ID ilBindImage(il_img); // Bindthisimagename. 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

  8. D.2 – Criar Textura inttexID; voidCreateTexture () { // create GL texture glGenTextures (1, &texID); // gettextureunique ID glBindTexture (GL_TEXTURE_2D, texID); // bindit // associatewith data readwithDevIL glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, il_imgData); // Release data spacecreatedwithDevIL ilDeleteImages(1, &il_img); } • Criar um OBJECTO de TEXTURA identificado pior um ID único DI-UM Computação Gráfica 08/09

  9. 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 // ParameteriseTexture 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

  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. t in [0 .. 1] s in [0 .. 1] 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(); 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(); DI-UM Computação Gráfica 08/09

  12. A.1 – Aplicar Textura • A escolha de coordenadas no espaço das texturas é "livre". 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(); DI-UM Computação Gráfica 08/09

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

  15. D.3 – Parameterização Revisitada 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(); Imagem Original GL_REPEAT // ParameteriseTexture glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); GL_CLAMP // ParameteriseTexture 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

  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 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 DI-UM Computação Gráfica 08/09

  18. Texturas - Filtros Mag:Nearest DI-UM Computação Gráfica 08/09

  19. Texturas - Filtros Mag: Linear pode parecer desfocado ao perto! DI-UM Computação Gráfica 08/09

  20. Texturas - Demos Apresentar DEMO DI-UM Computação Gráfica 08/09

  21. Texturas • 1D • glTexImage1D(GL_TEXTURE_1D,...) • 3D • glTexImage3D(GL_TEXTURE_3D,...) 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 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). DI-UM Computação Gráfica 08/09

  24. Texturas - Mipmapping • Figura do Red Book: 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. 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); 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 DI-UM Computação Gráfica 08/09

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

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

  30. 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) obj2cam = normalize(camZ-objZ, camX-objX) obj2cam ZZ α = acos (obj2camZ) α No entanto, como cos(a)=cos(-a), if (obj2camX>0) rotatearound YY if (obj2camX<0) rotatearound –YY Rotatef (a*180/PI, 0., obj2camX, 0.) (camX,camZ) XX DI-UM Computação Gráfica 08/09

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

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

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

  34. Referências • OpenGL Programming Guide, aka Red Book, OpenGL ARB DI-UM Computação Gráfica 08/09

More Related