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.
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.
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.
Tópicos relacionados