不使用累积缓冲区的OpenGL抗锯齿技术

5

在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显卡上,累加缓冲区未被实现。现在每个人都认为你可以在着色器语言中完成这项任务。当然,问题是对于OpenGL初学者来说,GLSL是一个相当高的门槛。

有没有人能指点我如何以ATI显卡可以处理的方式进行全景抗锯齿,并且易于新手理解?

1个回答

15
无论是否使用累加缓冲区,为什么您要以这种方式执行反走样呢?只需使用多重采样即可;它不是免费的,但比您的方法便宜得多。
首先,您需要创建一个带多重采样缓冲区的上下文。这意味着您需要使用WGL/GLX_ARB_multisample,这意味着在Windows上,您需要进行两阶段上下文创建。您应该请求具有 1 *_SAMPLE_BUFFERS_ARB 和一些数量的 *_SAMPLES_ARB 的像素格式。样本数越大,抗锯齿效果就越好(也越慢)。您可以使用wglGetPixelFormatAttribfvglXGetConfig获取最大样本数。
创建具有多重采样帧缓冲区的成功后,您将像平常一样渲染,只有一个例外:在设置代码中调用glEnable(GL_MULTISAMPLE)。这将激活多重采样渲染。
这就是您需要的全部内容。
或者,如果您正在使用GL 3.x或可以访问ARB_framebuffer_object,则可以跳过上下文内容并创建多重采样帧缓冲区。您的深度缓冲区和颜色缓冲区(s)必须都具有相同数量的样本。我建议使用渲染缓冲区,因为您仍在使用固定功能(并且无法从多重采样纹理进行固定功能管道纹理)。您可以创建用于颜色和深度的多重采样渲染缓冲区(它们必须具有相同数量的样本),并在FBO中设置它们,然后进行渲染(当然要使用glEnable(GL_MULTISAMPLE))。完成后,您可以使用glBlitFramebuffer将多重采样帧缓冲区转移到后台缓冲区(后者不应该是多重采样的)。
“当然,问题是对于OpenGL初学者而言,GLSL 是一个相当高的门槛。”
谁这么说?从着色器学习没有任何问题。实际上,在我的经验中,这些初学者通常学得更好,因为他们更有效地理解了正在发生的详细情况。

3
你为什么要用这种方式进行抗锯齿呢?这是OpenGL红皮书版本1中的一种非常古老的技术。根据累积缓冲区的性能表现,我怀疑整个过程完全没有加速——即使在NVIDIA上也是如此。我认为红皮书还使用累积缓冲区实现了“景深”或类似效果... - SigTerm
或者,如果您正在使用GL 3.x或可以访问ARB_framebuffer_object,则可以跳过上下文内容并创建多重采样帧缓冲区。或者EXT_framebuffer_multisample。 - JWWalker
1
为什么...我不知道这是完成工作的可怕方式。可能我从一个罕见的角度来看待这个问题,但我怀疑我并不独特。在CL/CUDA出现之前,我对GL的东西并不特别感兴趣。通过共享GL/CL上下文,在数组上执行计算操作,然后将它们视为顶点缓冲对象或纹理,以便您可以实时地将高速计算的可视化呈现,简直令人惊叹。 - K. Brafford
1
当您使用GLUT进行上下文创建时,只需在调用glutInitDisplayMode时添加GLUT_MULTISAMPLE即可。 - Elmar Zander
如果使用SDL进行上下文创建,请在窗口创建之前使用SDL_GL_SetAttributeSDL_GL_MULTISAMPLEBUFFERS设置为1,将SDL_GL_MULTISAMPLESAMPLES设置为大于0的值。 - Cuadue
1
回复:“为什么你会这样做抗锯齿” - 因为一些显卡/驱动程序不支持多重采样 - 请参阅错误报告:https://github.com/opentoonz/opentoonz/issues/1166#issuecomment-303935018 - 尽管情况正在改善。 - ideasman42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接