当前位置: 首页 > article >正文

OpenGL(2)基于Qt做OpenGL开发

文章目录

  • 一、基于Qt做OpenGL开发
    • 1、环境准备
    • 2、创建OpenGL窗口
    • 3、绘制基本图形

一、基于Qt做OpenGL开发

1、环境准备

确保你已经安装了 Qt 开发环境(包含 Qt Creator),并且支持 OpenGL 开发。在创建 Qt 项目时,选择 “Qt Widgets Application” 或 “Qt Quick Application”,根据项目需求进行选择。

2、创建OpenGL窗口

在 Qt 中,可以通过继承 QOpenGLWidgetQOpenGLFunctions_x_x_Core 类来创建一个 OpenGL 窗口。以下是一个简单的示例:

#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>

class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_4_5_Core {
public:
    OpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}

protected:
    // 初始化 OpenGL 上下文
    void initializeGL() override {
        initializeOpenGLFunctions();
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    }

    // 绘制 OpenGL 场景
    void paintGL() override {
        glClear(GL_COLOR_BUFFER_BIT);
    }

    // 处理窗口大小变化
    void resizeGL(int width, int height) override {
        glViewport(0, 0, width, height);
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    OpenGLWidget w;
    w.show();
    return a.exec();
}

代码解释

  • initializeGL 函数:在这个函数中,我们调用 initializeOpenGLFunctions() 来初始化 OpenGL 函数,然后使用 glClearColor 设置清屏颜色。
  • paintGL 函数:这是绘制 OpenGL 场景的主要函数,在这个函数中,我们使用 glClear 函数清除颜色缓冲区。
  • resizeGL 函数:当窗口大小发生变化时,这个函数会被调用,我们使用 glViewport 函数设置视口大小。

3、绘制基本图形

下面我们在 paintGL 函数中绘制一个简单的三角形:

#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>

class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_4_5_Core {
public:
    OpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}

protected:
    void initializeGL() override {
        initializeOpenGLFunctions();
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    }

    void paintGL() override {
        glClear(GL_COLOR_BUFFER_BIT);

        // 启用顶点属性
        glEnableClientState(GL_VERTEX_ARRAY);

        // 定义三角形的顶点坐标
        GLfloat vertices[] = {
            -0.5f, -0.5f, 0.0f,
             0.5f, -0.5f, 0.0f,
             0.0f,  0.5f, 0.0f
        };

        // 设置顶点指针
        glVertexPointer(3, GL_FLOAT, 0, vertices);

        // 绘制三角形
        glDrawArrays(GL_TRIANGLES, 0, 3);

        // 禁用顶点属性
        glDisableClientState(GL_VERTEX_ARRAY);
    }

    void resizeGL(int width, int height) override {
        glViewport(0, 0, width, height);
    }
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    OpenGLWidget w;
    w.show();
    return a.exec();
}

http://www.kler.cn/a/556185.html

相关文章:

  • 2024年数学SCI1区TOP:改进海洋捕食者算法MMPA用于UAV路径规划,深度解析+性能实测
  • Linux性能监控工具汇总
  • 怎麼防止爬蟲IP被網站封鎖?
  • Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用
  • 基于 C++ OpenCV 图像灰度化 DLL 在 C# WPF 中的拓展应用
  • Grok 使用指南
  • 清华大学:DeepSeek与AI幻觉(31页PDF)
  • 图数据库Neo4j面试内容整理-路径查询
  • Innovus中快速获取timing path逻辑深度的golden脚本
  • 基于springboot+vue的酒店管理系统的设计与实现
  • 遥感与GIS在滑坡、泥石流风险普查中的实践技术应用
  • Python logger模块
  • 美团一面:说说synchronized的实现原理?
  • 服务器释放screen资源(Detached状态并不会释放资源)
  • 华为动态路由-OSPF-完全末梢区域
  • synchronized锁字符串
  • 店铺矩阵崩塌前夜:跨境多账号运营的3个生死线
  • Prompt Engineering的重要性
  • 网络协议如何确保数据的安全传输
  • 达梦clob字段查询优化