0

我在绘制 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 不再起作用。意味着我看到了我曾经画过的一切。顺便提一下。我使用相同的初始化对 GLUT 进行了同样的尝试,并且它工作了,但是由于我已经切换到 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

4 回答 4

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()吸气剂)的头部。你所拥有的也initializeGL属于paintGL.

的正确用途initializeGL是进行一次性初始化,例如加载纹理和着色器,准备 FBO 等。

resizeGL旨在重新/初始化取决于窗口大小并且更改非常耗时的内容,例如渲染缓冲区和/或用作用于窗口大小后处理或类似的FBO中的附件的纹理。设置投影矩阵不属于那里,视口也不属于那里。那些进入paintGL.

glDepthFunc、glClearColor 和 glClearDepth 直接影响绘图过程,因此属于绘图代码。

此外,您根本不应该使用立即模式(glBegin ... glEnd)。自从 15 年前发布 OpenGL-1.1 以来,它就已经过时了。使用顶点数组,并可能添加缓冲区对象。

于 2013-01-28T18:03:51.233 回答
1

glEnd;应该是glEnd();。这实际上可以解决您的问题。

于 2013-01-28T17:39:51.907 回答
1

它必须GL_LINES代替GL_LINE. 接受的符号glBegin是复数(即GL_QUADS、GL_LINE_STRIPS...)。

于 2013-01-28T17:42:42.140 回答
1

GL_LINE不是 的有效令牌glBegin。要画线,你需要GL_LINES(这很微妙,而且你的公司很好——这是一个常见的错误)。

GL_LINE用于控制如何渲染多边形,由glPolygonMode函数控制。

于 2013-01-28T17:44:56.897 回答