C++ OpenGL Glut如何同时显示两个图形而非仅一个
问题原因
- 重复清空颜色缓冲区:
withAntiAliasing和withoutAntiAliasing两个函数的开头都调用了glClear(GL_COLOR_BUFFER_BIT),每次调用都会擦除当前窗口里已有的所有绘制内容,所以你先调用无抗锯齿绘制再调用抗锯齿绘制时,抗锯齿函数的清空操作会直接把前面无抗锯齿画的内容全部清掉,最终只能看到最后一个函数的绘制结果。 - 无抗锯齿绘制逻辑错误:你当前的
withoutAntiAliasing函数里只写了绘制两个点的代码,根本没有实现房屋造型的绘制逻辑,所以就算不清空也只能显示两个点。 - 绘制坐标重叠:两个房屋如果使用完全相同的坐标绘制,会完全重叠在一起,无法同时观察到抗锯齿和无抗锯齿的对比效果。
- 冗余的刷新操作:单缓冲模式下只需要在所有绘制逻辑执行完成后调用一次
glFlush即可,不需要每个绘制函数单独调用。
修正方案
- 将
glClear(GL_COLOR_BUFFER_BIT)移动到render函数的最开头,全局只执行一次清空操作。 - 补全
withoutAntiAliasing里的房屋绘制逻辑,同时将所有顶点的X坐标整体偏移(比如+80),让两个房屋左右分开显示。 - 移除两个绘制函数里的
glClear和冗余的glFlush调用,统一在render末尾执行glFlush。
修正后完整代码
#include <GL/glut.h> void init() { glClearColor(1.0, 1.0, 1.0, 0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 250.0, 0.0, 250.0); } void withAntiAliasing() { glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // 左侧抗锯齿房屋 glBegin(GL_LINE_LOOP); glVertex2i(155, 150); glVertex2i(125, 125); glVertex2f(108.5, 162); glVertex2f(136, 185); glEnd(); glBegin(GL_LINE_LOOP); glVertex2i(100, 155.9); glVertex2f(145, 192.5); glVertex2i(115, 185); glEnd(); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); } void withoutAntiAliasing() { glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); // 右侧无抗锯齿房屋,X坐标整体+80偏移 glBegin(GL_LINE_LOOP); glVertex2i(155+80, 150); glVertex2i(125+80, 125); glVertex2f(108.5+80, 162); glVertex2f(136+80, 185); glEnd(); glBegin(GL_LINE_LOOP); glVertex2i(100+80, 155.9); glVertex2f(145+80, 192.5); glVertex2i(115+80, 185); glEnd(); } void render() { // 全局只清空一次缓冲区 glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 0.0); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); withoutAntiAliasing(); withAntiAliasing(); // 所有绘制完成后统一刷新 glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100, 100); glutInitWindowSize(640, 480); glutCreateWindow("Hey"); init(); glutDisplayFunc(render); glutMainLoop(); }
运行修正后的代码即可看到左侧是抗锯齿效果的房屋,右侧是无抗锯齿效果的房屋,两个图形同时正常显示。
内容的提问来源于stack exchange,提问作者variancegears
相关产品推荐
相关产品推荐

