首页 > 解决方案 > 如何制作 GL_LINE_LOOP 抗锯齿?

问题描述

这是我创建的一些 openGL 代码。常规是两个侧身的房子。我正在尝试只制作其中一个看起来不错且没有像素显示的房子。我想使用抗锯齿,但我不知道为什么它不起作用..有什么帮助吗?

void myDisplay()
{
    //glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glColor3f(0.0, 0.0, 0.0);
    glBegin(GL_LINE_LOOP);
    glVertex3f(0, 0, 0); // XYZ middle, top
    glVertex3f(-0.05, -.15, 0); // XYZ left, bottom
    glVertex3f(.15, .05, 0); // XYZ right, bottom
    glEnd();
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glBegin(GL_LINE_LOOP);
    glVertex3f(0, -.1, 0); // XYZ left, top
    glVertex3f(.1, 0, 0); // XYZ right, top
    glVertex3f(0.2, -.1, 0); // XYZ right, bottom
    glVertex3f(0.1, -.2, 0); // XYZ left, bottom
    glEnd();
    glEnable(GL_BLEND);
    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_POLYGON_SMOOTH);

    glEnable(GL_POINT_SMOOTH);
    glBegin(GL_LINE_LOOP);
    glVertex3f(-.2, 0.1, 0); // XYZ left, top
    glVertex3f(-.1, .2, 0); // XYZ right, top
    glVertex3f(0, .1, 0); // XYZ right, bottom
    glVertex3f(-.1, 0, 0); // XYZ left, bottom
    glEnd();
    glBegin(GL_LINE_LOOP);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_ALWAYS, 0);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_POLYGON_SMOOTH);
    glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE);
    glEnable(GL_BLEND);
    glVertex3f(-.2, .2, 0); // XYZ middle, top
    glVertex3f(-.25, .05, 0); // XYZ left, bottom
    glVertex3f(-.05, 0.25, 0); // XYZ right, bottom
    glEnd();
    glFlush();
}

int main(int argc,
    char** argv)
{
    glutInit(&argc, argv);
    glutCreateWindow( "basic template 1" );
    glutDisplayFunc( myDisplay );
    glutMainLoop();
}

标签: c++opengl-esglut

解决方案


在 OpenGL 中进行抗锯齿有多种方法。这里描述了一些

对于您的示例,我建议将所有init 函数移至 main 函数。在您的原始示例中,在 clear-color 功能之前glClear()缺少并设置。这会使屏幕变黑。

要按照您想要的方式进行混叠,将一个房屋的抗锯齿“打开”而另一个房屋“关闭”,您必须专门为您需要的元素启用或禁用平滑。

我还建议将它们放在一起并实际绘图功能之前。您也不应该在glBegin/glEnd块之间放置启用/禁用功能。这也有助于代码的清晰度。

我改变了一个房子的颜色,所以你看到黑色的房子没有抗锯齿,但蓝色的房子有。

void myDisplay()
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 0.0);

    glDisable(GL_BLEND);
    glDisable(GL_POINT_SMOOTH);
    glDisable(GL_LINE_SMOOTH);
    glDisable(GL_POLYGON_SMOOTH);

    glColor3f(0, 0, 0);
    glBegin(GL_LINE_LOOP);
    glVertex3f(0, 0, 0); // XYZ middle, top
    glVertex3f(-0.05, -.15, 0); // XYZ left, bottom
    glVertex3f(.15, .05, 0); // XYZ right, bottom
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(0, -.1, 0); // XYZ left, top
    glVertex3f(.1, 0, 0); // XYZ right, top
    glVertex3f(0.2, -.1, 0); // XYZ right, bottom
    glVertex3f(0.1, -.2, 0); // XYZ left, bottom
    glEnd();

    glColor3f(0, 0, 1);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

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

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

    glBegin(GL_LINE_LOOP);
    glVertex3f(-.2, 0.1, 0); // XYZ left, top
    glVertex3f(-.1, .2, 0); // XYZ right, top
    glVertex3f(0, .1, 0); // XYZ right, bottom
    glVertex3f(-.1, 0, 0); // XYZ left, bottom
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(-.2, .2, 0); // XYZ middle, top
    glVertex3f(-.25, .05, 0); // XYZ left, bottom
    glVertex3f(-.05, 0.25, 0); // XYZ right, bottom
    glEnd();

    glFlush();
}




int main(int argc,     char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("basic template 1");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
}
更新:

其他答案是“技术上正确的”,但我提出了一些警告和观察:

  • glEnable(GL_MULTISAMPLING)在较新的 OpenGL 标准中不再支持(它曾经高达 1.3 IIRC)。是否还可以使用取决于你的实际实现。
  • glutSetOption()功能仅在“freeglut”中可用,#include "GL/freeglut.h"而不是在 original 中使用glut.h。但我在 Windows 上的观察是,是否指定多重采样没有区别。所以我认为它是“默认开启”。

推荐阅读