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 兼容性配置文件上下文

4

3 回答 3

0

您的代码在我的计算机(运行 Windows)上运行正常。只要确保您使用的是 freeglut 而不仅仅是普通的 GLUT。因此,您应该链接到正确的库文件(如 windows 上的 freeglut.lib/freeglut.dll)。此外,包含 freeglut.h 而不是 glut.h 以确保您实际上包含了您想要的头文件,这不是一个坏主意。

此外,无需调用glClearColor每一帧。只有当你想改变清晰的颜色时才需要调用它。请记住,likeglColorglClearColor适用于在它之后发生的函数调用。

于 2012-06-05T19:47:12.360 回答
0

我的 Windows 7 NVIDIA 上的 GLUT 不知何故也无法正常工作。SamplebuffersSamples.

但是,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");
    }   
}
于 2015-03-02T23:58:52.113 回答
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);
于 2012-06-02T20:03:04.153 回答