Imagem e Textura
Curso de Visualiza¸c˜ao Cient´ıfica
Waldemar Celes
celes@tecgraf.puc-rio.br
Tecgraf/PUC-Rio
10 de Setembro de 2013
Imagem
Aspectos pr´aticos e uso com OpenGL
0 1 2 . . .
0 1 2 . . .
Armazenamento linear
Fatores importantes
I Dados associados aos pixels
I Formatos de armazenamento
I Custo de transferˆencia
I Alinhamento
Imagem
Opera¸c˜oes com imagens
Memória
host Memória
device Write
Read Copy
Opera¸c˜ oes com imagem
Posicionamento da imagem na tela
glRasterPos∗ (x, y, z, w);
I Representa a posi¸c˜ao do canto inferior esquerdo
I Sofre transforma¸c˜oes do pipeline
I Se fora do volume de vis˜ao, imagem ´e “clipada”
Especifica¸c˜ao do bufferde leitura escrita
glDrawBuffer(GL BACK); // default glReadBuffer(GL FRONT); //default
Opera¸c˜ oes com imagem
Opera¸c˜ao de escrita
I Escreve a partir da posi¸c˜aorastermapeada para a tela
glDrawPixels (width, height, format, type, pixels);
Opera¸c˜ao de leitura
I Deve-se alocar previamente espa¸co para armazenar imagem
glReadPixels (x,y,width, height, format, type, pixels);
Opera¸c˜ao de c´opia
I Pode-se operar sobre o mesmo buffer oubuffersdiferentes
glCopyPixels (x,y,width, height, buffer)
I onde buffer: GL COLOR,GL DEPTH,GL STENCIL
Opera¸c˜ oes com imagem
Opera¸c˜ao de escrita
I Escreve a partir da posi¸c˜aorastermapeada para a tela
glDrawPixels (width, height, format, type, pixels);
Opera¸c˜ao de leitura
I Deve-se alocar previamente espa¸co para armazenar imagem
glReadPixels (x,y,width, height, format, type, pixels);
Opera¸c˜ao de c´opia
I Pode-se operar sobre o mesmo buffer oubuffersdiferentes
glCopyPixels (x,y,width, height, buffer)
I onde buffer: GL COLOR,GL DEPTH,GL STENCIL
Opera¸c˜ oes com imagem
Opera¸c˜ao de escrita
I Escreve a partir da posi¸c˜aorastermapeada para a tela
glDrawPixels (width, height, format, type, pixels);
Opera¸c˜ao de leitura
I Deve-se alocar previamente espa¸co para armazenar imagem
glReadPixels (x,y,width, height, format, type, pixels);
Opera¸c˜ao de c´opia
Opera¸c˜ oes com imagem
Desenho de bitmap
I Em especial, para desenho de fontes raster
glBitmap (width, height, x0, y0, xinc, yinc, bitmap);
I Cor do bitmap definida pela cor corrente qdo da raster pos
I x0,y0indicam posi¸c˜ao dentro do bitmap
I xinc,yincs˜ao usados para incrementar raster pos Fun¸c˜oes da glut
glutBitmapCharacter(void ∗font, int character);
glutStrokeCharacter(void ∗font, int character);
Opera¸c˜ oes com imagem
Formato de pixel (dados por pixel)
GL RGB GL RGBA GL RG
GL RED, etc.
GL LUMINANCE GL LUMINANCE APLHA GL DEPTH COMPONENT GL STENCIL INDEX GL DEPTH STENCIL
Opera¸c˜ oes com imagem
Tipo do dado (representa¸c˜ao)
GL UNSIGNED BYTE GL BYTE
GL UNSIGNED SHORT GL SHORT
GL UNSIGNED INT GL INT
GL FLOAT GL HALF FLOAT
I Existem ainda os tipos compactados
I Devem ser compat´ıveis com o formato
GL UNSIGNED BYTE 3 3 2 GL UNSIGNED SHORT 5 6 5 GL UNSIGNED SHORT 4 4 4 4 GL UNSIGNED SHORT 5 5 5 1 etc.
I Existe tamb´em o tipo “bit” (armazenado emunsigned int)
Pipeline de opera¸c˜ oes em imagem
Memória Modo de
Armazenamento Operações de Transferência Rasterização Testes e operações
sobre fragmento Memória de
Textura
Pipeline de imagem
Controle do modo de armazenamento
I Mem´oria−→ Buffer: unpack
I Buffer−→ Mem´oria: pack Fun¸c˜ao de controle: glPixelStore∗
I Exemplos
glPixelStorei (GL UNPACK ALIGNMENT, 4);
glPixelStorei (GL PACK SWAP BYTES, GL TRUE);
glPixelSotrei (GL UNPACK SKIP ROWS, x0);
*ROW_LENGTH
*SKIP_PIXELS
*SKIP_ROWS
Pipeline de imagem
Opera¸c˜oes de transferˆencia e mapeamento
I glPixelTransfer∗(pname, param)
Exemplos de uso
I Leitura de imagem de luminˆancia (tons de cinza)
I L= 0.30R+ 0.59G+ 0.11B
glPixelTransferf(GL RED SCALE, 0.30);
...
I Mapa de cores
glPixelTransferi(GL MAP COLOR,TRUE);
Rasteriza¸c˜ ao de imagem
Fator de zoom
I Pixel mapeado para quadril´atero
glPixelZoom(fx, fy);
Textura
Mapeamento de textura
I Modela padronagem de cor (textura de cor)
I Modela ilumina¸c˜ao (mapa de ilumina¸c˜ao)
I Modela rugosidade (mapa de normal)
I Modela sombras (mapa de profundidade)
I etc.
Mapeamento de textura
Mapeamento conceitual
mapeamento de textura
s
0.0 1.0
t
0.0 1.0
(s, t) (s, t)
(s, t)
Mapeamento de textura
Mapeamento fragmento a fragmento
mapeamento texel a texel
t
(s, t) (s, t)
(s, t)
Textura
Cria¸c˜ao do objeto de textura
I Requisita “nomes”
glGenTextures(int n, unsigned int ∗texnames);
I Associa objeto como corrente
glBindTexture(enum target, int texname);
I Na finaliza¸c˜ao, deleta objetos
glDeleteTexture (int n, unsigned int ∗texnames);
Textura
Especifica¸c˜ao de imagem do objeto de textura
glTexImage2D (GL TEXTURE 2D, level, iformat,
width, height, border, format, type, pixels );
I level: n´ıvel da pirˆamide demipmapping(a base tem valor 0)
I iformat: formato interno
I border: indica existˆencia de borda, 0 ou 1
Textura
Especifica¸c˜ao de imagem do objeto de textura
I Dimens˜ao tem que ser potˆencia de 2: 2n+ 2b
I Exce¸c˜ao para “texturas retangulares”
I Estrat´egias de ajustes
I Re-escala (quando tem repeti¸c˜ao)
gluScaleImage (format,
in width, in height, in type, in pixels, out width, out height, out type, out pixels );
I Mapeamento de sub´area (quanto n˜ao tem repeti¸c˜ao)
1.0 w/W 1.0
h/H
Textura
Especifica¸c˜ao de imagem do objeto de textura
I Dimens˜ao tem que ser potˆencia de 2: 2n+ 2b
I Exce¸c˜ao para “texturas retangulares”
I Estrat´egias de ajustes
I Re-escala (quando tem repeti¸c˜ao)
gluScaleImage (format,
in width, in height, in type, in pixels, out width, out height, out type, out pixels );
I Mapeamento de sub´area (quanto n˜ao tem repeti¸c˜ao)
1.0 w/W 1.0
h/H
Textura
Especifica¸c˜ao de imagem do objeto de textura
I Dimens˜ao tem que ser potˆencia de 2: 2n+ 2b
I Exce¸c˜ao para “texturas retangulares”
I Estrat´egias de ajustes
I Re-escala (quando tem repeti¸c˜ao)
gluScaleImage (format,
in width, in height, in type, in pixels, out width, out height, out type, out pixels );
I Mapeamento de sub´area (quanto n˜ao tem repeti¸c˜ao)
1.0 h/H
Textura
Outras formas de especifica¸c˜ao da imagem
I Redefinindo sub-imagem
glTexSubImage2D (target, level,
xoffset, yoffset, w, h, format, type, pixels );
I Copiando do frame buffer
glCopyTexture2D (target, level, iformat, x, y, w, h, border);
I Offscreen rendering
Pipeline de textura
Vértice x,y,z nx,ny,nz
geração
s, t transform s’, t’ sp, tp map/filtro
combinação fragmento fragres
texel rasterização por vértice por fragmento
Pipeline de textura
Gera¸c˜ao de coordenadas de textura
I Dadas explicitamente como atributos de v´ertices
glTexCoord∗ (s, t, r, q)
ou
glTexCoordPointer(nelem,type,offset,array);
glEnableClientState(GL TEXTURE COORD ARRAY);
I Geradas automaticamente a partir dos dados dos v´ertices
I Combina¸c˜ao linear no espa¸co do objeto
s=asx+bsy+csz+ds t=atx+...
I Combina¸c˜ao linear no espa¸co do objeto s=aesxe+bseye+cseze+dse t =aetxe+...
Pipeline de textura
Gera¸c˜ao de coordenadas de textura
I Dadas explicitamente como atributos de v´ertices
glTexCoord∗ (s, t, r, q)
ou
glTexCoordPointer(nelem,type,offset,array);
glEnableClientState(GL TEXTURE COORD ARRAY);
I Geradas automaticamente a partir dos dados dos v´ertices
I Combina¸c˜ao linear no espa¸co do objeto
s=asx+bsy+csz+ds
t=atx+...
I Combina¸c˜ao linear no espa¸co do objeto s=aesxe+bseye+cseze+dse
Pipeline de textura
Especifica¸c˜ao dos “planos” geradores: a,b,c,d
I Se gera¸c˜ao for no espa¸co do olho, o plano especificado ´e transformado para o espa¸co do olho.
glTexGeni (GL S , GL TEXTURE GEN MODE, GL OBJECT PLANE);
glTexGenfv (GL S , GL OBJECT PLANE, plane);
I Ativa¸c˜ao da gera¸c˜ao autom´atica
glEnable (GL TEXTURE GEN S);
...
Quando usar espa¸co o objeto e espa¸co do olho?
I Espa¸co do objeto: textura aplicada em um objeto
I Espa¸co do olho: textura aplicada em todos os objetos da cena
Pipeline de textura
Especifica¸c˜ao dos “planos” geradores: a,b,c,d
I Se gera¸c˜ao for no espa¸co do olho, o plano especificado ´e transformado para o espa¸co do olho.
glTexGeni (GL S , GL TEXTURE GEN MODE, GL OBJECT PLANE);
glTexGenfv (GL S , GL OBJECT PLANE, plane);
I Ativa¸c˜ao da gera¸c˜ao autom´atica
glEnable (GL TEXTURE GEN S);
...
Quando usar espa¸co o objeto e espa¸co do olho?
I Espa¸co do objeto: textura aplicada em um objeto
I Espa¸co do olho: textura aplicada em todos os objetos da cena
Pipeline de textura
Transforma¸c˜ao aplicada `as coordenadas de textura
s0 t0 r0 q0
=Mtex
s t r q
I Uso da API de transforma¸c˜ao
I Pilha de matriz de textura
glMatrixMode(GL TEXTURE);
I Todas as fun¸c˜oes de especifica¸c˜ao de transforma¸c˜oes
glLoadIdentity();
glTranslate∗(...);
Pipeline de textura
Mapeamento
I Dado um fragmento com coordenada de textura interpolada (s,t), acessatexel ({r,g,b,a}) correspondente
Modo de mapeamento (wrap)
I Valores (s,t) fora do intervalo
glTexParameter∗(target, pname, param);
I GL TEXTURE WRAP S,GL TEXTURE WRAP T, ...
I Repeat, mirrored, clamp to edge, clamp to border
Pipeline de textura
Filtros
I Correspondˆencia entre fragmento e texel Amplia¸c˜ao (magnification)
I Fragmento mapeado para um sub-texel
I A ´area de um texel corresponde a v´arios pixels da tela
Pipeline de textura
Filtros de amplia¸c˜ao
I Nearest: 1 texel por fragmento
I Baixa qualidade (aliasing)
I Linear: 4 texels por fragmento
I Melhor qualidade (anti-aliasing)
nearest linear
Pipeline de textura
Filtros de amplia¸c˜ao
I Nearest: 1 texel por fragmento
I Baixa qualidade (aliasing)
I Linear: 4 texels por fragmento
I Melhor qualidade (anti-aliasing)
nearest linear
Pipeline de textura
Filtros de amplia¸c˜ao
I Nearest: 1 texel por fragmento
I Baixa qualidade (aliasing)
I Linear: 4 texels por fragmento
I Melhor qualidade (anti-aliasing)
nearest linear
Pipeline de textura
Redu¸c˜ao (minification)
I A ´area de um fragmento corresponde a v´arios texels
Pipeline de textura
Filtros de redu¸c˜ao
I Nearest: um texel por fragmento
I Baixa qualidade (aliasing)
I Linear: 4 texels por fragmento
I Ainda baixa qualidade (aliasing)
Pipeline de textura
Filtros de redu¸c˜ao
I Nearest: um texel por fragmento
I Baixa qualidade (aliasing)
I Linear: 4 texels por fragmento
I Ainda baixa qualidade (aliasing)
Filtro de redu¸c˜ ao
Problema de falta de amostragem de sinal
Nyquist rate
A frequˆencia da amostragem deve ser pelo menos duas vezes maior que a frequˆencia do sinal
Filtro de redu¸c˜ ao
Problema de falta de amostragem de sinal
Filtro de redu¸c˜ ao
Para alcan¸car o Nyquist rate:
como n˜ao se pode aumentar o n´umero de amostras (resolu¸c˜ao da tela), diminui-se a frequˆencia do sinal, isto ´e, diminui-se a textura.
Pirˆamide demipmapping
Tomas Akenine-M¨oller c2002
Filtro de redu¸c˜ ao
Para alcan¸car o Nyquist rate:
como n˜ao se pode aumentar o n´umero de amostras (resolu¸c˜ao da tela), diminui-se a frequˆencia do sinal, isto ´e, diminui-se a textura.
Pirˆamide de mipmapping
Filtro de redu¸c˜ ao
Filtrotrilinear
I Aplica filtro bilinearem dois n´ıveis adjacentes da pirˆamide
I Interpola linearmente os doistexels encontrados
C´alculo do n´ıvel da pirˆamide
I Busca-se rela¸c˜ao de um texel por fragmento γ = log2ρ+lodbias onde:
I γ: n´ıvel da pirˆamide (0 representa a base)
I ρ: m´aximo fator de escala entre pol´ıgono na tela e textura
I lodbias: constante definida viaglTexEnv∗() (default´e 0.0) Pode-se controlar os n´ıveis m´ınimo e m´aximo usados no filtro.
Filtro de redu¸c˜ ao
Filtrotrilinear
I Aplica filtro bilinearem dois n´ıveis adjacentes da pirˆamide
I Interpola linearmente os doistexels encontrados C´alculo do n´ıvel da pirˆamide
I Busca-se rela¸c˜ao de um texel por fragmento γ = log2ρ+lodbias onde:
I γ: n´ıvel da pirˆamide (0 representa a base)
Pode-se controlar os n´ıveis m´ınimo e m´aximo usados no filtro.
Filtro de redu¸c˜ ao
Filtrotrilinear
I Aplica filtro bilinearem dois n´ıveis adjacentes da pirˆamide
I Interpola linearmente os doistexels encontrados C´alculo do n´ıvel da pirˆamide
I Busca-se rela¸c˜ao de um texel por fragmento γ = log2ρ+lodbias onde:
I γ: n´ıvel da pirˆamide (0 representa a base)
I ρ: m´aximo fator de escala entre pol´ıgono na tela e textura
I lodbias: constante definida viaglTexEnv∗() (default´e 0.0)
Constru¸c˜ ao da pirˆ amide de mipmapping
Vers˜ao 3.0 ou posterior
glGenerateMipmap (target);
I target: GL TEXTURE 1D, GL TEXTURE 2D, ...
I Pirˆamide constru´ıda entre n´ıveis:
GL TEXTURE BASE LEVEL eGL TEXTURE MAX LEVEL
Vers˜oes anteriores
I Especifica imagem e constroi pirˆamide
gluBuild1DMimaps
Filtro de textura
API para defini¸c˜ao do filtro
glTexParameter∗ (target, param, value);
I Filtro de amplia¸c˜ao: GL TEXTURE MAG FILTER
I GL NEAREST, GL LINEAR
I Filtro de redu¸c˜ao: GL TEXTURE MIN FILTER
I GL NEAREST, GL LINEAR,
GL NEAREST MIPMAP NEAREST, GL LINEAR MIPMAP LINEAR, ...
Mipmapping
0 1 2 3
Compara¸c˜ ao entre filtros
Filtrosnearest xbilinear
Compara¸c˜ ao entre filtros
Filtrosbilinearxtrilinear
Compara¸c˜ ao de desempenho
Compara¸c˜ao entre 4 diferentes m´aquinas
Espa¸co de mem´ oria
Qual o espa¸co de mem´oria adicional para armazenar a pirˆamide?
I Considerando uma imagem RGB
Gasta-se apenas 1/3 a mais de mem´oria para textura RGB
Espa¸co de mem´ oria
Qual o espa¸co de mem´oria adicional para armazenar a pirˆamide?
I Considerando uma imagem RGB
Gasta-se apenas 1/3 a mais de mem´oria para textura RGB
Espa¸co de mem´ oria
Qual o espa¸co de mem´oria adicional para armazenar a pirˆamide?
I Considerando uma imagem RGB
Gasta-se apenas 1/3 a mais de mem´oria para textura RGB
Espa¸co de mem´ oria
Qual o espa¸co de mem´oria adicional para armazenar a pirˆamide?
I Considerando uma imagem RGB
Filtro de mipmapping
Filtro isotr´opico
I Usa-se a quadril´atero que aproxima o mapeamento do fragmento no espa¸co de textura
texel
projected fragment
Filtro de mipmapping
Filtro anisotr´opico
I Utiliza diversas amostras e faz a m´edia dos texels resultantes
amostras de mipmapping linha de anisotropia
Compara¸c˜ ao entre filtros
Filtro anisotr´opico deixa imagem mais n´ıtida
Compara¸c˜ ao entre filtros
Filtro anisotr´opico “retarda” subida na pirˆamide
Fun¸c˜ oes de textura
Determina combina¸c˜ao de cor do fragmento com texel resultante
glTexEnv∗ (target, pname, param);
Fun¸c˜oes (para textura RGBA)
I Replace: c =ct,a=at I Modulate: c =cfct,a=at
I Decal: c =cf(1−at) +ctat,a=af
I Blend: c =cf(1−at) +ccct,a=afat
Fun¸c˜ oes de textura
ReplaceeModulate
Multi-textura
Mapeamento de diferentes unidades de textura
I Fragmento ´e combinado com texels em sequˆencia Frag
Texel 0
Fragres
Texel 1
Fragres
Texel 2
Fragres
Fragres
Multi-textura
Especifica¸c˜ao das texturas
I glActiveTexture(unit): seleciona unidade corrente
I Fun¸c˜oesglBindTexture(), glTexEnv∗(), glTexGen∗()
afetam apenas unidade corrente
Especificando coordenadas de textura
I API convencional: glMultiTexCoord∗(texunit, coords) I API de array, ativa unidade para cliente:
glClientActiveTexture(texunit)
Texture combiners
Flexibiliza a combina¸c˜ao de fragmentos e texels Exemplo
I Seleciona o uso de combiners
glTexEnvi(GL TEXTURE ENV, GL TEXTURE ENV MODE, GL COMBINE);
I Seleciona combina¸c˜ao de RGB e alphadesejados
glTexEnvi(GL TEXTURE ENV, GL COMBINE RGB, GL MODULATE);
glTexEnvi(GL TEXTURE ENV, GL COMBINE ALPHA, GL SUBTRACT);
I Define operandos
Textura 1D
Exemplos de aplica¸c˜ao
I Mapas de propriedades
I Escala de cores na textura
I Propriedade mapeada para coordenadas
I Matriz de textura normaliza valores
I N´evoa vertical
I Intensidade da n´evoa mapeada na textura
I Valor des proporcional a altura
Textura 3D
Exemplos de aplica¸c˜oes
I Aplica¸c˜ao de propriedades 3D
I Material volum´etrico
I Mapa 3D de ilumina¸c˜ao
I Visualiza¸c˜ao volum´etrica
I Area m´´ edica
I Area cient´ıfica´
Textura 3D
Exemplos de aplica¸c˜oes
I Aplica¸c˜ao de propriedades 3D
I Material volum´etrico
I Mapa 3D de ilumina¸c˜ao
I Visualiza¸c˜ao volum´etrica
I Area m´´ edica
I Area cient´ıfica´
Implementa¸c˜ ao no grafo de cena
Fora do pipeline
I Carga e defini¸c˜ao do objeto de textura
glBindTexture(...)
glTexImage∗(...), glTexParameter∗(...)
Como parte do pipeline
I Fun¸c˜ao Load
glPushAttrib(GL TEXTURE BIT);
glBindTexture(...);
glTexEnv∗(...); glTexGen∗(...);
glEnable(...);