在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卡可以做的方式进行全景抗锯齿,以及新手可以理解的东西吗?
答案 0 :(得分:14)
为什么你会用这种方式进行抗锯齿,无论你是否有累积缓冲区?只需使用multisampling;它不是免费的,但它比你正在做的便宜得多。
首先,您必须使用多重采样缓冲区创建上下文。这意味着您需要使用WGL/GLX_ARB_multisample,这意味着在Windows上,您需要two-stage context creation。您应该要求使用1 *_SAMPLE_BUFFERS_ARB
和一些*_SAMPLES_ARB
的像素格式。样本数越多,抗锯齿效果越好(也越慢)。您可以使用wglGetPixelFormatAttribfv
或glXGetConfig
获取最大数量的样本。
使用多重采样帧缓冲区成功创建上下文后,您可以正常渲染,但有一个例外:在设置代码中调用glEnable(GL_MULTISAMPLE)
。这将激活多重采样渲染。
这就是你所需要的。
或者,如果您使用的是GL 3.x或可以访问ARB_framebuffer_object,则可以跳过上下文内容并创建多重采样帧缓冲区。您的深度缓冲区和颜色缓冲区必须具有相同数量的样本。我建议使用using renderbuffers,因为你仍在使用固定功能(并且你不能在固定功能管道中使用多重采样纹理进行纹理化)。
您可以为颜色和深度创建多重采样渲染缓冲区(它们必须具有相同数量的样本)。您可以在FBO中进行设置,并将其渲染到它们中(当然,使用glEnable(GL_MULTISAMPLE)
)。完成后,然后使用glBlitFramebuffer
从多重采样帧缓冲区进入后缓冲区(不应进行多重采样)。
当然,问题在于GLSL是OpenGL初学者进入的一个很高的障碍。
说谁?初学者从着色器学习没有任何问题。事实上,根据我的经验,这些初学者经常学习更好,因为他们更了解有关事情的细节。