Como implemento o anti-aliasing no OpenGL?

28

Quero fazer o anti-aliasing de tela cheia no OpenGL e não quero usar o anti-aliasing fornecido pelo próprio OpenGL, pois estou construindo um jogo e quero bons efeitos nele.

Como devo proceder?

noddy
fonte
Por "anti-aliasing fornecido pelo próprio GL", você se refere às antigas dicas de qualidade de linha e polígono com nomes inadequados que são rotuladas como "antialiasing" ou se refere ao uso regular de MSAA através de visuais GLX / WGL?
Lars Viklund

Respostas:

28

Existem várias alternativas para o MSAA nativo no OpenGL. Com os efeitos de pós-processamento, a melhor coisa sobre eles é que você pode simplesmente colocar o sombreador na imagem final não processada e isso faz o resto. Aqui estão três métodos que vale a pena dar uma olhada:

  • Anti-aliasing rápido e aproximado (Geeks3D) - bom na maioria dos casos. Muito fácil de aplicar e entender. A desvantagem é nítida, o ruído de alto contraste nas texturas fica um pouco desfocado. Bordas tão sutis quanto íngremes de 1/4 de pixels parecem extremamente precisas como o MSAA tradicional. Menos íngreme que isso, perde um pouco de precisão.

  • Anti-aliasing filtrado normal (GameDev ) - Ainda não foi testado com precisão, mas é o mais fácil de entender. Na melhor das hipóteses, lembra 16x MSAA e, na pior das hipóteses, é como 2x MSAA. Ele gera um mapa normal temporário para representar arestas e ângulos relativos. Você pode experimentar o mapa normal com diferença de luminosidade ou diferença de cor.

  • Anti-aliasing morfológico (Iryoku) - foi aprimorado para SMAA - Subpixel Mophological AA. É bastante complexo em 4 passagens, mas alcança os melhores resultados que eu já vi. Cria gradientes ao longo das arestas tão graduais quanto 1/100 a 1/200 pixels íngremes (!). A amostragem pode ser baseada em luma, em cores ou em profundidade. As texturas ficam muito nítidas e limpas. (o exemplo é baseado em DX10 e HLSL, levaria algum tempo para portá-lo para GLSL com precisão)

Essas técnicas não fazem superamostras ou várias amostras, portanto, as linhas que aparecem com menos de 1 pixel de espessura aparecerão com intervalos e não serão suavizadas. Esta é a desvantagem de usar uma abordagem que não seja da MSAA. Como você está trabalhando apenas com uma imagem rasterizada em resolução total, não é possível criar informações adicionais a partir dessas lacunas vazias.

Observe que todas essas técnicas dependem da amostragem dos valores adjacentes de luma (brilho) ou croma (cor). O cálculo da luma e da correção de gama opcional requer instruções adicionais no shader AA, embora seja bastante direto. Você pode descarregar isso calculando a luma no shader anterior que fornece a imagem não retocada, armazenando a luma no canal alfa. Em seguida, no shader AA, você simplesmente experimentará o alfa.

ChrisC
fonte
7

Existem várias maneiras de fazer o antialiasing. Uma é usar o anti-aliasing de várias amostras (MSAA), onde seu buffer traseiro realmente armazena várias amostras de sub-pixel e, quando você renderiza triângulos, linhas etc., o sistema preenche automaticamente o conjunto correto de amostras em cada pixel. Em seguida, no final da renderização, a imagem é "resolvida" calculando a média de todas as amostras de subpixels para obter uma amostra por pixel.

Outra maneira é usar o antialiasing de pós-processamento, onde você renderiza a cena como normal e depois faz um desfoque direcionado no resultado final para ocultar bordas com alias. Existem várias técnicas para isso, mas uma das melhores / mais populares no momento é chamada FXAA (Anti-Aliasing rápido e aproximado).

O MSAA geralmente fornece resultados melhores do que o AA de pós-processamento, mas pode ser mais lento porque requer aproximadamente o dobro da largura de banda da memória para cada operação de renderização. O MSAA também pode exigir mais memória de vídeo que o AA pós-processamento, dependendo dos detalhes da instalação.

Você pode encontrar informações específicas sobre a implementação do MSAA ou FXAA na Web - basta pesquisar no google um desses termos.

Nathan Reed
fonte
2

Você está disposto a codificar seu próprio shader GLSL? Nesse caso, verifique este tutorial.

Dan
fonte
Bem, eu gostaria de fazê-lo usando shaders porque im usando shaders para outros efeitos como well.Could você fornecer algumas outras ligações para shaders bem
noddy