OpenGL的学习之路

news/2024/7/7 15:58:29 标签: c++, OpenGL

Qt如何创建OpenGL的渲染窗口?

类比GLFW库,Qt提供了OpenGL的渲染窗口类QOpenGLWidget:

1、重写initializeGL()和resizeGL()函数来设置OpenGL状态并提供透视图转换。

2、重写paintGL()来绘制3D场景,只调用OpenGL函数。

3、还可以使用QPainter将2D图形绘制到QOpenGLWidget子类上。在paintGL()中,不是发出OpenGL命令,而是构建一个用于部件的QPainter对象(注意QPainter没调用OpenGL渲染)。

Qt如何实现OpenGL函数绑定?

类比GLAD库,Qt不直接调用OpenGL函数,而是通过QOpenGLFunctions这一实例来进行函数调用,这种调用方法主要有以下两种:

1、直接从OpenGLContext::functions()中获取

 QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
 f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

2、继承QOpenGLFunctions

 class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
 {
     ...
     void initializeGL() override
     {
         initializeOpenGLFunctions();
         glClearColor(...);
         ...
     }
     ...
 };

示例代码:

1、创建MyOpenGLWidget.h

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
 
#include <QtOpenGLWidgets/QtOpenGLWidgets>
 
 
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    MyOpenGLWidget();
protected:
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;
};
 
#endif // MYOPENGLWIDGET_H

2、创建MyOpenGLWidget.cpp

#include "myopenglwidget.h"
 
MyOpenGLWidget::MyOpenGLWidget() {
    //设置上下文属性
    QSurfaceFormat format;
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    format.setVersion(3, 3); //OpenGL 版本号3.3
    format.setProfile(QSurfaceFormat::CoreProfile);// 核心模式
    this->setFormat(format);
}
 
void MyOpenGLWidget::initializeGL(){
    //绑定OpenGL函数指针?类似GLAD库的作用?
    initializeOpenGLFunctions();
}
 
void MyOpenGLWidget::paintGL(){
    //由于继承了QOpenGLFunctions,可以直接使用OpenGL中的函数
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
}
 
void MyOpenGLWidget::resizeGL(int w, int h){
 
}

3、调用MyOpenGLWidget类

#include "mainwindow.h"
 
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    _myOpenGLWidget = new MyOpenGLWidget;
    this->setCentralWidget(_myOpenGLWidget);
    //设置窗口大小
    this->setGeometry(0,0,800,600);
}
 
MainWindow::~MainWindow() {
    if(_myOpenGLWidget)delete _myOpenGLWidget;
}


http://www.niftyadmin.cn/n/5536991.html

相关文章

分页联合查询实现方法(Java)

controller层 GetMapping("/page")Operation(summary "获得标注属性管理分页")public CommonResult<PageResult<MarkerPropertyViewVO>> getMarkerPropertyPage(Valid MarkerPropertyPageReqVO pageVO) {PageResult<MarkerPropertyDO> …

AIGC文生图lora微调训练案例;SD-Train界面训练stable Diffusion lora模型

lora仓库&#xff08;1000多个lora微调模型分享&#xff09;&#xff1a; https://lorastudio.co/models 1、命令代码方式&#xff1a;文生图lora微调训练案例 主要用huggingface相关包&#xff1a;peft、accelerate、diffusers 参考&#xff1a; https://huggingface.co/blo…

眼动追踪技术 | 眼动的分类和模型

摘要 灵长类动物用于调整中央凹位置的正常眼动&#xff0c;几乎都可以归结为五种基本类型的组合&#xff1a;扫视、平稳追踪、聚散、前庭眼震和生理性眼震(与注视相关的微小运动)。聚散运动用于将双眼聚焦于远处的目标(深度知觉)。其他运动(如适应和聚焦)指的是眼动的非位置变…

手写Spring-MVC之前后置处理器与异常处理、数据库框架

Day48 手写Spring-MVC之前后置处理器与异常处理 前后置处理器 概念&#xff1a;从服务器获取的JSON数据可能是加密后的&#xff0c;因此服务端获取的时候需要进行解密&#xff08;前置处理器&#xff09;。 而从服务器传出的JSON数据可能需要加密&#xff0c;因此需要在处理返…

IDEA 开发工具

IDEA 开发工具 IDEA软件激活新建项目新建project 运行调试 IDEA软件激活 访问激活码网进入带*的域名下载并解压左上角的zip包先执行sh uninstall.sh&#xff0c;再执行sh install.sh在带*的网页中复制并使用激活码code 新建项目 新建project file》New〉Project》New Proje…

第二节-K8s词汇表

关键字词汇表 https://kubernetes.io/zh-cn/docs/reference/glossary/?fundamentaltrue API Group (API 组)Kubernetes API 中的一组相关路径。 API 服务器亦称作:kube-apiserver API 服务器是 Kubernetes 控制平面的组件&#xff0c; 该组件负责公开了 Kubernetes API&…

[C++初阶]vector的初步理解

一、标准库中的vector类 1.vector的介绍 1. vector是表示可变大小数组的序列容器 &#xff0c; 和数组一样&#xff0c;vector可采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大…

超融合服务器挂载硬盘--linux系统

项目中需要增加服务器的硬盘容量&#xff0c;通过超融合挂载了硬盘后&#xff0c;还需要添加到指定的路径下&#xff0c;这里记录一下操作步骤。 一&#xff1a;通过管理界面挂载硬盘 这一步都是界面操作&#xff0c;登录超融合控制云台后&#xff0c;找到对应的服务器&#…