Qt/OpenGL - 渲染图元失真

Qt/OpenGL - rendered primitives are distorted

我正在关注 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();
}

我计划稍后使用着色器和缓冲区,但我很困惑为什么我的渲染图元会这样显示:

看来三角形已在世界 space 中进行了变换,而不是在本地 space 中进行了变换。如果它在本地 space 中,那么三角形将出现在屏幕的中央。我所指的教程可以在这里找到:https://www.youtube.com/watch?v=1nzHSkY4K18

我不知道我做错了什么。起初我认为它与我的顶点有关,我知道这是即时模式,应该尝试使用 buffers/shaders 代替;但我仍然想了解我在这里做错了什么。为什么没有按照教程中显示的那样渲染三角形?我应该在 glWidget 的构造函数中传递一些东西吗?

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

resizeGL() - Sets up the OpenGL viewport, projection, etc. Gets called whenever the widget has been resized (and also when it is shown for the first time because all newly created widgets get a resize event automatically).

在您的情况下,Widget 似乎会自动调整大小,因此解决方案是覆盖它并将其清空。

扩展 QGLWidget 通常是一个很好的做法,同时重写 resizeGL 函数。