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