Partilhar via


Filtragem de textura bilinear (Direct3D 9)

As texturas são sempre endereçadas linearmente de (0.0, 0.0) no canto superior esquerdo para (1.0, 1.0) no canto inferior direito, conforme mostrado na ilustração a seguir.

ilustração de textura 4 x 4 com blocos sólidas de cor

As texturas geralmente são representadas como se fossem compostas de blocos sólidos de cor, mas é mais correto pensar nas texturas da mesma maneira que você pensaria na exibição de rasterização: cada texel é definido no centro exato de uma célula de grade, conforme mostrado na ilustração a seguir.

ilustração de textura 4 x 4 com texels definidos no centro das células de grade

Se você solicitar a amostra de textura para a cor dessa textura nas coordenadas UV (0,375, 0,375), você receberá vermelho sólido (255, 0, 0). Isso faz todo o sentido porque o centro exato da célula texel vermelha está em UV (0,375, 0,375). E se você pedir a amostra de cor da textura UV (0,25, 0,25)? Isso não é tão fácil, porque o ponto em UV (0,25, 0,25) está no canto exato de 4 texels.

O esquema mais simples é simplesmente fazer com que o sampler retorne a cor do texel mais próximo; isso é chamado de Filtragem de ponto (consulte Amostragem de ponto mais próximo (Direct3D 9)) e geralmente é indesejável devido a resultados granulares ou bloqueados. A amostragem de pontos de nossa textura em UV (0,25, 0,25) mostra outro problema sutil com filtragem por ponto mais próximo: há quatro texels equidistantes do ponto de amostra, por isso não há um único texel mais próximo. Um desses quatro texels será escolhido como a cor retornada, mas a seleção depende de como a coordenada é arredondada, o que pode introduzir artefatos que causam danos (consulte o artigo sobre amostragem por ponto mais próximo no SDK).

Um esquema de filtragem um pouco mais preciso e mais comum é calcular a média ponderada dos 4 texels mais próximos do ponto de amostragem; isso é chamado de filtragem Bilinear, e o custo computacional extra geralmente é insignificante porque essa rotina é implementada no hardware gráfico moderno. Veja as cores que obtemos em alguns pontos de amostragem diferentes usando a filtragem bilinear:

UV: (0.5, 0.5)

Esse ponto fica localizado na borda exata entre os texels vermelhos, verdes, azuis e brancos. A cor retornada pela amostragem é cinza:

  0.25 * (255, 0, 0)
  0.25 * (0, 255, 0) 
  0.25 * (0, 0, 255) 
## + 0.25 * (255, 255, 255) 
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)

Esse ponto fica localizado no ponto intermediário da borda entre os texels vermelhos e verdes. A cor retornada pela amostragem é amarelo-cinza (observe que as contribuições de texels azuis e brancos são dimensionadas como 0):

  0.5 * (255, 0, 0)
  0.5 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)

Esse é o endereço do texel vermelho, que é a cor retornada (todos os outros texels do cálculo de filtragem são ponderados para 0):

  1.0 * (255, 0, 0)
  0.0 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (255, 0, 0)

Compare esses cálculos com a ilustração a seguir, que mostra o que acontece se o cálculo de filtragem bilinear for executado em cada endereço de textura na textura de 4 x 4.

Ilustração de textura 4 x 4 com filtragem bilinear realizada em todos os endereços de textura

Filtragem de textura