QGLWidget中的gl_lines和gl_clear

时间:2013-01-28 17:36:53

标签: opengl qglwidget

我在绘制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);

}

任何想法?

4 个答案:

答案 0 :(得分:3)

glBegin接受的令牌是

  • GL_POINTS
  • GL_LINES
  • GL_TRIANGLES
  • GL_TRIANGLE_FAN
  • GL_TRIANGLE_STRIP
  • GL_QUADS
  • GL_QUAD_STRIP

  • GL_POLYGON

您使用的令牌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_LINEglBegin接受的符号为复数(即GL_QUADS,GL_LINE_STRIPS ...)。

答案 3 :(得分:1)

GL_LINE不是glBegin的有效令牌。要绘制线条,你需要GL_LINES(这是微妙的,你是一个很好的公司 - 这是一个常见的错误)。

GL_LINE用于控制多边形的渲染方式,由glPolygonMode函数控制。