我在绘制QGLWidget时遇到了问题。我在小部件上有几个四边形,按下某些按键时我可以四处移动。只要我绘制四边形,一切正常,但现在我想使用以下方法添加一些行:
glBegin(GL_LINE);
glColor3f(c[0], c[1], c[2]);
glVertex3f(v1.x, v1.y, v1.z);
glVertex3f(v2.x, v2.y, v2.z);
glEnd;
绘图也可以正常工作,但glwidget的清除不再起作用。意味着我看到了我曾经画过的一切。提一下。 我使用相同的初始化尝试使用相同的初始化,但它工作,但因为我已切换到Qt它不再工作。 paintGL(),resizeGL()和initializeGL()在下面。
void GLWidget::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 0.0f, 0.0f, -10.0f, -20.0f, 0.0f, 20.0f, -10.0f);
glTranslatef(0.0f, -30.0f, -40.0f);
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
glRotatef(s_deg, 0.0f, 0.0f, 1.0f);
glRotatef(s_deg2, cos(DEGRAD(s_deg)), sin(DEGRAD(s_deg)), 0.0f);
float colors[8][3] = {
0.5, 0.0, 0.0,
0.0, 0.5, 0.0,
0.0, 0.0, 0.5,
1.0, 0.5, 0.5,
0.5, 1.0, 0.5,
0.5, 0.5, 1.0,
0.9, 0.9, 0.9,
0.1, 0.1, 0.1,
}; //red, green, blue, red shiny, green shiny, blue shine, light grey, dark grey
for(int i=0;i<glBoxes.size();i++) {
glBoxes.at(i).setColor(colors[i]);
glBoxes.at(i).drawCuboid();
glBoxes.at(i).drawCuboidGrid();
}
}
void GLWidget::initializeGL() {
glDepthFunc(GL_LESS);
glClearColor(0.2, 0.2, 0.2, 0.2);
glClearDepth(1.0);
}
void GLWidget::resizeGL(int width, int height) {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0.0f, 0.0f, (float)width, (float)height);
glLoadIdentity();
gluPerspective(45.0f, (float)width/(float)height, 0.5f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}
任何想法?
答案 0 :(得分:3)
glBegin接受的令牌是
和
您使用的令牌GL_LINE(不是缺失的尾随 S )对glBegin无效。
语句glEnd;
将评估函数glEnd的地址,并以静默方式丢弃结果。可能是,你有Pascal或Delphi背景吗?在C语言中,您必须添加一对匹配的括号以使其成为函数调用。使用一对空括号调用不带参数的函数。例如。在您的情况下glEnd();
。
与您的问题无关。 resizeGL
中的所有代码都应该转到paintGL
的头部(使用小部件的width()
和height()
个getter)。您initializeGL
所拥有的内容也属于paintGL
。
正确使用initializeGL
是进行一次性初始化,例如加载纹理和着色器,准备FBO等。
resizeGL
用于重新/初始化取决于窗口大小的内容,并且更改时非常耗时,例如渲染缓冲区和/或用作窗口大小后处理的FBO中的附件的纹理或类似。设置投影矩阵不属于那里,视口也不属于。那些进入paintGL
。
glDepthFunc,glClearColor和glClearDepth直接影响绘图过程,因此属于绘图代码。
你也不应该使用立即模式(glBegin ... glEnd)。自15年前OpenGL-1.1发布以来,它已经过时了。使用顶点数组,可能添加缓冲区对象。
答案 1 :(得分:1)
glEnd;
应为glEnd();
。这实际上可以解决您的问题。
答案 2 :(得分:1)
必须是GL_LINES
而不是GL_LINE
。 glBegin
接受的符号为复数(即GL_QUADS,GL_LINE_STRIPS ...)。
答案 3 :(得分:1)
GL_LINE
不是glBegin
的有效令牌。要绘制线条,你需要GL_LINES
(这是微妙的,你是一个很好的公司 - 这是一个常见的错误)。
GL_LINE
用于控制多边形的渲染方式,由glPolygonMode
函数控制。