Entendendo o antialiasing e o anisotropic filtering
Autor: Lex Luthor FX | Publicado: 2010-01-20T19:56:00-02:00

Antes de ser renderizada, a imagem 3D é uma espécie de  desenho vetorial, que pode ser exibido em qualquer resolução, sem perda de qualidade. O problema é que o monitor possui uma resolução definida, de forma que a placa de vídeo precisa renderizar a imagem de acordo com a limitação de resolução do monitor, muitas vezes descartando detalhes das imagens. 
A partir do ponto em que a placa de vídeo tem potência suficiente para renderizar os frames a uma resolução superior à do monitor, você pode ativar o uso de um algoritmo de antialiasing, o que permite aplicar parte dos ciclos ociosos em melhorar a qualidade das imagens exibidas. 
Os algoritmos de antialiasing são chamados genericamente de "FSAA" (Full-Screen Antialiasing). A  ideia básica é suavizar as imagens (sobretudo os contornos), reduzindo a granulação e tornando a imagem mais "lisa", de forma que ela aparente uma resolução maior que a real: 


showImage2("divImage_94873","http://www.gdhpress.com.br/blog/imagens//2009/10/aa_html_m28e69854.png",480,640)
 
Temos aqui um exemplo de aplicação do antialiasing. Nos dois screenshots temos exatamente a mesma cena, mas você pode perceber que a de baixo ficou com os contornos mais suaves e uma qualidade geral muito melhor: 


showImage2("divImage_33496","http://www.gdhpress.com.br/blog/imagens//2009/10/aa_html_46373520.jpg",480,640)
 


showImage2("divImage_85074","http://www.gdhpress.com.br/blog/imagens//2009/10/aa_html_m681e305c.jpg",480,640)
 
A primeira geração foi o SSAA (SuperSampling Antialiasing), suportado desde as primeiras versões das placas nVidia GeForce e ATI Radeon. A ideia por trás do SSAA é bastante simples: renderizar imagens 2, 4 ou 8 vezes maiores do que a resolução do monitor e em seguida reduzi-las até a resolução que será exibida, aplicando um algoritmo de antialiasing. Com isso os detalhes são suavizados e a imagem preserva a maior parte dos detalhes da imagem inicial. 
O grande problema é que usar o SSAA causa uma grande redução no desempenho da placa de vídeo, já que ela passa a essencialmente renderizar as imagens em uma resolução muito mais alta. Ao usar o valor "4X", a placa passa a renderizar imagens 4 vezes maiores que a resolução do monitor (2560×1600 ao usar 1280×800, por exemplo), o que reduz o fill-rate efetivo da placa a aproximadamente um quarto do valor original, reduzindo severamente o FPS em casos onde o limitante não é o processador ou o processamento de shaders. Isso faz com que o SSAA seja utilizável apenas em resoluções relativamente baixas, ou ao rodar jogos mais antigos. 
A segunda geração é o MSAA, suportado a partir das GeForce 3. No MSAA o cálculo de antialiasing é feito de forma mais inteligente com a renderização de múltiplas cópias de cada pixel e a interpolação entre eles e o uso de algoritmos otimizados, que permitem que a placa se concentre nos trechos da imagem onde o antialiasing vai resultar em um maior ganho de qualidade. Se dentro de um polígono existem 4 pixels idênticos, por exemplo, eles são processados como se fossem apenas um e o mesmo valor de cor é aplicado aos quatro. No SSAA eles seriam processados como 4 pixels separados, o que consumiria 4 vezes mais processamento. 
Com a aplicação de sucessivas melhorias no algoritmo do MSAA, tanto por parte da nVidia, quanto por parte da ATI, chegamos ao ponto atual, onde as placas são capazes de aplicar o algoritmo de Antialiasing com uma perda de desempenho relativamente pequena, se comparada ao que tínhamos na época do SSAA. 
O antialiasing pode ser ajustado tanto dentro dos jogos quanto através do driver. A configuração dentro das opções de cada jogo são quase sempre preferíveis, já que permitem escolher entre os modos oficialmente suportados pelo desenvolvedor. De uma maneira geral, o uso de antialiasing de 4x com multisampling é o melhor custo-benefício, já que oferece uma melhoria perceptível na qualidade, sem uma perda tão gritante no FPS. Os níveis mais altos (vai até o 16x) oferecem ganhos incrementais, mas a redução no FPS é grande demais. 
A segunda opção é forçar o uso de um modo específico através do driver, o que permite escolher entre todos os modos suportados pela placa, mas em compensação resulta em muito mais problemas. Um bom meio termo é o "Enhance the application setting", que tenta ativar a configuração quando possível, sem forçar o uso em jogos onde ela resulta em problemas. 
O Anisotropic Filtering, por sua vez, é uma técnica usada para melhorar a qualidade das texturas quando aplicadas sobre objetos de formato irregular (como, por exemplo, a textura aplicada sobre o piso, em jogos de primeira pessoa), evitando que a qualidade e a nitidez da textura variem de acordo com a proximidade. Veja um exemplo, com o anisotroic filtering ativado: 


showImage2("divImage_33643","http://www.gdhpress.com.br/blog/imagens//2009/10/aa_html_71dbf48e.jpg",480,640)
 

… e agora desativado: 


showImage2("divImage_3390","http://www.gdhpress.com.br/blog/imagens//2009/10/aa_html_14d7cc6e.jpg",480,640)
  
Tudo começou com o Bilinear Filtering, efeito usado em jogos antigos, onde a mesma textura é usada em toda a extensão do objeto, utilizando um simples algoritmo de zoom. O Bilinear Filtering é bastante leve, mas resulta em uma qualidade visual ruim, pois faz com que a parte mais próxima fique pixerizada. 
Em seguida veio o Trilinear Filtering, que utiliza diferentes versões da mesma textura (com diferentes tamanhos) para obter transições mais suaves. Dessa forma, uma versão de 512×512 maior da mesma textura pode ser utilizada na parte mais próxima e versões menores (de 256×256, 128×128, etc.) podem ser utilizadas na parte mais distante, amenizando o problema. Naturalmente, o uso do Trilinear Filtering consome mais recursos da placa, sobretudo mais memória, mas nas placas atuais a diferença não é tão grande assim. 
O Trilinear Filtering oferece resultados satisfatórios em superfícies verticais (como no caso das paredes e janelas), mas resulta em texturas borradas no caso de superfícies em ângulos abertos, como no caso do piso. 
O Anisotropic Filtering segue o mesmo princípio, mas utiliza um número muito maior de versões da mesma textura, incluindo também versões oblíquas, com resoluções como 128×512, 256×64 e assim por diante. Isso permite que a placa combine o uso de diferentes versões da mesma textura, aplicando as que mais se aproximam do ângulo de visão utilizado. 
Quando ativado, você pode configurar o Anisotropic Filtering com valores de 2x (duas vezes mais versões de cada textura do que no Trilinear Filtering) a 32x (32 vezes mais). 


showImage2("divImage_70585","http://www.gdhpress.com.br/blog/imagens//2009/10/aa_html_m3588ef8.png",480,640)
 
Cada aumento no valor corresponde a um pequeno ganho de qualidade, mas a partir de 8x a diferença torna-se muito pequena. De uma forma geral, os modos 2x e 4x são os que oferecem um melhor custo-benefício, já que oferecem um ganho tangível sobre o Trilinear Filtering, sem uma redução tão grande no FPS. 
A principal observação é que o Anisotropic Filtering taxa pesadamente o barramento com a memória, fazendo com que a placa passe a armazenar um volume muito maior de texturas (o que aumenta tanto o volume de memória de vídeo usada, quanto o volume de dados transferidos). 
Isso faz com que ele tenha um impacto relativamente pequeno sobre o FPS em placas como as Radeon HD 4870 ou as GeForce GTX 285 , que desfrutam de barramentos mais largos com a memória, mas seja desastroso em placas de baixo custo, como a HD 4650, onde a GPU é gargalada pelo barramento estreito. No caso delas, você acaba sendo obrigado a usar o Trilinear Filtering com texturas de média qualidade para manter um bom FPS.