行被复制而不是移动

Posted

技术标签:

【中文标题】行被复制而不是移动【英文标题】:Line get duplicated instead of moved 【发布时间】:2018-06-18 20:16:38 【问题描述】:

我正在使用继承 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 的旧代码,有没有更好的方法来渲染一条线?

【问题讨论】:

提供minimal reproducible example 请在下次提交您的问题之前花几分钟时间至少纠正最明显的拼写错误。 【参考方案1】:

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


glViewport 指定从标准化设备坐标到窗口坐标的转换。如果要更改线条的位置,则必须在不同的位置绘制线条,但这不会改变视口的大小。保持视口与窗口一样大:

glViewport(0, 0, _w, _h);

默认的帧缓冲区永远不会被清除,因此渲染总是在之前帧的渲染上绘制。因此,您可以“看到 2 行”。在渲染开始时使用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();

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于行被复制而不是移动的主要内容,如果未能解决你的问题,请参考以下文章

移动选定的构造函数而不是复制。 [参考标准]

程序使用复制构造函数而不是移动构造函数

如何使用 JCIFS 移动(而不是复制)文件?

c ++用移动而不是复制来累积

为啥在我的代码中调用复制构造函数而不是移动构造函数?

调用复制 ctor 而不是移动 ctor - 编译器可以发出警告吗?