Para entender a natureza da filtragem anisotrópica, você precisa ter um entendimento firme do que realmente significa o mapeamento de textura.
O termo "mapeamento de textura" significa atribuir posições em um objeto a locais em uma textura. Isso permite que o rasterizador / sombreador busque, para cada posição no objeto, os dados correspondentes da textura. O método tradicional para fazer isso é atribuir a cada vértice de um objeto uma coordenada de textura, que mapeia diretamente essa posição para um local na textura. O rasterizador interpola essa coordenada de textura pelas faces dos vários triângulos para produzir a coordenada de textura usada para buscar a cor da textura.
Agora, vamos pensar no processo de rasterização. Como isso funciona? Ele pega um triângulo e o divide em blocos do tamanho de pixels que chamaremos de "fragmentos". Agora, esses blocos de tamanho de pixel são do tamanho de pixel em relação à tela.
Mas esses fragmentos não têm tamanho de pixel em relação à textura. Imagine se nosso rasterizador gerasse uma coordenada de textura para cada canto do fragmento. Agora imagine desenhar esses quatro cantos, não no espaço da tela, mas no espaço da textura . Que forma seria essa?
Bem, isso depende das coordenadas da textura. Ou seja, depende de como a textura é mapeada para o polígono. Para qualquer fragmento em particular, pode ser um quadrado alinhado ao eixo. Pode ser um quadrado não alinhado ao eixo. Pode ser um retângulo. Pode ser um trapézio. Pode ser praticamente qualquer figura de quatro lados (ou pelo menos convexa).
Se você estivesse acessando a textura corretamente, a maneira de obter a cor da textura para um fragmento seria descobrir qual é esse retângulo. Em seguida, busque cada texel da textura dentro desse retângulo (usando a cobertura para dimensionar as cores que estão na borda). Então avalie-os todos juntos. Isso seria um mapeamento de textura perfeito.
Também seria extremamente lento .
No interesse do desempenho, tentamos aproximar a resposta real. Baseamos as coisas em uma coordenada de textura, em vez das 4 que cobrem toda a área do fragmento no espaço texel.
A filtragem baseada em Mipmap usa imagens de resolução mais baixa. Essas imagens são basicamente um atalho para o método perfeito, calculando previamente como seriam os grandes blocos de cores quando combinados. Portanto, quando seleciona um mapa mip mais baixo, ele usa valores pré-calculados em que cada texel representa uma área da textura.
A filtragem anisotrópica funciona aproximando o método perfeito (que pode e deve ser acoplado ao mipmapping) através da captura de um número fixo de amostras adicionais. Mas como ele descobre a área no espaço texel para buscar, uma vez que ainda é dada apenas uma coordenada de textura?
Basicamente, ele trapaceia. Como os sombreadores de fragmento são executados em blocos vizinhos 2x2, é possível calcular a derivada de qualquer valor no sombreador de fragmento no espaço de tela X e Y. Em seguida, usa essas derivadas, juntamente com a coordenada de textura real, para calcular uma aproximação de qual seria a pegada de textura do verdadeiro fragmento. E, em seguida, ele executa várias amostras nessa área.
Aqui está um diagrama para ajudar a explicá-lo:
Os quadrados em preto e branco representam nossa textura. É apenas um tabuleiro de damas de 2x2 texels branco e preto.
O ponto laranja é a coordenada da textura do fragmento em questão. O contorno vermelho é a pegada do fragmento, centralizada na coordenada da textura.
As caixas verdes representam os texels que uma implementação de filtragem anisotrópica pode acessar (os detalhes dos algoritmos de filtragem anisotrópica são específicos da plataforma, portanto, só posso explicar a idéia geral).
Este diagrama em particular sugere que uma implementação pode acessar 4 texels. Ah, sim, as caixas verdes cobrem 7 delas, mas a caixa verde no centro pode ser buscada em um mapa mip menor, buscando o equivalente a 4 texels em uma busca. Obviamente, a implementação ponderaria a média dessa busca em 4 em relação às únicas texel.
Se o limite de filtragem anisotrópica fosse 2 em vez de 4 (ou superior), a implementação selecionaria 2 dessas amostras para representar a pegada do fragmento.