GLUT + OpenGL多重采样抗锯齿(MSAA)

时间:2015-01-08 15:11:54

标签: c++ opengl glut antialiasing

我制作绘制立方体的OpenGL应用程序。 我想添加抗锯齿但没有成功。 也许有人可以提供帮助(用户Xcode 6.1.1,GLUT,OpenGL)?

我需要在没有外部库的情况下创建抗锯齿。

以下代码的结果。 enter image description here

GLfloat xRotated, yRotated, zRotated; void init(void){
glClearColor(0,0,0,0);

glEnable (GL_DEPTH_TEST);

// Turn on antialiasing, and give hint to do the best
// job possible.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_LINEAR);

glEnable(GL_MULTISAMPLE); } void DrawCube(void) {
glMatrixMode(GL_MODELVIEW);
// clear the drawing buffer.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0,0.0,-10.5);
glRotatef(xRotated,1.0,0.0,0.0);
// rotation about Y axis
glRotatef(yRotated,0.0,1.0,0.0);
// rotation about Z axis
glRotatef(zRotated,0.0,0.0,1.0);

glBegin(GL_QUADS);        // Draw The Cube Using quads
glColor3f(0.0f,1.0f,0.0f);    // Color Blue
glVertex3f( 1.0f, 1.0f,-1.0f);    // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f);    // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, 1.0f);    // Bottom Right Of The Quad (Top)
glColor3f(1.0f,0.5f,0.0f);    // Color Orange
glVertex3f( 1.0f,-1.0f, 1.0f);    // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f,-1.0f,-1.0f);    // Bottom Right Of The Quad (Bottom)
glColor3f(1.0f,0.0f,0.0f);    // Color Red
glVertex3f( 1.0f, 1.0f, 1.0f);    // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, 1.0f);    // Top Left Of The Quad (Front)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f,-1.0f, 1.0f);    // Bottom Right Of The Quad (Front)
glColor3f(1.0f,1.0f,0.0f);    // Color Yellow
glVertex3f( 1.0f,-1.0f,-1.0f);    // Top Right Of The Quad (Back)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Top Left Of The Quad (Back)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Bottom Left Of The Quad (Back)
glVertex3f( 1.0f, 1.0f,-1.0f);    // Bottom Right Of The Quad (Back)
glColor3f(0.0f,0.0f,1.0f);    // Color Blue
glVertex3f(-1.0f, 1.0f, 1.0f);    // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f,-1.0f);    // Top Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f,-1.0f);    // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f, 1.0f);    // Bottom Right Of The Quad (Left)
glColor3f(1.0f,0.0f,1.0f);    // Color Violet
glVertex3f( 1.0f, 1.0f,-1.0f);    // Top Right Of The Quad (Right)
glVertex3f( 1.0f, 1.0f, 1.0f);    // Top Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f, 1.0f);    // Bottom Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f,-1.0f);    // Bottom Right Of The Quad (Right)
glEnd();            // End Drawing The Cube

glFlush(); } void animation(void) {
yRotated += 0.1;
xRotated += 0.2;
DrawCube(); } void reshape(int x, int y) {
if (y == 0 || x == 0) return;  //Nothing is visible then, so return
//Set a new projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y);  //Use the whole window for rendering } int main(int argc, char** argv){
glutInit(&argc, argv);
//we initizlilze the glut. functions
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(DrawCube);
glutReshapeFunc(reshape);
//Set the function for the animation.
glutIdleFunc(animation);
glutMainLoop();
return 0; }

1 个答案:

答案 0 :(得分:4)

GLUT缺少样本数量的设置。 Freeglut确实如此。要启用它,请使用

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

请记住glEnable

void enableMultisample(int msaa)
{
    if (msaa)
    {
        glEnable(GL_MULTISAMPLE);
        glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST);

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