Comment implémenter l'anti-aliasing dans OpenGL?

28

Je veux faire l'anti-aliasing en plein écran dans OpenGL, et je ne veux pas utiliser l'anti-aliasing fourni par OpenGL lui-même, car je construis un jeu et je veux de bons effets.

Comment dois-je procéder?

hoquet
la source
Par «l'anti-aliasing fourni par GL lui-même», faites-vous référence aux anciens indices de qualité de ligne et de polygone mal nommés qui sont étiquetés comme «antialiasing», ou faites-vous référence à l'utilisation de visuels MSAA réguliers via GLX / WGL?
Lars Viklund

Réponses:

28

Il existe plusieurs alternatives à MSAA natif dans OpenGL. Avec les effets de post-traitement, la meilleure chose à leur sujet est que vous pouvez généralement simplement ajouter le shader à l'image finale non traitée et faire le reste. Voici trois méthodes qui valent le coup d'œil:

  • Anticrénelage approximatif rapide (Geeks3D) - Bon dans la plupart des cas. Assez facile à appliquer et à comprendre. L'inconvénient est net, le bruit de contraste élevé dans les textures est un peu flou. Des arêtes aussi subtiles que 1/4 de pixels raides semblent d'une précision absolue comme le MSAA traditionnel. Moins raide que cela, elle perd un peu de précision.

  • Anti-aliasing filtré normal (GameDev ) - Je n'ai pas encore testé celui-ci avec précision, mais c'est le plus facile à comprendre. Dans le meilleur des cas, il ressemble à 16x MSAA et dans le pire des cas, c'est comme 2x MSAA. Il génère une carte normale temporaire pour représenter les arêtes et les angles relatifs. Vous pouvez échantillonner la carte normale avec une différence de luma ou une différence de couleur.

  • Anticrénelage morphologique (Iryoku) - amélioré en SMAA - Subpixel Mophological AA. C'est assez complexe à 4 passes, mais obtient les meilleurs résultats que j'ai vus. Il crée des dégradés le long des bords aussi graduels que 1/100 à 1/200 pixels raides (!). L'échantillonnage peut être basé sur la luma, la couleur ou la profondeur. Les textures restent très nettes et propres. (l'exemple est basé sur DX10 et HLSL, il faudrait un certain temps pour le porter avec GLSL avec précision)

Ces techniques ne permettent pas de suréchantillonner ou de multiéchantillonner, de sorte que les lignes qui apparaissent en dessous de 1 pixel d'épaisseur apparaîtront avec des espaces et ne seront pas anticrénelées correctement. C'est l'inconvénient d'utiliser une approche non MSAA. Comme vous ne travaillez qu'avec une image raster en pleine résolution, vous ne pouvez pas créer d'informations supplémentaires à partir de ces espaces vides.

Notez que toutes ces techniques dépendent de l'échantillonnage des valeurs de luma (luminosité) ou de chroma (couleur) adjacentes. Le calcul de la luminance et de la correction gamma en option nécessite des instructions supplémentaires sur le shader AA, bien que ce soit assez simple. Vous pouvez décharger cela en calculant la luma dans le shader précédent qui fournit l'image non retouchée, en stockant la luma dans le canal alpha. Ensuite, dans le shader AA, vous échantillonnerez simplement l'alpha.

ChrisC
la source
7

Il existe de nombreuses façons de faire l'anti-crénelage. La première consiste à utiliser l'anticrénelage multi-échantillons (MSAA), où votre tampon arrière stocke en fait plusieurs échantillons de sous-pixels, et lorsque vous restituez des triangles, des lignes, etc., le système remplit automatiquement le jeu d'échantillons correct dans chaque pixel. Ensuite, à la fin du rendu, l'image est "résolue" en faisant la moyenne de tous les échantillons de sous-pixels pour obtenir un échantillon par pixel.

Une autre façon consiste à utiliser l'anticrénelage de post-traitement, où vous effectuez un rendu normal de la scène, puis effectuez un flou ciblé sur le résultat final pour masquer les bords aliasés. Il existe une variété de techniques pour cela, mais l'une des meilleures / des plus populaires pour le moment s'appelle FXAA (Fast approXimate Anti-Aliasing).

MSAA donne généralement de meilleurs résultats que le post-traitement AA, mais peut être plus lent car il nécessite environ le double de la bande passante mémoire pour chaque opération de rendu. MSAA peut également nécessiter plus de mémoire vidéo que le post-traitement AA, selon les détails de la configuration.

Vous pouvez trouver des informations spécifiques sur la mise en œuvre de MSAA ou FXAA sur le Web - il suffit de rechercher sur Google l'un de ces termes.

Nathan Reed
la source
2

Êtes-vous prêt à coder votre propre shader GLSL? Si oui, consultez ce tutoriel.

Dan
la source
eh bien je voudrais le faire en utilisant des shaders parce que j'utilise aussi des shaders pour d'autres effets.Pouvez-vous également fournir d'autres liens pour les shaders
noddy