行重复而不是移动

时间:2018-06-18 20:16:38

标签: c++ qt opengl qglwidget

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

这是我的代码:

void right() {_camera_pos_x += 10;}

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

按下按钮时这是代码:

_camera_pos_X

select regexp_replace (ADDRESS, '(^|\s)' || SUFFIX_LIST.ORIG_SUFFIX || '($|\s)', SUFFIX_LIST.CHANGED_SUFFIX) into ADDRESS from dual; 只是一个成员int,初始化为0。

当我按下按钮时,另一条线向右渲染10个像素,我看到2行

我的代码出了什么问题?

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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