Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无累积缓冲区的OpenGL抗锯齿_Opengl_Antialiasing - Fatal编程技术网

无累积缓冲区的OpenGL抗锯齿

无累积缓冲区的OpenGL抗锯齿,opengl,antialiasing,Opengl,Antialiasing,在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,

在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);
}
if(m_反别名)
{
glClear(GLU累计缓冲位);
对于(int j=0;j<抗锯齿;j++)
{
accPerspective(m_camera.FieldOfView(),//垂直视野,以度为单位。
aspectratio,//纵横比。
20.,//近剪裁
1000.,
抖动[抗锯齿][j].X(),抖动[抗锯齿][j].Y(),
0.0, 0.0, 1.0);
m_camera.gluLookAt();
ActualDraw();
glAccum(GL_ACCUM,float(1.0/抗锯齿));
glDrawBuffer(GLU前);
glAccum(GL_返回,浮点(抗锯齿)/(j+1));
glDrawBuffer(GL_BACK);
}
glAccum(GL_回归,1.0);
}
在ATI卡上没有实现累积缓冲区,每个人都说现在可以用着色器语言来实现。当然,问题是GLSL对于OpenGL初学者来说是一个相当高的入门门槛


有谁能告诉我一些东西,告诉我如何以ATI卡可以做到的方式进行整个场景的抗锯齿处理,而且新手也能理解吗?

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

首先,必须使用多采样缓冲区创建上下文。这意味着你需要使用,这意味着在Windows上,你需要这样做。您应该请求具有1个
*\u SAMPLE\u BUFFERS\u ARB
和一些
*\u SAMPLES\u ARB
的像素格式。采样数越大,抗锯齿效果越好(也越慢)。您可以使用
wglGetPixelFormatAttribfv
glXGetConfig
获取最大样本数

成功创建具有多采样帧缓冲区的上下文后,可以正常渲染,但有一个例外:在设置代码中调用
glEnable(GL\u multisample)
。这将激活多采样渲染

这就是你所需要的


或者,如果您正在使用GL 3.x或有权访问,则可以跳过上下文内容并创建多采样帧缓冲区。深度缓冲区和颜色缓冲区的采样数必须相同。我建议您这样做,因为您仍然在使用固定函数(并且您不能在固定函数管道中使用多采样纹理)

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

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


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

“为什么要用这种方式进行抗锯齿”这是OpenGL红皮书第1版中非常古老的技术。从累积缓冲区的性能判断,我怀疑整个事情是完全不加速的——即使在nvidia上也是如此。我认为红皮书也有“景深”或类似的效果,使用累加缓冲区也可以实现……”或者,“如果你使用的是GL 3.x或访问ARB_framebuffer_对象,你可以跳过上下文内容,创建一个多采样帧缓冲区。”或者EXT_framebuffer_multisample.“为什么…”我不知道这是一个完成工作的糟糕方式。我可能是从一个罕见的角度来看待这个问题,但我怀疑我是否独一无二。直到CL/CUDA出现,我才对GL的东西特别感兴趣。通过共享GL/CL上下文,能够对阵列执行计算操作,然后将它们作为顶点缓冲区对象或纹理处理,这样您就可以实时直观地表示您的高速计算。当您使用GLUT创建上下文时,您只需将
GLUT\u MULTISAMPLE
添加到对
glutInitDisplayMode
的调用中。如果使用SDL对于上下文创建,在创建窗口之前,使用
SDL\u GL\u SetAttribute
SDL\u GL\u MULTISAMPLEBUFFERS
设置为1,并将
SDL\u GL\u MULTISAMPLESAMPLES
设置为大于0的值。