Índice das dicas

Entendendo o antialiasing e o anisotropic filtering

Por Carlos E. Morimoto em 26 de outubro de 2009 às 03h29

9

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:

aa_html_m28e69854

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:

aa_html_46373520

aa_html_m681e305c

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 (2560x1600 ao usar 1280x800, 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.

aa_html_m33100e86

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:

aa_html_71dbf48e

... e agora desativado:

aa_html_14d7cc6e

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 512x512 maior da mesma textura pode ser utilizada na parte mais próxima e versões menores (de 256x256, 128x128, 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 128x512, 256x64 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).

aa_html_m3588ef8

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 Radeon 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.

9 comentáriosPor Carlos E. Morimoto. Revisado 23 de março de 2011 às 12h35

Comentários

 
por Henrique A. (anônimo) em 3 de fevereiro de 2011 às 23h08
Muito bem explicado. Parabéns!
 
por Paulo Eduardo (anônimo) em 9 de novembro de 2009 às 15h11
para Marcos Elias: uma idéia que sempre tive é oferecer nos jogos uma opção tipo "half-resolution", por exemplo: num monitor 1280x800 (widescreen), o próprio jogo poderia oferecer esta opção "low-end" e utilizar uma resolução dividida ao meio nos dois eixos, neste exemplo 640x400. Inclusive poderia ser utilizado AF e AA, já que resoluções menores exigem menos da GPU. Neste caso o upscaling do monitor irá funcionar muito melhor, porque a cada pixel recebido ele irá colocar 2 na tela, resultando numa imagem melhor do que uma "esticada" para caber na tela inteira. O que acha dessa idéia morimoto?
 
por Eduardo SóAres (anônimo) em 3 de novembro de 2009 às 10h18
O melhor é fazer com que o jogador possa aproveitar todas as inovações e efeitos do jogo, pois isso enrriquece muito mais a experiencia de jogo do que apenas uma resolução maior. Por isso, é melhor manter a velocidade e jogabilidade, ainda que a resolução final tenha que ser sacrificada. Isso é o que as softhouse fazem com o desenvolvimento de jogos. Na dúvida, utilizam o hardware dos consoles para processar os efeitos visuais, como fumaça, sombra, etc e tal, reduzindo a resolução nativa dos jogos e deixam que os próprios circuitos da placa de vídeo ou monitor façam o upscale internamente. Por isso, na minha opnião, vale muito mais um visual mais suave, com o anti-aliasing ligado numa resolução baixa, que uma resolução alta sem. Mas na prática, vai depender do monitor q vc está usando e do tipo de jogo também...
 
por Fernando Villela (anônimo) em 31 de outubro de 2009 às 10h44
Qual seria melhor? Aumentar a resolução para um determinado jogo, ou deixar uma resolução mais baixa e abilitar algum tipo de anti-aliasing tipo (2x ou 4x). Qual traria uma imagem melhor, qual traria mais peso para a placa, barramento, memória?
 
por Marcos Elias (anônimo) em 29 de outubro de 2009 às 05h12
É... rsrs Mas ajudaria a sair mais low e mid-end nos mercados "emergentes" :P

(mas liberar o uso de uma resolução mais alta em monitores de baixa resolução via redimensionamento poderia ser até interessante em alguns casos...)
 
por Marcos Elias (anônimo) em 28 de outubro de 2009 às 04h34
No tocante a anti-aliasing... Uma curiosidade que tenho, vc Morimoto já ouviu alguma coisa sobre, ou nunca?

É isso: usar resoluções mais baixas do que a nativa em monitores LCD pode ser uma experiência bastante desagradável. Mas é a "opção" quando algum game pesado não roda bem nas resoluções altas em placas mais antigas ou low-end.

Porém uma imagem bitmap redimensionada para a resolução nativa poderia resolver melhor o problema, visto que ficaria mais bonita e lisa. Na prática a fonte da imagem teria a resolução mais baixa, só que algum programa ou o driver de vídeo poderia enviá-la ao monitor redimensionada numa resolução mais alta. O sistema operacional enxergaria uma resolução alta, só que a placa de vídeo trabalharia com imagens de resolução diferente e entregaria elas em resolução alta. Isso existe ou já teve algum projeto sobre o tema?

Um exemplo: ao rodar um game a 1024x768 num monitor de 1680x1050 ele fica "feio".

Nesse modo a placa de vídeo geraria as imagens a 1024x768, redimensionaria elas para 1680x1050 aplicando algum anti-aliasing (desconsiderando a quebra da proporção) e entregaria ao monitor a 1680x1050. Vai perder qualidade, mas deve ser bem menos do que os monitores fazem.

Elas seriam exibidas com muito mais qualidade, e creio que o trabalho adicional da placa seja irrisório. Redimensionar uma única imagem antes de enviar para a tela, perto das renderizações e redimensionamentos que ela faz várias vezes por segundo nos games, deve ser insignificante em perda de desempenho.

Para quem não pegou a idéia... Tire um print de um game a 1024x768, redimensione num bom programa gráfico (exclui-se o Paint do Windows) a imagem para 1680x1050 e veja a qualidade.

É melhor do que ver o porco redimensionamento feito pelo monitor.

Uma idéia melhor

Aliás... Seria interessante se os monitores fizessem isso, com algum SoC otimizado para trabalhar na frequencia default do monitor (geralmente 60 Hz), para evitar desperdiçar quadros (o que ocorreria se isso operasse na placa de vídeo com altos FPS). Pega a imagem em resolução fora da nativa (poderia até ser mais alta!), redimensiona ela e joga pra tela na resolução nativa. Pronto, acabaram os problemas de imagem feia :)

Eles já devem ter alguma coisa do gênero pra poder redimensionar, mas não aplicam um bom anti-aliasing. Será que isso encareceria "demais" os monitores?
por Carlos E. Morimoto
 
por ddragoonss (anônimo) em 26 de outubro de 2009 às 14h20
Perfeito, simples e aprendi algo que vou levar pra vida toda.

Uma continuação sobre o resto dos "nomes estranhos" nas configurações seria algo totalmente bem-vindo.
 
por Thiago (anônimo) em 26 de outubro de 2009 às 07h07
Simplesmente maravilhoso esse artigo. Vivendo e aprendendo com o Professor Morimoto! Adorei!