Tomás Antônio Costa Badan Mapa de Textura: O Básico
Introdução De acordo com o www.thefreedictionary.com: Textura Aparência e impressão de uma superfície Superfície de uma material, principalmente sentida pelo toque Mapa de textura: Método de adicionar detalhes, textura ou cor para um modelo 3D Mapeia-se uma imagem (textura) para a superfície de um polígono ou forma Multitextura aplicar mais de uma textura para um polígono, ao mesmo tempo
Definições Pixel elemento de pintura. Menor elemento que pode ser representado em uma imagem ou em um monitor Normalmente existe uma correspondência de 1:1 entre o pixel de uma imagem e o pixel de um monitor Texel Elemento de textura Raramente existe uma correspondência de 1:1 entre um texel e um pixel no monitor
Exemplo
Tipos de Textura Mapa de Textura (Texture Map) Aplicar uma imagem a um objeto Mapas Procedurais Criação de imagens por algoritmo. Ruído em imagens, por exemplo Textura de Deslocamento (displacement) Altera a malha de um modelo, através da influência de uma imagem
Tipos de Textura (2) Mapa de Reflexão (Environment Mapping) Mapeamento Bump Altera a componente normal de uma textura para dar mais realismos nas imagens Mapeamento UV Fazer a renderização de objetos reflexivos Como criar uma textura, dado um objeto modelado Light Map Criar mapas de iluminação. Aplicá-los como textura
Mapa de textura
Mapas Procedurais Aplicando a textura para afetar a normal na renderização
Textura de Deslocamento
Environment Map Mapas Reflexivos
Bump Maps
Mapeamento UV
Light Maps
Texture Map no OpenGL 1º Carregar a textura para a memória do dispositivo gráfico void glteximage1d(glenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, void *data); void glteximage2d(glenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data); void glteximage3d(glenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, void *data);
Parâmetros Relativos à Representação Interna Target normalmente GL_TEXTURE_?D Level 0 se não usar mipmaps Internalformat normalmente GL_RGB ou GL_RGBA Width, height, depth dimensão da textura Idealmente deve ser em potência de 2 Border Influência no filtro de textura, por enquanto colocar 0
Parâmetros Relativos à Imagem Format como está os dados na imagem a ser lida (GL_RGB, GL_RGBA, GL_BGR, etc) Type como os bytes estão organizados para guardar os valores de dados (GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_INT_8_8_8_8, etc); Data ponteiro para um buffer em memória, onde os valores da imagem estão guardados
Mapeando as Texturas para a Geometria Creator:inkscape 0.46 Coordenadas da textura: s, t, r e q Valor de 'q' corresponde à coordenada homogênea do sistema homogêneo Valor real: s/q, t/q, r/q (default: q = 1)
Mapeando as Texturas para a Geometria (2) Para especificar as texturas: void gltexcoord1f(glfloat s); void gltexcoord2f(glfloat s, GLfloat t); void gltexcoord3f(glfloat s, GLfloat t, GLfloat r); Devem ser especificados antes de especificar os vértices Funcionamento da máquina de estado
Exemplos Creator:inkscape 0.46
OpenGL Textura de Ambiente Define como a textura irá interagir com a cor definida com o sólido Iluminação influencia também altera a cor do sólido Função OpenGL: void gltexenvi GLenum target,glenum name,glint param ; onde : target GL TEXTURE? D name GL TEXTURE ENV MODE param GL MODULATE, ou GL REPLACE, etc
GL_MODULATE = = Imagem final = textura * cor do pixel
GL_REPLACE = = Imagem final = textura (exceto para o canal alpha)
Parâmetros da Textura Inicializadas com a função (sem mipmaps): void gltexparameteri(glenum target, GLenum name, GLint param); onde: target GL_TEXTURE_?D name GL_TEXTURE_MIN_FILTER como filtrar a textura quando estiver em seu valor mínimo GL_TEXTURE_MAG_FILTER como filtrar a textura quando estiver em seu valor máximo param GL_NEAREST valor usado é o texel calculado GL_LINEAR valor usado de textura é uma interpolação sobre o texel calculado
Exemplos GL_TEXTURE_MIN_FILTER GL_NEAREST GL_TEXTURE_MAG_FILTER GL_NEAREST
Exemplos (2) GL_TEXTURE_MIN_FILTER GL_LINEAR GL_TEXTURE_MAG_FILTER GL_LINEAR
Texture Wrap O que acontece quando as coordenadas das textura estão fora do intervalo de [0:1]? void gltexparameteri(glenum target, GLenum name, GLint param); onde: target GL_TEXTURE_?D name GL_TEXTURE_WRAP_S como realizar a sobreposição da textura no eixo S GL_TEXTURE_WRAP_T como realizar a sobreposição da textura no eixo T param GL_REPEAT textura é repetida quando as coordenadas da textura ultrapassa o intervalo [0:1] GL_CLAMP aplicada somente uma única vez
Texture Wrap (2) Como mudar a forma que a textura é aplicada nas extremidades, quando as coordenadas estão fora do intervalo? GL_CLAMP_TO_EDGE as coordenadas que estão fora do intervalo são amostradas na última linha (coluna) dos texels válidos Utilizado quando uma textura é muito grande para ser carregada inteira na memória. Quebra-a em partes e para evitar o flickering, usa-se esse modo para uní-las GL_CLAMP_TO_BORDER as coordenadas que estão fora do intervalo são substituídas pelo valor do parâmetro Border Lembrando (carregar uma textura): void glteximage2d(glenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data);
MipMapping Utiliza texturas de uma mesma imagem cada vez menores para objetos distantes Objetivos: Aumentar a performance em geral Menos processamento de textura para objetos distantes Melhorar a qualidade de uma cena e o desempenho de renderização Evita cintilações na imagem devido a erros de amostragem de uma textura 'grande'
MipMapping (2) Cada nível é gerado, baseando no nível anterior, com os comprimentos reduzidos pela metade Idealmente, só deve parar quando a imagem for 1 pixel Nível 0 é a textura original
Exemplo
Em OpenGL O nível do MipMap é definido quando se carrega a textura. Lembrando (carregar uma textura): void glteximage2d(glenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border,glenum format, GLenum type, void *data); Idealmente deve ser chamado para todos os MipMaps possíveis Para definir limites inferior e superior (exemplo, base 0 e máximo 4): gltexparameteri(gl_texture_2d, GL_TEXTURE_BASE_LEVEL, 0); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAX_LEVEL, 4);
Gerando MipMaps automaticamente Através do GLU: int glubuild1dmipmaps(glenum target, GLint internalformat, GLint width, GLenum format, GLenum type, void *data); int glubuild2dmipmaps(glenum target, GLint internalformat, GLint width, GLint height, GLenum format, GLenum type, void *data); int glubuild3dmipmaps(glenum target, GLint internalformat, GLint width, GLint height, GLint depth, GLenum format, GLenum type, void *data); Através do hardware: gltexparameteri(gl_texture_2d, GL_GENERATE_MIPMAP, GL_TRUE);
Filtros MipMaps Vimos que, para parametros da textura: void gltexparameteri(glenum target, GLenum name, GLint param); onde: target GL_TEXTURE_?D name GL_TEXTURE_MIN_FILTER como filtrar a textura quando estiver em seu valor mínimo GL_TEXTURE_MAG_FILTER como filtrar a textura quando estiver em seu valor máximo param GL_NEAREST valor usado é o texel calculado GL_LINEAR valor usado de textura é uma interpolação sobre o texel calculado E para os MipMaps, temos ainda: GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR chamado de mapeamento trilinear
Objetos Textura Permite carregar na memória do hardware, mais do que um estado de textura, simultaneamente Estado da textura é composto de: Imagem Parâmetros inicializados com gltexparameter Carregar e manter os estados de textura consome um tempo considerável de aplicativos com base em texturização (exemplo, jogos)
Objetos Textura (2) Transferir texturas da memória principal para a memória de vídeo é o gargalo do sistema Solução: carregar os estados de textura antecipadamente Realizar a troca rápida entre eles quando for utilizar
Implementação O estado da textura é identificado por um inteiro Estados diferentes possuem diferentes identificadores Para reservar uma quantidade de identificadores no OpenGL: void glgentextures(glsizei n, GLuint *textures); Onde: n quantidade de estados de texturas Textures ponteiro para GLuint que será preenchido com os identificadores de objetos
Implementação (2) Para selecionar um dado estado de textura, para ser usado como textura atual, deve-se fazer um bind void glbindtexture(glenum target, GLuint texture); Onde: Target GL_TEXTURE_?D Texture o identificador do objeto Qualquer operação realizada com texturas modifica somente o objeto atual Carregar uma textura, mapear nos vértices,...
Implementação (3) Para apagar um objeto de textura, previamente alocado void gldeletetextures(glsizei n, GLuint *textures); Onde os parâmetros são os mesmos da função glgentextures Para testar se um identificador ainda é válido: GLboolean glistexture(gluint texture);