Learn OpenGL with Qt——必备知识(易出错导致绘图失败的地方)

本文深入探讨OpenGL的绘图机制,解析渲染上下文(RenderContext)的作用,对比QPainter绘图流程,阐述QOpenGLWidget与QOpenGLFunctions的关系,以及如何在多窗口环境下正确管理OpenGL资源。

OpenGL Context(上下文)的概念:

如果你使用过Qt的QPainter类进行过绘图的话,可能理解起来会简单一点,QPainter需要一个PaintDevice(绘图设备)参数,

而我们的QWidget,QImage,QPixmap就继承自它,因此可以这样使用:

Qimage img(400,400);
QPainter painter(&img);

也可以在QWidget的绘图函数中这样: 

void paintEvent(QPaintEvent*){
    QPainter painter(this);
}

上面的代码主要是创建了一个QPainter对象,并且设置了该对象操作的渲染设备,之后我们可以调用QPainter的各种成员方法在该设备进行绘图。

而OpenGL中进行绘图也需要一个这样的东西——Render Context (渲染上下文),简单来说,它也是一个绘图设备。回顾一下我们是如何在Qt中创建OpenGL窗口,首先创建一个QWidget,然后修改继承自QOpenGLWidget和QOpenGLFunctions,继承QOpenGLWidget是为了创建窗口,而继承QOpenGLFunctions只是为了让我们能够少写一点代码(你应该知道Qt把所有OpenGL函数封装为QOpenGLFunctions的成员函数),我们完全可以在QOpenGLWidget中创建一个 QOpenGLFunctions变量,只不过可能要这样来使用它:

class Test:public QOpenGLWidget{

private:
    QOpenGLFunctions func;

public:
    void initializeGL(){
        func.initializeOpenGLFunctions();
    }
    void paintGL(){
        //...
        func.glDrawArray(...);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值