🙌

QTでOpenGL

に公開

ほぼ自分用メモ
OpenGLでモダンなUIを使いたいなーと思い試した.C++さえできれば取り掛かりやすい印象

基本的な考え方

QtはGUIでUIを設定したあと,UIに自作のクラスを適用させる形式を取る.
OpenGLでも同様の形になる.
「QOpenGLWidget」というクラスが用意されているので,これを継承したクラスでOpenGLを扱う.
mainwindow.uiを開いてQWidgetを配置
QWidgetを右クリックしてウィジェット昇格を選択し,作成したクラス名を書いて指定

コードとか

OpenGLのいくつかの機能はQOpenGLWidgetだけでなくQOpenGLExtraFunctionsがいる.
今回だと「glGenVertexArrays」を使うのにQOpenGLExtraFunctionsが必要になった
あとコンストラクタでinitializeOpenGLFunctions();をしないとExtraFunctionsが使えない.
モダンなOpenGL関数はプログラム実行時にグラフィックドライバから読み込む必要があり,これがその処理をしているっぽい.

#include <QtOpenGLWidgets/QtOpenGLWidgets>
#include <QOpenGLExtraFunctions>
#include <QVector>
class MyOpenGL : public QOpenGLWidget, protected QOpenGLExtraFunctions{
public:
    explicit MyOpenGL(QWidget *parent = nullptr);
    ~MyOpenGL();

protected:
    void initializeGL() override;
    void paintGL() override;

};

main.cppでバージョン指定する場合はQSurfaceFormatを使用

#include <QApplication>
#include <QSurfaceFormat> // このヘッダが必要
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QSurfaceFormat format;
    format.setVersion(3, 3); // OpenGL 3.3 をリクエスト
    format.setProfile(QSurfaceFormat::CoreProfile); // コアプロファイルを指定
    QSurfaceFormat::setDefaultFormat(format); // アプリ全体のデフォルトに設定

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

あとCmakeにモジュールのリンクをしておく必要あり

find_package(OpenGL REQUIRED)

target_link_libraries(YourProjectName PRIVATE
    Qt6::Widgets
    Qt6::OpenGLWidgets
)

他にも色々やり方があるらしい
最初からUI編集画面にQOpenGLWindowなるものがあったが,これは,UIに組み込むのではなく独立したトップレベルウィンドウとしてOpenGLを描画したい場合に使うらしい.ゲームとかの全画面アプリケーションだとこっちのほうがパフォーマンスがいい

Vulkan用のQVulkanWindowやQVulkanFunctionsもあった.まだ試していないが,いずれやってみたい

https://doc.qt.io/qt-6/qopenglfunctions.html

Discussion