【QML COOK】- 012-在QML中使用OpenGL渲染

发布时间:2024年01月23日

本文是参照了两个文章编写的。

一是QML的例子:Scene Graph - OpenGL Under QML | Qt Quick 6.6.1

二是关于SceneGraph的介绍:Qt Quick Scene Graph | Qt Quick 6.2.11

这里我提取一下重点方便大家理解。

  1. 一个QML程序只能用一种计算机图形接口。不能有的组件用OpenGL、有的用Vulkan、有的用Direct 3D等
  2. 渲染都是渲染到窗口上的而不是组件上
  3. 窗口发出?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. 运行程序

文章来源:https://blog.csdn.net/patronwa/article/details/135790248
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。