你好!GLES3 示例#
通过 QOpenGLExtraFunctions 展示 OpenGL ES 3.0 函数。
概述#
此示例演示了通过 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 上下文。