10.07.2015 Views

Texturas - Unisinos

Texturas - Unisinos

Texturas - Unisinos

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Mapeamento de <strong>Texturas</strong>Leandro ToniettoComputação GráficaJogos Digitaisltonietto@unisinos.brhttp://professor.unisinos.brltonietto/jed/cgr/textura.pdfAbr-201204/12/2011 Leandro Toniettoquarta-feira, 26 de setembro de 12


SumárioIntroduçãoConceitosProcessoOpenGL e exemplosMipmappingObjetos de texturasPróximos passos.04/12/2011 Leandro Tonietto 2quarta-feira, 26 de setembro de 12


IntroduçãoModelos de iluminação e sombreamento são adequadospara a modelagem de objetos monocromáticos e parasimular diferentes efeitos produzidos pelas combinaçõesdas componentes de materiais.Entretanto, superfícies com detalhamento interno não sãotrivialmente simuladas com estes modelos. Imagine, porexemplo, a textura de uma madeira.Uma solução primária seria a simulação desses detalhescom polígonos.Sobre um polígono base, cria-se outros polígonos que tomamcomo valores iniciais as informações de materiais do polígonobase e embutem a variação necessária para simular o efeito maisrealístico possível. A renderização dos polígonos de detalhe éfeita sobre a do polígono base.04/12/2011 Leandro Tonietto 3quarta-feira, 26 de setembro de 12


IntroduçãoEntretanto, o trabalho é árduo,computacionalmente oneroso e o efeito pode nãoficar realístico.Solução: utilização de texturas para melhorar orealismo das cenas renderizadas.O processo chama-se mapeamento de textura.Iniciou com Catmull em 1974, que utilizoupreenchimento de polígonos com imagem parasimular detalhamento e realismo visual.04/12/2011 Leandro Tonietto 4quarta-feira, 26 de setembro de 12


ConceitosTexture mapping (mapeamento de textura)A informação de detalhe para o mapeamentopode ser uma imagem (tal como uma foto) ouuma gerada computacionalmente por umafunção, chamada textura procedural.A imagem ou textura é chamada de texturemap.Os elementos do mapa de textura são chamadosde texels.04/12/2011 Leandro Tonietto 5quarta-feira, 26 de setembro de 12


ConceitosImagem x textura:04/12/2011 Leandro Tonietto 6quarta-feira, 26 de setembro de 12


ProcessoUma mapa de textura está num sistema de referênciada própria textura e é normalizado (0 a 1).A idéia básica é que, para cada pixel [x,y] a serrenderizado, existe um texel [u,v] no espaço domapa com a informação a ser utilizada narenderização.O valor mapeado é utilizado para substituir, ou para sesomar, aos valores calculados nos modelos deiluminação e sombreamento.Um pixel pode estar relacionado a mais de um texel.Neste caso, os texels são somados e ponderados paradeterminar o melhor valor para o pixel.04/12/2011 Leandro Tonietto 7quarta-feira, 26 de setembro de 12


ProcessoProblema: Mapas são 2D e objetos, em geral, 3D.Para obter informação de textura:Pontos são parametrizados para 2 coordenadas (s,t)Para encontramos a cor da textura, pegamos umponto (x,y,z) da superfície e mapeamos no espaçode texturaUsamos (s,t) como índices na imagem da texturaPolígonos:As coordenadas (s,t) são especificadas nos vértices(s,t) são interpolados para outros pontos04/12/2011 Leandro Tonietto 8quarta-feira, 26 de setembro de 12


ProcessoTextura (0,0,32,32)0,0Mapa (0,0,1,1)1,1Polígono mapeadoMap(0,1) Map(1,1)32,320,0Map(0,0)Map(1,0)Polígono diferente com mesmo mapeamentoMap(0,1)Map(1,1)Map(0,0)Map(1,0)04/12/2011 Leandro Tonietto 9quarta-feira, 26 de setembro de 12


Interpolação de texturaEspecificar onde os vértices no sistemade referência do universo (SRU) sãomapeados para o espaço de textura.Interpolar linearmente omapeamento dos outrospontos diretamente noespaço de textura04/12/2011 Leandro Tonietto 10quarta-feira, 26 de setembro de 12


Interpolação das coordenadas04/12/2011 Leandro Tonietto 11quarta-feira, 26 de setembro de 12


Mapeamento de texturasO mapeamento de texturas é feito no espaçode imagem quando o polígono é rasterizadoQuando descrevemos uma cena, imaginamosque a textura será interpolada no espaço douniversoProblema: distâncias iguais no espaço douniverso não significam distâncias iguais emuma imagem projetada em perspectiva!Perspective correct texture mapping resolve oproblema, mas é menos eficiente04/12/2011 Leandro Tonietto 12quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> no OpenGLO processo de texturização de objetos no OpenGLenvolve alguns passos básicos (e muitos outrospara se chegar ao resultado desejado):Primeiro passo: carregar a textura de um arquivo numformato de imagem: jpg, tga, gif, pnm, png, bmp eetc. Isto é de responsabilidade do programador.Um passo alternativo é computar alterações detratamento de imagem para melhorar algum aspectovisual da textura (blur, sharpen, sépia, tons-de-cinza,negativo, saturação, troca de cores e etc.)Ver especificação do formato PNM no site da disciplinade Processamento Gráfico04/12/2011 Leandro Tonietto 13quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> no OpenGLDepois, carregar os bytes da imagem para o estadode textura do OpenGL. Pode-se usar:void glTexImage1D(GLenum target, GLintlevel, GLint internalformat, GLsizeiwidth, GLint border,GLenum format, GLenumtype, void *data);void glTexImage2D(target, level,internalformat, width, height, border,format, type, data);void glTexImage3D(target, level,internalformat, width, height, depth,border, format, type, data);Estes métodos indicam ao OpenGL como tratar os dados recebidos04/12/2011 Leandro Tonietto 14quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> no OpenGLArgumentos das funções:Target: GL_TEXTURE_1D, GL_TEXTURE_2D ou GL_TEXTURE_3D.Usado conforme a função.Level: nível de mipmapping, zero para não usar (veremos maissobre mipmapping)InternalFormat: representação interna da cor. Como ela seráarmazenada: GL_ALPHA, GL_LUMINANCE,GL_LUMINANCE_ALPHA, GL_RGB e GL_RGBA.Width, height e depth: são as dimensões da textura, conforme ocaso. Em geral são potencias de 2 (1, 2, 4, 8, 16, 32, ...), porquestões de otimização de performance em hardware. Nãoprecisam ser quadrados.Border: estabelece uma borda na textura; padrão é zero.Format: formato em que o texel aparece (ver tabela 8.2 em [3])Type: tipo de dado em que pixel está gravado.Data: são os bytes da imagem carregada do disco.04/12/2011 Leandro Tonietto 15quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> no OpenGLTabela dos formatos (retirado de [3]):04/12/2011 Leandro Tonietto 16quarta-feira, 26 de setembro de 12


Comando para enviar o mapeamento:glTexCoord1f(s), glTexCoord2f(s,t) ouglTexCoord3f(s,t,r)Usar sempre o par coordenada e vértice:glTexCoord2f(0, 1);glVertex2f(0, 1);<strong>Texturas</strong> em OpenGL04/12/2011 Leandro Tonietto 19quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLExemplo do livro [3], pirâmidetexturizada:Ver executável e código fonte do exemplo.04/12/2011 Leandro Tonietto 20quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLAmbiente de textura (texture environment):Modo do ambiente de textura indica ao OpenGL comomisturar cores com texels:glTexEnvi(GLenum target, GLenum pname, GLint param);Variações: f, iv e fvNo exemplo da pirâmide:glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);04/12/2011 Leandro Tonietto 21quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLModos de ambiente de textura (texture environmentmodes):Modulate (GL_MODULATE): multiplica a cor do texel pela cor dageometria (após cálculos de iluminação)Permite que o resultado final tenha os detalhes da textura com ascaracterísticas de iluminação do sombreamento.Replace (GL_REPLACE): substitui a informação de sombreamentopela cor da textura. Pode ser combinado com canal alpha paraproduzir efeitos de degradê.Decal (GL_DECAL): faz o efeito de um adesivo. A textura é plotadasobre as informação de sombreamento e, aonde, tiver alpha


<strong>Texturas</strong> em OpenGLUm pouco além do básico...Na “vida real”, os programadores precisam mais doque simplesmente mapear pontos da imagem paravértices.Muitos parâmetros podem ser informados parafavorecer a qualidade visual do mapeamento.Embora, ainda seja possível prever algunsproblemas de mapeamento e embutir na textura asdeformações necessárias para realizar ummapeamento ideal. É uma solução difícil e aindaassim pode necessitar de ajustes.OpenGL permite definir parâmetros demapeamento, que influenciam a forma a texturaserá tratada após o mapeamento.04/12/2011 Leandro Tonietto 23quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLBasic Filtering:Para um resultado interessante ou pelo menosbom, além do mapeamento, devemos fazer uso dealguns artefatos para melhor o resultado.Um problema comum é o que acontece quando atextura é esticada ou comprimida.Algum procedimento deve ser feito quando faltaalguma informação ou quando há uma redução depixels.O processo que trata deste problema é chamado defiltering. Ele é executado na magnificação e naminificação dos texels (magnification eminification). As constantes associadas são,respectivamente: GL_TEXTURE_MAG_FILTER eGL_TEXTURE_MIN_FILTER.04/12/2011 Leandro Tonietto 25quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLXNEARESTLINEAR04/12/2011 Leandro Tonietto 28quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLTextura com cartoons (cell-shading)Uso de textura 1D para desenhos animados.Preenchimento é feito com cor sólida e usando GL_NEAREST.A idéia básica é usar as normais da superfície e o vetor da luzpara indicar qual é a cor de preenchimento dos pixels.Calculando o produto escalar.Exemplo TOON do livro [3].04/12/2011 Leandro Tonietto 29quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLTexture WrapO que fazer nas fronteiras da textura? Especialmente quando fornecessário acessar um valor que estaria “fora” da textura?Pode-se repetir a textura ou simplesmente “cortar” nas bordas (repeatou clamp).Deve ser indicado por dimensão da textura o procedimento a serexecutado:GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T eGL_TEXTURE_WRAP_R.O modo GL_REPEAT, simplesmente repete a textura nas dimensõesescolhidas. Bom para imagens tileble.Influencia no filtering GL_LINEAR.O modo GL_CLAMP os pixels faltantes são obtidos da cor definida para aborda: GL_TEXTURE_BORDER_COLOR em glTexParameterfv(...).GL_CLAMP_TO_EDGE, obtém pixels faltantes repetindo os pixels dasbordas.GL_CLAMP_TO_BORDER, pixels da última linha e última coluna sãocarregados como borda e valores são cortados até aquele ponto.04/12/2011 Leandro Tonietto 30quarta-feira, 26 de setembro de 12


Texture WrapRepeat: Textura é repetidaglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT)<strong>Texturas</strong> em OpenGLClamp: os valores são truncados (mantidos entre 0 e 1)glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP)Podemos especificar uma cor de bordaglTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_BORDER_COLOR, R,G,B,A)04/12/2011 Leandro Tonietto 31quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLTexture Wrap04/12/2011 Leandro Tonietto 32quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLExemplo imagem tileble:04/12/2011 Leandro Tonietto 33quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLAlgoritmos de síntese detexturas conseguem gerartexturas a partir deamostras de imagem.Objetivo: gerar uma novatextura que contenha omesmo padrão visual daamostra. Idealmente, a novatextura não deve pareceruma composição de tilesregulares.Veremos mais sobre síntesede texturas04/12/2011 Leandro Tonietto 34quarta-feira, 26 de setembro de 12


MipmapProblemas:Diferentes resoluções objeto podem parecer distorcidas porcausa do tamanho da textura. Problema com a perspectivaTextura com informações prontas para o mapeamento emperspectiva consomem muita memória.Solução:Mipmap – “multum in parvo” (Muitas coisas num mesmo lugar).A idéia é carregar muitas texturas de resoluções diferentes paraatender cada a cada tamanho visualizado.Quando o objeto está próximo o maior nível é utilizado, quandoo objeto está longe um nível menor (adequado) é calculado eutilizado para o mapeamento.Suponha uma textura a ser mapeada e que seja desejagerar todos os mipmappings possíveis de menor resolução(dividindo ao meio), qual é a quantidade de memórianecessária para armazenar todos os mipmappings?04/12/2011 Leandro Tonietto 35quarta-feira, 26 de setembro de 12


Mipmap04/12/2011 Leandro Tonietto 36quarta-feira, 26 de setembro de 12


MipmapOs níveis de Mipmap são carregados comglTexImageAgora deve-se usar o parâmetro level.Onde: primeiro nível é o zero, depois 1, 2, ...Parâmetros associados:glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL, 0)glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL, 4)glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_LOD, 0)glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAX_LOD, 3)04/12/2011 Leandro Tonietto 37quarta-feira, 26 de setembro de 12


MipmapFiltering com mipmapNearest ou LinearDuas etapas: primeiro o filtro de nível e depois o seletor de nível.GL_FILTRO_MIPMAP_SELETORGL_NEAREST – executa nearest filtering sobre o primeiro nível domipmap.GL_LINEAR – executa filtering sobre primeiro nível do mipmap.GL_NEAREST_MIPMAP_NEAREST – executa nearest para o nível eentre vizinhos.GL_NEAREST_MIPMAP_LINEAR – executa nearest para o nível e linearentre vizinhosGL_LINEAR_MIPMAP_NEAREST – seleciona nearest nível e executainterpolação linear.GL_LINEAR_MIPMAP_LINEAR – seleciona e executa interpolaçãolinear. Trilinear interpolation.Mais indicado para jogos: GL_LINEAR_MIPMAP_NEARESTQualidade de filtragem da interpolação e agilidade naescolha do nível.04/12/2011 Leandro Tonietto 38quarta-feira, 26 de setembro de 12


Geração “automática” de níveisAo invés de carregar todas as imagens de todos osnível é possível utilizar-se de duas soluções:MipmapgluScaleImage() – gera uma versão escalada da imagemglBuild2DMipmaps() – cria versões escaladas de umaimagem e associa com o nível mipmap adequado:int gluBuild2DMipmaps(GLenum target, GLintinternalFormat, GLint width, GLint height,GLenum format, GLenum type, const void *data);glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP, GL_TRUE) – gera uma versãoescalada da imagem em hardware. A partir da versão 1.4 daOpenGL. A cada chamda a glTexImage() para o nível 0, osdemais são computados automaticamente.04/12/2011 Leandro Tonietto 39quarta-feira, 26 de setembro de 12


MipmapLOD BIASglTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, -1.5)Interfere no cálculo de escolha do nível demipmap.04/12/2011 Leandro Tonietto 40quarta-feira, 26 de setembro de 12


Objetos de texturaAté este ponto, vimos como definir umatextura e seus parâmetros no estado de texturado OpenGL.Algumas aplicações (jogos) requerem diversastexturas.Troca de estados com as funções glTexImagee glBuildMipmap a todo instante tornam oprocesso muito oneroso. No caso de jogos,proibitivo.Neste sentido, utiliza-se objetos de textura.04/12/2011 Leandro Tonietto 41quarta-feira, 26 de setembro de 12


Objetos de texturaPrimeiro passo consiste indicar uma quantidade de objetos de textura:glGenTexture(GLsizei n, GLuint *textures);n – é o tamanho do array de texturas*textures – é o array de identificadores.Para trocar o estado de textura atual:glBindTexture(Glenum target, GLuint texture)target – GL_TEXTURE_1D, GL_TEXTURE_2D ou GL_TEXTURE_3Dtexture – é o identificador do objeto de textura.Para remover objetos de textura:glDeleteTextures(GLsizei n, GLuint *textures);Os dados relativos aos objetos de textura devem ser carregados nainicialização do programa e, cada etapa de redesenho, deve-se fazer atroca de estados entre os objetos, conforme a necessidade.Ver exemplo TUNNEL do livro [3]. O exemplo demonstra o uso demipmaps e mútiplas texturas04/12/2011 Leandro Tonietto 42quarta-feira, 26 de setembro de 12


Objetos de texturaExemplo considerando várias texturas no modelo do OBJGeração de ids de texturas para todas as imagens lidas (uma para cadamaterial):int *ids;Mesh *mesh = new Mesh;vector mats;int main(int argc, char **argv){OBJReader reader;reader.open(“algumo.obj”, mesh, &mats);// descobrir quantos materiais tem textura (texCount)...ids = new int[texCount];glGenTexture(texCount, ids);for pelos materiaisif(mats[i].hasTexture()){Image *img = mats[i].getTexture();// associando id com texturamats[i]->setTextureId(ids[k++]);glBindTexture(GL_TEXTURE_2D, img->getId());glTexImage2D(GL_TEXTURE_2D, GL_RGB,img->getWidth(), img->getHeight(), GL_RGB,GL_UNSIGNED_BYTE, img->getPixels());free(img->getPixels()); // liberar memória!}junto ao glBindTexturepassar também outrosparâmetros relacionados atextura.Modificar de acordocom o tipo de dadosdo vetor de pixels daclasse Image04/12/2011 Leandro Tonietto 43quarta-feira, 26 de setembro de 12


Objetos de texturaResolvendo o mapeamento na hora do desenho:for dos gruposGLuint tid = grupos[i]->getMaterial()->getTextureId();glBindTexture(GL_TEXTURE_2D, textures[tid]);glBegin(GL_TRIANGLES); // ou a primitiva mais adequadafor das faces do grupoFace *f = grupo->getFace(j);float *vt = mesh->getTextCoord(f->getTextCoord());Vertex *v = mesh->getVertex(f->getVertex());glTexCoord2f(vt[0], vt[1]);glVertex3f(v[0], v[1], v[2]);glEnd();Ver exemplo TUNNEL do livro [3]. O exemplo demonstra o uso demipmaps e mútiplas texturas04/12/2011 Leandro Tonietto 44quarta-feira, 26 de setembro de 12


Textura ResidentesAs texturas utilizadas no mapeamento são carregadas para uma área dememória de alta performance de textura, no hardware gráfico.OpenGL faz uso desta área de memória sempre que uma textura temque ser renderizada.Entretanto, esta é uma área de memória com limite de tamanho. OOpenGL substitui as texturas conforme a necessidade.É possível, contudo, determinar quais texturas devem ficar residentes:GLboolean glAreTexturesResident(GLsizei n, const GLuint*textures, GLboolean *residences);Aquelas texturas que estão definidas como GL_TRUE, ficarão nesta áreade memória.O OpenGL utiliza algoritmo MFU (most frequently used) para definirquem permanece residente na área de textura. Também é possíveldefinir prioridades para as texturas e, desta forma, interferir noalgoritmo e deixar alguma textura específica:void glPrioritizeTextures(GLsizei n, const GLunit*textures, const GLclampf *priorities);04/12/2011 Leandro Tonietto 45quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLOutros aspectos a serem estudados:Uso do color bufferAtualização de partes da textura, comglTexSubImageMatriz de texturas, que permite transformaçõessobre a textura (translação, escala e rotação), eque inclusive são aplicadas a parte domapeamento.Filtragem de textura anisotrópica prove qualidadesuperior na filtragem.Adicionar efeitos de especularCompressão de texturas04/12/2011 Leandro Tonietto 46quarta-feira, 26 de setembro de 12


<strong>Texturas</strong> em OpenGLMapeamento de texturas mais avançado:Síntese de texturas procedurais e baseado emimagemEnvironment mapping – iluminação armazenada emum mapa de texturasSimula reflexão de superfícies brilhantes/metálicasBump-mapping altera a normal da superfícieGeometria fica mais simples, mas o contorno do objetopode parecer estranhoDisplacement mapping adiciona um deslocamentoa cada ponto da superficieGemoetria também fica mais simplesNormal mappingSimilar ao bump-mapping, mas neste caso temos uma“textura” de normais04/12/2011 Leandro Tonietto 47quarta-feira, 26 de setembro de 12


Referências bibliográficas1. Slides sobre CG dos professores: ChristianHofsetz, Cristiano Franco, Marcelo Waltere Soraia Musse.2. FOLEY!!3. WRIGHT Jr., Richard S; LIPCHAK,Benjamin; HAEMEL, Nicholas. OpenGLSuperbible: Comprehenive Tutorial andReference. 4 ed. Addison-Wesley, 2007.04/12/2011 Leandro Tonietto 48quarta-feira, 26 de setembro de 12

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!