没有累积缓冲区的OpenGL抗锯齿

时间:2012-05-09 01:50:59

标签: opengl antialiasing

在NVIDIA显卡上,我可以使用这样的累积缓冲区执行全场景抗锯齿:

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

在ATI卡上没有实现累积缓冲区,并且每个人都说现在可以用着色器语言执行此操作。当然,问题在于GLSL是OpenGL初学者进入的一个很高的障碍。

有人能指出一些能告诉我如何以ATI卡可以做的方式进行全景抗锯齿,以及新手可以理解的东西吗?

1 个答案:

答案 0 :(得分:14)

为什么你会用这种方式进行抗锯齿,无论你是否有累积缓冲区?只需使用multisampling;它不是免费的,但它比你正在做的便宜得多。

首先,您必须使用多重采样缓冲区创建上下文。这意味着您需要使用WGL/GLX_ARB_multisample,这意味着在Windows上,您需要two-stage context creation。您应该要求使用1 *_SAMPLE_BUFFERS_ARB和一些*_SAMPLES_ARB的像素格式。样本数越多,抗锯齿效果越好(也越慢)。您可以使用wglGetPixelFormatAttribfvglXGetConfig获取最大数量的样本。

使用多重采样帧缓冲区成功创建上下文后,您可以正常渲染,但有一个例外:在设置代码中调用glEnable(GL_MULTISAMPLE)。这将激活多重采样渲染。

这就是你所需要的。

或者,如果您使用的是GL 3.x或可以访问ARB_framebuffer_object,则可以跳过上下文内容并创建多重采样帧缓冲区。您的深度缓冲区和颜色缓冲区必须具有相同数量的样本。我建议使用using renderbuffers,因为你仍在使用固定功能(并且你不能在固定功能管道中使用多重采样纹理进行纹理化)。

您可以为颜色和深度创建多重采样渲染缓冲区(它们必须具有相同数量的样本)。您可以在FBO中进行设置,并将其渲染到它们中(当然,使用glEnable(GL_MULTISAMPLE))。完成后,然后使用glBlitFramebuffer从多重采样帧缓冲区进入后缓冲区(不应进行多重采样)。

  

当然,问题在于GLSL是OpenGL初学者进入的一个很高的障碍。

说谁?初学者从着色器学习没有任何问题。事实上,根据我的经验,这些初学者经常学习更好,因为他们更了解有关事情的细节。