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

K. *_*ord 5 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Nic*_*las 14

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

首先,您必须使用多重采样缓冲区创建上下文.这意味着您需要使用WGL/GLX_ARB_multisample,这意味着在Windows上,您需要创建两阶段上下文.您应该请求1 *_SAMPLE_BUFFERS_ARB和1的像素格式*_SAMPLES_ARB.样本数越多,抗锯齿效果越好(也越慢).您可以使用wglGetPixelFormatAttribfv或获取最大样本数glXGetConfig.

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

这就是你所需要的.

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

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

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

谁说的?初学者从着色器学习没有错.事实上,根据我的经验,这些初学者往往学得更好,因为他们更了解有关事情的细节.

  • "为什么你会这样做抗锯齿"这是一个非常古老的技术来自OpenGL红皮书版本1.从累积缓冲区的性能判断我怀疑整个事情完全没有加速 - 即使在nvidia.我认为红皮书也具有"景深"或者使用累积缓冲器实现的类似效果...... (2认同)