【问题标题】:OpenGL antialiasing without the accumulation buffer没有累积缓冲区的 OpenGL 抗锯齿
【发布时间】:2012-05-09 01:50:58
【问题描述】:

在 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 卡可以做到并且新手可以理解的方式进行全场景抗锯齿?

【问题讨论】:

    标签: opengl antialiasing


    【解决方案1】:

    无论您是否有累积缓冲区,为什么您会以这种方式进行抗锯齿处理?只需使用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 从多重采样帧缓冲区 blit 到后缓冲区(不应多重采样)。

    当然,问题在于 GLSL 对于 OpenGL 初学者来说是一个相当高的入门门槛。

    说谁?初学者从着色器中学习并没有错。事实上,根据我的经验,这类初学者通常会学得更好,因为他们更有效地了解正在发生的事情的细节。

    【讨论】:

    • “你为什么要这样做抗锯齿”这是 OpenGL 红皮书版本 1 中的一项非常古老的技术。从累积缓冲区的性能来看,我怀疑整个事情完全没有加速 - 即使在 nvidia 上也是如此。我认为红皮书也有“景深”或使用累积缓冲区实现的一些类似效果......
    • “或者,如果您使用的是 GL 3.x 或有权访问 ARB_framebuffer_object,您可以跳过上下文内容并创建一个多重采样帧缓冲区。”或 EXT_framebuffer_multisample。
    • “为什么...”我不知道这是完成工作的糟糕方式。我可能是从一个罕见的角度来看待这个问题的,但我怀疑我是独一无二的。在 CL/CUDA 出现之前,我对 GL 的东西并不特别感兴趣。使用共享的 GL/CL 上下文,对数组进行计算操作,然后将它们视为顶点缓冲区对象或纹理,这样您就可以实时获得高速计算的可视化表示,这简直是惊人的。
    • 当您使用 GLUT 创建上下文时,您只需将 GLUT_MULTISAMPLE 添加到您对 glutInitDisplayMode 的调用中。
    • 如果使用 SDL 创建上下文,请在创建窗口之前使用 SDL_GL_SetAttributeSDL_GL_MULTISAMPLEBUFFERS 设置为 1 并将 SDL_GL_MULTISAMPLESAMPLES 设置为大于 0 的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2011-02-14
    相关资源
    最近更新 更多