OpenGL antialiasing sans le tampon d'accumulation
Sur une carte NVIDIA, je peux effectuer en pleine scène de l'anti-aliasing en utilisant le tampon d'accumulation quelque chose comme ceci:
if(m_antialias)
{
glClear(GL_ACCUM_BUFFER_BIT);
for(int j = 0; j < antialiasing; j++)
{
accPerspective(m_camera.FieldOfView(), //Vertical field of view in degrees.
aspectratio, //The aspect ratio.
20., //Near clipping
1000.,
JITTER[antialiasing][j].X(), JITTER[antialiasing][j].Y(),
0.0, 0.0, 1.0);
m_camera.gluLookAt();
ActualDraw();
glAccum(GL_ACCUM, float(1.0 /antialiasing));
glDrawBuffer(GL_FRONT);
glAccum(GL_RETURN, float(antialiasing) /(j + 1));
glDrawBuffer(GL_BACK);
}
glAccum(GL_RETURN, 1.0);
}
Sur les cartes ATI le tampon d'accumulation n'est pas mis en œuvre, et tout le monde dit que vous pouvez le faire dans le langage de shader maintenant. Le problème avec ça, bien sûr, c'est que GLSL est plutôt une haute barrière à l'entrée pour un OpenGL débutant.
Quelqu'un peut-il m'indiquer quelque chose qui va me montrer comment faire toute la scène de l'anti-aliasing dans une manière que les cartes ATI peut faire, et qu'un débutant peut comprendre?
Vous devez vous connecter pour publier un commentaire.
Pourquoi voudriez-vous jamais faire l'antialiasing de cette façon, indépendamment de savoir si vous avez l'accumulation des tampons ou pas? Utilisez simplement multisampling; il n'est pas libre, mais il est beaucoup moins cher que ce que vous faites.
Tout d'abord, vous devez créer un contexte, avec une multisampled tampon. Cela signifie que vous devez utiliser WGL/GLX_ARB_multisample, ce qui signifie que sur Windows, vous devez faire deux étapes de création du contexte. Vous devriez demander un format de pixel avec 1
*_SAMPLE_BUFFERS_ARB
et certains nombre de*_SAMPLES_ARB
. Plus le nombre d'échantillons, le mieux l'anticrénelage (qui est aussi le plus lent). Vous pouvez obtenir le nombre maximum d'échantillons avecwglGetPixelFormatAttribfv
ouglXGetConfig
.Une fois que vous avez créé avec succès un contexte avec un multi-échantillons framebuffer, vous rendre comme d'habitude, à une exception près: appel
glEnable(GL_MULTISAMPLE)
dans votre code d'installation. Cela permettra d'activer multisampled rendu.Et c'est tout ce dont vous avez besoin.
Alternativement, si vous utilisez GL 3.x ou avoir accès à ARB_framebuffer_object, vous pouvez ignorer le contexte de trucs et de créer un multisampled framebuffer. Votre tampon de profondeur et tampon de couleur(s) doivent toutes avoir le même nombre d'échantillons. Je dirais à l'aide de renderbuffers pour ceux-ci, puisque vous êtes toujours à l'aide de fonction fixes (et vous ne pouvez pas la texture d'un multi-échantillons de texture dans le fixe en fonction de pipeline).
Vous créez multisampled renderbuffers de la couleur et de la profondeur (ils doivent avoir le même nombre d'échantillons). Vous les mettez dans un FBO, et de rendre à l'intérieur (avec
glEnable(GL_MULTISAMPLE)
, bien sûr). Lorsque vous avez terminé, vous pouvez alors l'utiliserglBlitFramebuffer
blit à partir de votre multi-échantillons framebuffer dans le back-buffer (qui ne devrait pas être multisampled).Dit qui? Il n'y a rien de mal avec un débutant l'apprentissage de shaders. En effet, dans mon expérience, tels les débutants apprennent souvent mieux, parce qu'ils comprennent les détails de ce qui se passe de manière plus efficace.
GLUT_MULTISAMPLE
à votre appel àglutInitDisplayMode
.SDL_GL_SetAttribute
pour définirSDL_GL_MULTISAMPLEBUFFERS
à 1 etSDL_GL_MULTISAMPLESAMPLES
à une valeur supérieure à 0, à la fois avant la création de la fenêtre.