如何进行GL_LINE_LOOP抗锯齿?

问题描述 投票:1回答:3

这是我创建的一些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-es glut pyopengl
3个回答
0
投票

基本上,可能不受支持。可悲的是,glHint只是一个提示(没有人需要实际实现它)。

如果要平滑线条,最好的选择是使用多采样帧缓冲区。如果愿意,可以将其作为屏幕外的帧缓冲区来完成,尽管如果使用的是freeglut,则可以初始化窗口以启用多重采样。例如

int main(int argc,
    char** argv)
{
   glutInit(&argc, argv);
   glutSetOption(GLUT_MULTISAMPLE, 8);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_MULTISAMPLE);
   glutCreateWindow("basic template 1");
   glutDisplayFunc(myDisplay);
   glEnable(GL_MULTISAMPLE);
   glutMainLoop();
}

还要确保在显示函数中删除对'glutInitDisplayMode'的调用(在创建窗口之前,您只应调用一次)。


0
投票

[在OpenGL中有多种方法进行抗锯齿。一些描述here

例如,我建议将all初始化函数移至主要函数。在您的原始示例中,缺少glClear(),并设置了[[before透明色功能。这会使屏幕变黑。

要以所需的方式进行锯齿,对一所房子使用抗锯齿功能,对另一所房子使用抗锯齿功能,则必须专门启用或禁用所需元素的平滑处理。

我还建议将它们放在一起,并

之前

实际的绘图功能。您也不应在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()功能仅在使用#include "GL/freeglut.h"而不在原始glut.h中使用时才在“ freeglut”中可用。但是我在Windows上的观察是,指定是否进行多重采样没有区别。因此,我假设它是“ default-ON”。

0
投票
除设置顶点属性和指定顶点的操作(glBegin/glEndglBeginglEndglVertex,...)之外,不允许在glVertex之间调用任何东西。
© www.soinside.com 2019 - 2024. All rights reserved.