You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ OpenGL Glut如何同时显示两个图形而非仅一个

问题原因
  • 重复清空颜色缓冲区:withAntiAliasing和withoutAntiAliasing两个函数的开头都调用了glClear(GL_COLOR_BUFFER_BIT),每次调用都会擦除当前窗口里已有的所有绘制内容,所以你先调用无抗锯齿绘制再调用抗锯齿绘制时,抗锯齿函数的清空操作会直接把前面无抗锯齿画的内容全部清掉,最终只能看到最后一个函数的绘制结果。
  • 无抗锯齿绘制逻辑错误:你当前的withoutAntiAliasing函数里只写了绘制两个点的代码,根本没有实现房屋造型的绘制逻辑,所以就算不清空也只能显示两个点。
  • 绘制坐标重叠:两个房屋如果使用完全相同的坐标绘制,会完全重叠在一起,无法同时观察到抗锯齿和无抗锯齿的对比效果。
  • 冗余的刷新操作:单缓冲模式下只需要在所有绘制逻辑执行完成后调用一次glFlush即可,不需要每个绘制函数单独调用。
修正方案
  1. 将glClear(GL_COLOR_BUFFER_BIT)移动到render函数的最开头,全局只执行一次清空操作。
  2. 补全withoutAntiAliasing里的房屋绘制逻辑,同时将所有顶点的X坐标整体偏移(比如+80),让两个房屋左右分开显示。
  3. 移除两个绘制函数里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:48:04