2010-08-10 4 views
2

J'ai rencontré un problème lors de la compilation d'un code openGl. La chose est que je veux atteindre l'anti-alias de scène complet et je ne sais pas comment. J'ai activé l'antialiasing de force à partir du panneau de contrôle Nvidia et c'était ce que je voulais vraiment gagner. Je le fais maintenant avec GL_POLYGON_SMOOTH. Évidemment, ce n'est pas efficace et beau. Voici les questionsAnticrénelage d'une scène entière après la restitution

1) Devrais-je utiliser l'échantillonnage multiple? 2) Où dans le pipeline est-ce que openGl mélange les couleurs pour l'anti-crénelage? 3) Quelles alternatives existent en plus de GL _ * _ SMOOTH et du multi-échantillonnage?

+0

AA ne fait-il pas partie de la rastérisation? –

Répondre

5

GL_POLYGON_SMOOTH est pas une méthode pour faire un plein écran AA (FSAA).

Vous ne savez pas ce que vous entendez par "pas efficace" dans ce contexte, mais il n'est certainement pas beau, à cause de sa tendance à se mélanger au milieu des mailles (aux bords du triangle).

Maintenant, en ce qui concerne le FSAA et vos questions:

  1. Multisampling (alias MSAA) est la manière standard d'aujourd'hui pour faire FSAA. L'alternative habituelle est le super-échantillonnage (SSAA), qui consiste à rendre à une résolution plus élevée et à sous-échantillonner à la fin. C'est beaucoup plus cher. La spécification indique que logiquement, le GL conserve un tampon d'échantillon (4x la taille du buffer de pixels, pour 4xMSAA), et un buffer de pixels (pour un total de 5x la mémoire), et sur chaque échantillon écrit dans l'échantillon buffer, met à jour le buffer de pixel avec la valeur résolue depuis les 4 échantillons actuels dans le buffer d'échantillon (ce n'est pas ce que l'on appelle blending, au passage.) Blending est ce qui se passe au moment de l'écriture dans le buffer d'échantillon contrôlé par glBlendFunc Al.). En pratique, ce n'est pas ce qui se passe dans le matériel. En règle générale, vous écrivez uniquement dans le tampon d'échantillons (et le matériel essaie généralement de compresser les données), et quand vient le temps de l'utiliser, l'implémentation GL résoudra le tampon complet en une fois, avant que l'utilisation ne se produise. Cela aide également si vous utilisez réellement le tampon d'échantillon directement (pas besoin de résoudre du tout, alors).
  2. J'ai couvert SSAA et son coût. La dernière technique s'appelle Morphological anti-aliasing (MLAA), et est activement recherchée. L'idée est de faire une passe de post-traitement sur l'image entièrement rendue, et d'anti-alias ce qui ressemble à des arêtes vives. La ligne de fond est, il n'est pas mis en œuvre par le GL lui-même, vous devez le coder comme une passe de post-traitement. Je l'inclut pour référence, mais il peut coûter quite a lot.
+0

MLAA est vraiment génial, mais n'essayez pas ceci à moins que vous ayez BEAUCOUP de temps pour l'implémenter correctement.Vous devriez aller pour MSAA. – Calvin1602

+0

@ Calvin1602: En effet. Voilà pourquoi je l'ai mentionné comme "encore en cours de recherche": D – Bahbar

3

j'ai écrit un post sur ce ici: Getting smooth, big points in OpenGL

Vous devez spécifier WGL_SAMPLE_BUFFERS et WGL_SAMPLES (ou préfixe GLX Xorg/GLX) avant de créer votre contexte OpenGL, lors de la sélection d'un format de pixel ou visuel. Sur Windows, assurez-vous d'utiliser wglChoosePixelFormatARB() si vous voulez un format de pixel avec des traits étendus, PAS ChoosePixelFormat() de GDI/GDI +. wglChoosePixelFormatARB doit être interrogé avec wglGetProcAddress à partir du pilote ICD, vous devez donc créer au préalable un contexte OpenGL fictif. Les pointeurs de fonction WGL sont valides même après la destruction du contexte OpenGL. WFL_SAMPLE_BUFFERS est un booléen (1 ou 0) qui bascule le multi-échantillonnage.

WGL_SAMPLES est le nombre de tampons que vous voulez. Typiquement 2,4 ou 8.

Questions connexes