这是我创建的一些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();
}
基本上,可能不受支持。可悲的是,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'的调用(在创建窗口之前,您只应调用一次)。
[在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”。