【问题标题】:How do I render a triangle in QOpenGLWidget?如何在 QOpenGLWidget 中渲染三角形?
【发布时间】:2015-10-09 22:30:57
【问题描述】:

我正在尝试使用 QOpenGLWidget 在 Qt 中使用 OpenGL,但我很难找到任何相关示例。我是 OpenGL 的新手,所以我正在尝试学习如何使用它,但是我发现的教程似乎不适用于 QOpenGLWidget。现在,我要做的就是渲染一个三角形开始。

这是我目前所拥有的。

标题:

namespace Ui {
class Widget;
}

class Widget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void initializeGL();
    void resizeGL(int, int);
    void paintGL();

private:
    Ui::Widget *ui;
};

类:

Widget::Widget(QWidget *parent) :
    QOpenGLWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::initializeGL()
{
    // Set up the rendering context, load shaders and other resources, etc.:
    initializeOpenGLFunctions();
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
}

void Widget::resizeGL(int w, int h)
{
    // Update projection matrix and other size-related settings:
}

void Widget::paintGL()
{
    // Draw the scene:
    glClear(GL_COLOR_BUFFER_BIT);
}

Widget::~Widget()
{
    delete ui;
}

有什么例子可以用来渲染一个基本的三角形吗?我从这里尝试了一个:https://www.khronos.org/assets/uploads/books/openglr_es_20_programming_guide_sample.pdf,但它引发了很多我无法解决的错误。

我也不知道 OpenGL 上下文在 QOpenGLWidget 中是如何工作的。

*编辑:所以事实证明,这些示例是我的发行版(Arch Linux)上的一个单独的包。我能够安装它们,看起来还有很多可以开始的地方。

感谢您的帮助!

【问题讨论】:

  • 您是否尝试过研究 Qt 附带的 GL (ES) 示例? QOpenGLWidget 没有什么特别之处。
  • 在哪里可以找到这些示例?
  • 它们随 Qt 一起提供。 OpenGL 部分。 doc.qt.io/qt-5/examples-widgets-opengl.html

标签: c++ qt opengl opengl-es opengl-es-2.0


【解决方案1】:

如果你想使用QOpenGLWidget 而不是QGLWidget,那么这就是这样做的方法。

打开 Qt Creator 并选择 Qt Widgets Application。添加Widget和按钮如下

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

现在添加新类并将其命名为OGLWidget,它应该继承自QOpenGLWidget

oglwidget.h

#ifndef OGLWIDGET_H
#define OGLWIDGET_H

#include <QWidget>
#include <QOpenGLWidget>
#include <gl/GLU.h>
#include <gl/GL.h>

class OGLWidget : public QOpenGLWidget
{
public:
    OGLWidget(QWidget *parent = 0);
    ~OGLWidget();

protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
};

#endif // OGLWIDGET_H

oglwidget.cpp

#include "oglwidget.h"

OGLWidget::OGLWidget(QWidget *parent)
    : QOpenGLWidget(parent)
{

}

OGLWidget::~OGLWidget()
{

}

void OGLWidget::initializeGL()
{
    glClearColor(0,0,0,1);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    glEnable(GL_COLOR_MATERIAL);
}

void OGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_TRIANGLES);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0);
        glColor3f(0.0, 1.0, 0.0);
        glVertex3f( 0.5, -0.5, 0);
        glColor3f(0.0, 0.0, 1.0);
        glVertex3f( 0.0,  0.5, 0);
    glEnd();
}

void OGLWidget::resizeGL(int w, int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, (float)w/h, 0.01, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,5,0,0,0,0,1,0);
}

现在返回表单并右键单击小部件。选择promoted widgets 并输入提升的类名OGLWidget。点击添加按钮,然后推广。现在单击背景并转到其属性并将 windowModality 更改为 ApplicationModel。

这是你应该得到的结果

.pro 文件是

#-------------------------------------------------
#
# Project created by QtCreator 2015-07-20T15:15:29
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test2
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    oglwidget.cpp

HEADERS  += mainwindow.h \
    oglwidget.h

FORMS    += mainwindow.ui

【讨论】:

  • 感谢您非常详细的回复。但是,不是不推荐使用 glBegin 和 glEnd 吗?另外,是否需要 GLU?
  • 这里没有展示如何使用 QOpenGLWidget 中的功能。如果您选择像这样使用 OpenGL,那么我可以看到子类化 QOpenGLWidget 没有任何目的。
  • @DomiDiDongo QGLWidget 用于 QT 内的 Native OpenGL 实现;它需要在编译器中安装openGL;但是 QT 有自己的 openGL 函数实现,在这种情况下是在 QOpenGLWidget 中。我之前遇到过一个问题,在这个问题中解决了:stackoverflow.com/questions/33550442/…
  • 如果未找到#include ,请更改为#include 。 #include 相同。
  • 此方法已完全弃用,永远不应使用:glBegin() / glEnd() 是 OpenGL1.1 QGLWidget 在 Qt5 中已弃用,在 Qt5.6 中已删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 2017-02-04
相关资源
最近更新 更多