c++ - 如何制作 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();
}
解决方案
在 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 上的观察是,是否指定多重采样没有区别。所以我认为它是“默认开启”。
推荐阅读
- arrays - 反应数组未正确映射
- sql - 如何从表中获取前一个非 0 值?
- firebase - Flutter 如何将 Image 数据类型转换为 File 数据类型?
- terminal - 错误:运行终端时必须设置 CONDA_BUILD_SYSROOT 或 SDKROOT 以进行交叉编译
- javascript - 我将如何计算每个表格行中出现的唯一单词的频率并显示在同一行的选定单元格中计数?
- r - 如何编写 Bray-Curtis 函数?
- ruby-on-rails - 如何保存授权码和领域 ID 以获得访问和刷新令牌?
- javascript - HTML/JQuery:禁用跨度/按钮单击(将其变灰并禁用单击)
- javascript - Chart.js - 当光标移出主画布时禁用工具提示
- javascript - 如何从传单中的 api 生成标记?