初识openGL

一、一些基本概念

1、图形渲染与图形引擎
图形渲染是计算机图形学中的一个核心过程,它指的是将三维模型或场景转换为二维图像,以便在显示设备上呈现给用户。这个过程涉及多个步骤,包括模型加载、光照计算、纹理映射、阴影生成、透视投影等,最终生成用户可以看到的图像。图形渲染在游戏开发、电影制作、动画制作、建筑设计等领域都有广泛应用。
图形引擎是一个综合的软件系统,它提供了创建、管理和渲染图形所需的一系列工具和技术。图形引擎通常包括渲染器、物理引擎、动画系统、用户界面等多个组成部分,能够处理复杂的图形渲染任务,如光照、阴影、反射、折射等,并支持高效的场景管理和交互功能。Unity、Unreal Engine等都是广泛使用的图形引擎。

2、openGL与openCV
openGL是一个跨平台、跨语言的API,用于渲染2D/3D图像,应用于游戏开发、VR虚拟现实、AR增强现实、电影制作、工业设计等领域。openGL提供了丰富的图形渲染功能和高效的硬件加速能力,支持复杂的光照、阴影、纹理贴图等效果,是许多图形应用程序的底层渲染技术。
openCV是一个开源的计算机视觉库,提供了大量的图像处理和计算机视觉算法。它主要用于计算机视觉的处理,如视频降噪、运动物体跟踪、目标识别等.它广泛应用于机器视觉、工业生产、医疗诊断、自动驾驶等多个领域。
**OpenGL专注于图形的渲染和呈现,而OpenCV则专注于从图像中获取信息并进行处理

【重要注】openGL实际上是一系列API规范,它规定了显卡进行图形渲染一系列接口的输入输出等信息,但实际上实现这些接口内部代码的是各个显卡厂商,例如amd、intel。所以,有时候会发现同样的接口在不同的显卡上效果有些差别,甚至可能会出现bug

二、在QT中集成使用openGL

在Qt中可以通过QOpenGLWidget类、QOpenGLContext和QOpenGLFramebufferObject等类方便地使用openGL的渲染功能。

三、一个重写了QOpenGLWidget的简单示例
在QT中提供了一个名为OpenGL widget的控件,我写了一个简单的myOpenGlWidget类,继承OpenGL widget控件,重写其部分功能

myopenglwidget.h

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H

#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
//QOpenGLFunctions_X_X_Core类提供了核心模式的所有功能,是对openGL函数的封装
//其中3_3指的是3.3版本,3.3及以上版本相比于旧版本实现了管线可编程性,供了更高的渲染质量和灵活性
class myOpenGlWidget : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    explicit myOpenGlWidget(QWidget *parent = nullptr);

signals:

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

};

#endif // MYOPENGLWIDGET_H

myopenglwidget.cpp

#include "myopenglwidget.h"

myOpenGlWidget::myOpenGlWidget(QWidget *parent)
    : QOpenGLWidget{parent}
{

}
//设置opengl资源,第一次使用resizeGL和paintGL之间使用
void myOpenGlWidget::initializeGL()
{
    //初始化opengl函数,将qt中的函数指针指向显卡中的函数
    //QOpenGLFunctions_3.3以上版本号_Core类提供了核心模式的所有功能,是对openGL函数的封装
    initializeOpenGLFunctions();

}

//设置opengl视口、投影,当weidget初次使用或调整大小时使用
void myOpenGlWidget::resizeGL(int w, int h)
{

}
//渲染opengl场景,widget更新时使用
void myOpenGlWidget::paintGL()
{
    glClearColor(0.1f,0.3f,0.3f,0.1f);  //设置状态
    glClear(GL_COLOR_BUFFER_BIT);       //使用状态

}

mainwindow.h

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myopenglwidget.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //初始化自定义opengl控件,并将其加入中心窗口
    myOpenGlWidget *myopenglW=new myOpenGlWidget(parent);
    setCentralWidget(myopenglW);
}

MainWindow::~MainWindow()
{
    delete ui;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值