行得到复制而不是移动

Line get duplicated instead of moved

我正在使用继承 QGLWidget 的 qWidget,在小部件下方我有 2 个按钮。 按钮 1:+ 按钮 2:-

这是我的代码:

void GLWidget::paintGL() {

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,_w,0,_h,-1,1);
    glViewport(_camera_pos_x,0,_w,_h);

    glBegin(GL_LINES);
        glVertex2i(50,50);
        glVertex2i(200,200);
    glEnd();

   update();
}

我希望每次按下 + 按钮时,屏幕都会向右移动 10 个像素,这意味着该行应该向左移动 10 个像素。

这是我按下按钮时的代码:

void right() {_camera_pos_x += 10;}

_camera_pos_X 只是一个初始化为 0 的成员 int。

当我按下按钮时,另一条线呈现在右侧 10 个像素处,我看到 2 条线

我的代码有什么问题?

顺便说一句,我想我使用的是 OpenGL 的旧代码,有没有更好的渲染线条的方法?

首先请注意,使用 glBegin/glEnd 序列的绘图已被弃用 10 多年了。 阅读 Fixed Function Pipeline and see Vertex Specification 了解最先进的渲染方式。


glViewport 指定从标准化设备坐标到 window 坐标的转换。如果你想改变线条的位置,那么你必须在不同的位置绘制线条,但这不会改变视口的大小。保持视口与 window:

一样大
glViewport(0, 0, _w, _h);

默认的帧缓冲区永远不会被清除,所以渲染总是绘制在前几帧的渲染上。因此,您可以 "see 2 lines"。使用 glClear 在渲染开始时清除帧缓冲区:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

更改模型视图矩阵以设置线的位置:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,_w,0,_h,-1,1);
glViewport(0, 0, _w, _h);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(_camera_pos_x, 0.0f, 0.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBegin(GL_LINES);
    glVertex2i(50,50);
    glVertex2i(200,200);
glEnd();

在绘制新图像之前,您必须清除帧缓冲区的旧内容。在paintGL()的开头放一个glClear(GL_COLOR_BUFFER_BIT)