【问题标题】:OpenGL antialiasing with freeglutOpenGL 抗锯齿与 freeglut
【发布时间】:2012-06-07 13:21:26
【问题描述】:

我正在使用 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 兼容性配置文件上下文

【问题讨论】:

    标签: c opengl freeglut


    【解决方案1】:

    要在 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。多重采样不应该对这些进行抗锯齿吗?
    • 在您的代码中,您只需画一个循环线,它应该与我的代码抗锯齿。
    • 嗯,这只是一个例子。我打算做更高级的图形而不仅仅是线条。我真的只想让 FSAA 工作。
    • 抱歉。你没有提到:)
    【解决方案2】:

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

    另外,不需要每帧都调用glClearColor。只有当你想改变清晰的颜色时,你才需要调用它。不过请记住,就像glColorglClearColor 仅适用于在它之后发生的函数调用。

    【讨论】:

    • 嗯。我是否需要设置与“-lglut”不同的构建选项?
    • @fintelia:实际上每帧调用 glClearColor 是很好的风格。最终,人们想要实现涉及多个通道或 FBO 的更高级的渲染技术,一旦你这样做了,你必须确保在渲染一帧的开始时,所有内容都已正确设置。
    【解决方案3】:

    我的 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");
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2020-12-12
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多