行得到复制而不是移动
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)
。
我正在使用继承 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)
。