在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卡可以做到的方式做全场景抗锯齿,而且新手也能理解?
发布于 2012-05-09 10:23:22
为什么你要这样做抗锯齿,不管你有没有累积缓冲区?只要使用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将多采样帧缓冲区中的数据传输到后台缓冲区(不应进行多采样)。
的问题是,对于OpenGL初学者来说,GLSL是一个相当高的入门门槛。
谁说的?初学者从着色器中学习没有什么错。事实上,根据我的经验,这样的初学者通常学习得更好,因为他们更有效地了解正在发生的事情的细节。
https://stackoverflow.com/questions/10508872
复制相似问题