我正在关注youtube上有关如何在Qt中使用OpenGL的教程。我有两节课:

glWidget->从QGLWidget继承;
GLWindow->继承自QMainWindow并具有一种形式。

在GLWindow的表单中,我放置一个Widget并将其提升为glWidget,以便glWidget上呈现的任何内容都可以通过GLWindow上的Widget显示。

我在glWidget中实现了以下继承的函数:

void glWidget::initializeGL()
{
    glClearColor(0.1, 0.1, 0.1, 1.0);
}

void glWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_TRIANGLES);
            glColor3f(0.2, 0.8, 0.1);
        glVertex3f(-0.5, -0.5, 0.0);
            glColor3f(0.8, 0.3, 0.9);
        glVertex3f(0.5, -0.5, 0.0);
            glColor3f(0.1, 0.1, 0.5);
        glVertex3f(0.0, 0.5, 0.0);
    glEnd();
}


我计划稍后使用着色器和缓冲区,但是对于为什么我的渲染图元看起来像这样感到困惑:



看来三角形已经在世界空间而不是局部空间中变换了。如果它在局部空间中,则三角形将出现在屏幕中心。我要参考的教程可以在这里找到:https://www.youtube.com/watch?v=1nzHSkY4K18

我不知道我在做什么错。起初我以为它与我的顶点有关,我知道这是即时模式,应该尝试使用缓冲区/着色器;但我仍想了解我在这里做错了什么。为什么不按照教程中的显示方式渲染三角形?我应该在glWidget的构造函数中传递某些内容吗?

最佳答案

当扩展QGLWidget时,请记住resizeGL()将被自动调用:


  resizeGL()-设置OpenGL视口,投影等。每当调整了窗口小部件的大小时(以及由于所有新创建的窗口小部件都会自动获得resize事件而第一次显示时),都会调用此方法。


看来,在您的情况下,小部件会自动调整大小,因此一种解决方案是将其覆盖并使其为空。

扩展QGLWidget时通常是一个很好的做法,也要覆盖resizeGL函数。

10-06 01:52