OpenGL抗锯齿技术在freeglut中的应用

6

我正在使用freeglut。我尝试使FSAA工作,但似乎一切都不起作用。样本缓冲区是1,样本数是4。但我没有看到任何抗锯齿效果。是否有遗漏的步骤?目前,我正在运行Ubuntu 12.04;不确定是否会有所改变。

#include <GL/glut.h>
#include <GL/glext.h>
#include <stdio.h>


void render(void);

int main(int argc, char **argv){    
    glutInit(&argc,argv);

    //Initialize the window
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_MULTISAMPLE);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(200,200);
    glutCreateWindow("Testing");
    glutDisplayFunc(render);

    //Enable FSAA       
    glEnable(GL_MULTISAMPLE);

    //2D graphics
    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT), 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);


    GLint buf, sbuf;
    glGetIntegerv(GL_SAMPLE_BUFFERS, &buf);
    printf("number of sample buffers is %d\n", buf);
    glGetIntegerv(GL_SAMPLES, &sbuf);
    printf("number of samples is %d\n", sbuf);

    glutMainLoop();
    return 0;
}

//Draw some stuff
void render(void){  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glColor3f(0.0f,1.0f,0.0f);
    glBegin(GL_LINE_LOOP);
        glVertex2f(10.0,10.0);
        glVertex2f(170.0,60.0);
        glVertex2f(50.0,130.0);
        glVertex2f(50.0,60.0);
    glEnd();    

    glutSwapBuffers();
}

我很了解SDL和GLFW,但我想在freeglut上使其工作。

更多信息:
显卡:ATI Radeon HD 4250
OpenGL版本:3.3.11627 兼容性配置文件上下文

3个回答

0

你的代码在我的电脑上(运行 Windows)正常工作。只要确保你使用的是 freeglut 而不是普通的 GLUT。因此,你应该链接到正确的库文件(例如在 Windows 上的 freeglut.lib/freeglut.dll)。另外,最好包含 freeglut.h 而不是 glut.h,以确保你实际上包含了你想要的头文件。

而且,没有必要在每一帧中调用 glClearColor。只有在想要更改清除颜色时才需要调用它。只是请记住,就像 glColor 一样,glClearColor 只适用于它之后发生的函数调用。


嗯,我需要设置一个不同于“-lglut”的构建选项吗? - Azmisov
@fintelia:实际上,每帧调用glClearColor是很好的风格。最终,人们想要实现更高级的渲染技术,这些技术涉及多个传递或FBO,一旦你这样做了,你必须确保在渲染帧的开始时一切都设置正确。 - datenwolf

0

如果您想在2D中使您的点和线抗锯齿,可以尝试以下方法:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH, GL_NICEST);

glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH, GL_NICEST);

这似乎对于GL_TRIANGLE_FANGL_QUAD_STRIP不起作用。多重采样难道不应该抗锯齿它们吗? - Azmisov
在你的代码中,你只是画了一个线圈,应该使用我的代码进行抗锯齿处理。 - Stefan Fandler
好的,那只是一个例子。我打算做比画线更高级的图形。我真的只想让FSAA工作。 - Azmisov
1
哦,抱歉。你没有提到那个 :) - Stefan Fandler

0

我的Windows 7 NVIDIA上的GLUT也不知道为什么不起作用。我在buffersSamples中都得到了0。

然而,freeglut解决了这个问题,并提供了设置Samples的选项。

glutSetOption(GLUT_MULTISAMPLE, 4);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);

打开它

void glexMultisample(int msaa)
{
    if (msaa)
    {
        glEnable(GL_MULTISAMPLE);

        // detect current settings
        GLint iMultiSample = 0;
        GLint iNumSamples = 0;
        glGetIntegerv(GL_SAMPLE_BUFFERS, &iMultiSample);
        glGetIntegerv(GL_SAMPLES, &iNumSamples);
        printf("MSAA on, GL_SAMPLE_BUFFERS = %d, GL_SAMPLES = %d\n", iMultiSample, iNumSamples);
    }
    else
    {
        glDisable(GL_MULTISAMPLE);
        printf("MSAA off\n");
    }   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接