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