你好!GLES3 示例#

通过 QOpenGLExtraFunctions 展示 OpenGL ES 3.0 函数。

../_images/hellogles3-example.png

概述#

此示例演示了通过 QOpenGLExtraFunctions 在桌面平台(OpenGL 3.3)和移动/嵌入式设备(OpenGL ES 3.0)上运行的应用程序中使用 OpenGL ES 3.0 函数的方便性,这些设备的运行方式与桌面完全相同。

此示例没有 QWidget 依赖关系,它使用 QOpenGLWindow,这是 QWindow 的一个便利子类,它允许轻松实现包含 OpenGL 渲染内容的窗口。从这个意义上讲,它与OpenGL 窗口示例 相互补,该示例显示了不使用便利子类实现基于 OpenGL 的 QWindow。

Qt 标志形状实现包含从 Hello GL2 示例

关于使用 OpenGL 的其他方面,存在以下差异。

  • OpenGL 上下文创建必须具有足够高的版本号以支持所使用的功能。

  • 着色器版本指令不同。

在 main.cpp 中设置#

在这里,我们实例化了我们的 QGuiApplication、QSurfaceformat 并设置了其深度缓冲区大小

我们请求 OpenGL 3.3 核心或 OpenGL ES 3.0 上下文,具体取决于 QOpenGLContext::openGLModuleType()

我们设置了默认表面格式并实例化了我们的 GLWindow glWindow

实现 GLWindow#

此类实现了示例应用程序的功能。

首先,通过实现 QOpenGLWindow 的子类,声明了 GLWindow

以下属性使用 Q_PROPERTY 声明

以下声明了以下公共函数

以下声明了以下私有对象

在实现方面,未声明为内联的那些函数在 glwindow.cpp 中实现(或重新实现)。以下选择将涵盖使用 OpenGL ES 3.0 的实现细节。

动画#

以下代码与动画相关,此处不会探讨

有关更多信息,请参阅 QPropertyAnimation 和 QSequentialAnimationGroup 的文档。

着色器#

着色器是这样定义的

注意

这些都是与 OpenGL 版本无关的。我们将此与版本一起附加

初始化 OpenGL#

initializeGL() 中处理着色器程序的初始化

现在,前面加上了 OpenGL 版本号,并设置了各种矩阵和光位置

虽然在 ES 3 中不是强制性的,但创建了一个顶点数组对象。

调整窗口大小#

视点需要与新窗口大小对齐,如下所示

绘制#

我们使用 QOpenGLExtraFunctions 而不是 QOpenGLFunctions,因为我们想要做的不仅仅是 GL(ES) 2.0 提供的内容

我们清除屏幕和缓冲区,并绑定我们的着色器程序和纹理

处理初始 paintGL() 调用或 resizeGL() 调用之后的逻辑实现如下

最后,我们演示了在 OpenGL 3.1 或 OpenGL ES 3.0 中引入的一个函数

之所以能工作,是因为我们之前请求了 3.3 或 3.0 上下文。

示例项目 @ code.qt.io