Come posso implementare l'antialiasing in OpenGL?


28

Voglio fare l'anti-aliasing a schermo intero in OpenGL e non voglio usare l'anti-alias fornito dallo stesso OpenGL, dal momento che sto costruendo un gioco e voglio buoni effetti in esso.

Come devo procedere?


Con "l'anti-aliasing fornito dallo stesso GL", ti riferisci ai vecchi suggerimenti sulla qualità delle linee e dei poligoni scarsamente nominati che sono etichettati come "antialiasing", o ti riferisci all'utilizzo di MSAA normale tramite elementi visivi GLX / WGL?
Lars Viklund,

Risposte:


28

Esistono diverse alternative a MSAA nativo in OpenGL. Con gli effetti di post-elaborazione, la cosa migliore di loro è che di solito puoi semplicemente gettare lo shader nell'immagine finale non elaborata e fa il resto. Ecco tre metodi che vale la pena dare un'occhiata:

  • Anti-aliasing approssimativo rapido (Geeks3D) - Buono nella maggior parte dei casi. Abbastanza facile da applicare e da capire. Lo svantaggio è netto, il rumore ad alto contrasto nelle trame viene leggermente sfocato. I bordi sottili come 1/4 pixel ripidi sembrano estremamente precisi come i tradizionali MSAA. Meno ripido di quello, perde un po 'di precisione.

  • Normal Filtered Anti-Aliasing (GameDev ): non l'ho ancora testato con precisione, ma è il più facile da capire. Nel migliore dei casi ricorda 16x MSAA e nel peggiore dei casi è come 2x MSAA. Genera una mappa normale temporanea per rappresentare i bordi e gli angoli relativi. Puoi campionare la mappa normale con la differenza di luminanza o la differenza di colore.

  • Anti-aliasing morfologico (Iryoku) - migliorato con SMAA - Subpixel Mophological AA. È piuttosto complesso in 4 passaggi, ma ottiene i migliori risultati che abbia mai visto. Crea pendenze lungo i bordi con una pendenza da 1/100 a 1/200 pixel (!). Il campionamento può essere basato su luma, colore o profondità. Le trame rimangono molto nitide e pulite. (l'esempio è basato su DX10 e HLSL, richiederebbe un po 'di tempo per portarlo con precisione su GLSL)

Queste tecniche non eseguono il supercampionamento o il campionamento multiplo, quindi le linee che appaiono con uno spessore inferiore a 1 pixel verranno visualizzate con spazi vuoti e non verranno anti-alias correttamente. Questo è il lato negativo dell'utilizzo di un approccio non MSAA. Dato che stai lavorando con un'immagine raster alla massima risoluzione, non puoi creare ulteriori informazioni da questi vuoti vuoti.

Si noti che tutte queste tecniche dipendono dal campionamento dei valori adiacenti di luminanza (luminosità) o crominanza (colore). Il calcolo della luminanza e la correzione gamma opzionale richiedono ulteriori istruzioni sullo shader AA, sebbene sia piuttosto semplice. Puoi scaricarlo calcolando la luminanza nello shader precedente che fornisce l'immagine non ritoccata, memorizzando la luminanza nel canale alfa. Quindi nello shader AA, campionerai semplicemente l'alfa.


7

Esistono molti modi per eseguire l'antialias. Uno consiste nell'utilizzare l'antialiasing multisample (MSAA), in cui il back buffer memorizza effettivamente più campioni sub-pixel e quando si esegue il rendering di triangoli, linee, ecc. Il sistema riempie automaticamente l'insieme corretto di campioni in ciascun pixel. Quindi alla fine del rendering l'immagine viene "risolta" facendo la media su tutti i campioni sub-pixel per ottenere un campione per pixel.

Un altro modo è utilizzare l'antialiasing post-elaborazione, in cui si esegue il rendering normale della scena e quindi si esegue una sfocatura mirata sul risultato finale per nascondere i bordi con alias. Esistono diverse tecniche per questo, ma una delle migliori / più popolari al momento si chiama FXAA (Fast approximate Anti-Aliasing).

MSAA fornirà generalmente risultati più belli rispetto alla post-elaborazione AA, ma può essere più lento perché richiede circa il doppio della larghezza di banda della memoria per ogni operazione di rendering. MSAA può anche richiedere più memoria video rispetto alla post-elaborazione AA, a seconda dei dettagli della configurazione.

Puoi trovare informazioni specifiche sull'implementazione di MSAA o FXAA sul Web, basta andare su uno di questi termini.


2

Sei disposto a codificare il tuo shader GLSL? In tal caso, consulta questo tutorial.


beh, vorrei farlo usando gli shader perché sto usando gli shader anche per altri effetti. Potresti fornire anche altri link per gli shader
annuisce,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.