本文是参照了两个文章编写的。
一是QML的例子:Scene Graph - OpenGL Under QML | Qt Quick 6.6.1
二是关于SceneGraph的介绍:Qt Quick Scene Graph | Qt Quick 6.2.11
这里我提取一下重点方便大家理解。
- 一个QML程序只能用一种计算机图形接口。不能有的组件用OpenGL、有的用Vulkan、有的用Direct 3D等
- 渲染都是渲染到窗口上的而不是组件上
- 窗口发出 QQuickWindow::beforeSynchronizing信号后,可以保证GUI线程是阻塞的。因此我们连接该信号,在该信号的槽函数中获取渲染时需要的GUI的属性值(因为GUI线程阻塞,因此属性值不会发生变化)。
1. 编写代码,由于本例代码过长,因此将代码放到了gitee上。
EniacCheng/my-qml-demo - Gitee.com
这里将重点介绍一下。
一、首先在main函数中,调用QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);。设置整个程序使用OpenGL接口进行渲染。
二、创建openglitem类。该类就是一个普通的C++定义的QML元素类型(见:【QML COOK】- 006-用C++定义一个QML元素类型-CSDN博客)。它的所用就是接收窗口信号为OpenGL的渲染提供参数。
三、在openglitem中链接QQuickWindow::beforeSynchronizing信号,注意连接方式为Qt::DirectConnection。因为此时GUI线程一定是阻塞的因此使用Qt::DirectConnection方式没有问题。
四、在QQuickWindow::beforeSynchronizing信号的槽函数sync中将窗口的宽高值传给OpenGL渲染类。
五、定义openglrenderer类,该类是OpenGL的渲染类。该类的作用是用OpenGL接口渲染一个绿色正方形。
OpenGLRenderer::prepareShaderProgram()用于设置shader程序。
OpenGLRenderer::render()用于渲染
2. 运行程序