2012-05-09 15 views
5

En una tarjeta NVIDIA que puede realizar completa de antialiasing con el buffer de acumulación algo como esto:antialiasing OpenGL sin el buffer de acumulación

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); 
} 

En las tarjetas ATI el buffer no se implementa, y todo el mundo dice que usted puede hacer eso en el lenguaje sombreador ahora. El problema con eso, por supuesto, es que GLSL es una barrera bastante alta para la entrada de un principiante de OpenGL.

¿Alguien me puede señalar algo que me muestre cómo hacer un anti-aliasing de escena completa de una manera que las tarjetas ATI pueden hacer, y que un novato puede entender?

Respuesta

14

¿Por qué alguna vez haría un antialiasing de esta manera, independientemente de si tiene búferes de acumulación o no? Simplemente use multisampling; no es gratis, pero es mucho más barato que lo que estás haciendo.

En primer lugar, debe crear un contexto con un búfer de muestreo múltiple. Eso significa que debe usar WGL/GLX_ARB_multisample, lo que significa que en Windows, debe hacer two-stage context creation. Debe solicitar un formato de píxel con 1 *_SAMPLE_BUFFERS_ARB y un número de *_SAMPLES_ARB. Cuanto mayor sea el número de muestras, mejor será el antialiasing (también el más lento). Puede obtener el número máximo de muestras con wglGetPixelFormatAttribfv o glXGetConfig.

Una vez que haya creado con éxito un contexto con un framebuffer multisample, lo renderizará de la forma habitual, con una excepción: llame al glEnable(GL_MULTISAMPLE) en su código de configuración. Esto activará la representación multiválvula.

Y eso es todo lo que necesita.

Alternativamente, si está utilizando GL 3.x o tiene acceso a ARB_framebuffer_object, puede omitir el contexto y crear un framebuffer de varias instancias. Su buffer de profundidad y buffer (es) de color deben tener el mismo número de muestras. Sugiero para estos, ya que todavía está utilizando la función fija (y no se puede texturizar desde una textura multimuestra en la interconexión de función fija).

Crea barras de representación multimuestreadas para el color y la profundidad (deben tener el mismo número de muestras). Los configura en un FBO y los procesa (con glEnable(GL_MULTISAMPLE), por supuesto). Cuando haya terminado, use glBlitFramebuffer para blit desde su framebuffer multisample al back-buffer (que no se debe multiempapetar).

El problema con eso, por supuesto, es que GLSL es una barrera bastante alta para la entrada de un principiante de OpenGL.

dice who? No hay nada malo con un principiante que aprende de sombreadores. De hecho, en mi experiencia, tales principiantes a menudo aprenden mejor, porque entienden los detalles de lo que está sucediendo de manera más efectiva.

+2

"¿Por qué alguna vez haría antialiasing de esta manera?" Es una técnica muy antigua de OpenGL redbook versión 1. A juzgar por el rendimiento del buffer de acumulación Sospecho que todo está completamente desacelerado, incluso en nvidia. Creo que el libro rojo también tenía "profundidad de campo" o algún efecto similar implementado usando el buffer de acumulación también ... – SigTerm

+0

"Alternativamente, si estás usando GL 3.x o tienes acceso a ARB_framebuffer_object, puedes omitir el contexto y crear un framebuffer multiespemado ". O EXT_framebuffer_multisample. – JWWalker

+0

"Por qué ..." No tenía idea de que esta era una forma horrible de hacer el trabajo.Es posible que llegue a esto desde una perspectiva rara, pero dudo que sea único. No estaba particularmente interesado en GL hasta que CL/CUDA apareció. Con contextos GL/CL compartidos, la capacidad de realizar operaciones informáticas en matrices, y luego hacer que se traten como objetos o texturas de búfer de vértices, de modo que pueda tener una representación visual de sus cálculos de alta velocidad sobre la marcha, es increíble. –

Cuestiones relacionadas