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 卡上,累积缓冲区没有实现,每个人都说你现在可以用着色器语言来实现。当然,问题在于 GLSL 对于 OpenGL 初学者来说是一个相当高的入门门槛。

谁能指出我如何以 ATI 卡可以做到并且新手可以理解的方式进行全场景抗锯齿的方法?

4

1 回答 1

14

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

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

一旦你成功地创建了一个带有多重采样帧缓冲区的上下文,你就可以正常渲染了,但有一个例外:调用glEnable(GL_MULTISAMPLE)你的设置代码。这将激活多重采样渲染。

这就是你所需要的。

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

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

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

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

于 2012-05-09T02:23:22.013 回答