# opengl-cube-animal **Repository Path**: mrxiao_com/opengl-cube-animal ## Basic Information - **Project Name**: opengl-cube-animal - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-24 - **Last Updated**: 2021-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 使用 Qt 介绍 OpenGL 我们不是 OpenGL 方面的专家,因此在本章的这一部分 而是会向您展示如何在 Qt 应用程序中使用您的 OpenGL 技能 有很多关于 OpenGL 的教程和课程,所以如果您对 OpenGL 不是那么熟练,您仍然可以从这里描述的内容中受益 通过利用这里获得的知识来更轻松地学习花哨的东西。 您可以使用 Qt 提供的外部材料和高级 API,这将加速教程中描述的许多任务 OpenGL 上下文表示 OpenGL 管道的整体状态,它指导数据处理和渲染到特定设备的过程。 在 Qt 中,它由 QOpenGLContext 类表示。 一个需要解释的相关概念是 OpenGL 上下文在线程中是“当前”的 OpenGL 调用的工作方式是它们不使用任何对象的句柄 这些对象包含有关在何处以及如何执行一系列低级 OpenGL 调用的信息 相反,假设它们是在当前机器状态的上下文中执行的 状态可以决定是将场景渲染到屏幕还是帧缓冲区对象,启用哪些机制,或者渲染 OpenGL 表面的属性 使上下文成为“当前”意味着由特定线程发出的所有进一步的 OpenGL 操作都将应用于此上下文 除此之外,上下文只能同时在一个线程中处于“当前”状态;因此,在进行任何 OpenGL 调用之前使上下文成为当前状态非常重要,然后在访问完 OpenGL 资源后将其标记为可用。 QOpenGLWindow 有一个非常简单的 API,它对开发人员隐藏了大部分不必要的细节 除了构造函数和析构函数之外,它还提供了少量非常有用的方法 先,有管理OpenGL上下文的辅助方法:context(),返回上下文 makeCurrent()和doneCurrent()获取和释放上下文。 该类还提供了许多我们可以重新实现以显示 OpenGL 图形的虚拟方法。 我们将使用以下三个虚拟方法: initializeGL() 在任何绘制实际完成之前由框架调用一次,以便您可以准备任何资源或以您需要的任何方式初始化上下文 对于小部件类,paintGL() 等效于paintEvent()。 每当需要重新绘制窗口时,它就会执行 这是您应该放置 OpenGL 渲染代码的函数。 每次调整窗口大小时都会调用 resizeGL()。 它接受窗口的宽度和高度作为参数。 s您可以通过重新实现该方法来使用该方法,以便您可以为下一次调用paintGL() 渲染到不同大小的视口这一事实做好准备。 与 OpenGL 的交互通常是通过调用 OpenGL 库提供的函数来完成的 例如,在常规 C++ OpenGL 应用程序中,您可以看到对 OpenGL 函数(如 glClearColor())的调用 当您的二进制文件链接到 OpenGL 库时,这些函数就会得到解析。 但是,当您编写跨平台应用程序时,解析所有必需的 OpenGL 函数并非易事 幸运的是,Qt 提供了一种调用 OpenGL 函数的方法,而无需担心特定于平台的细节。 在 Qt 应用程序中,您应该通过一系列 QOpenGLFunctions 类访问 OpenGL 函数 QOpenGLFunctions 类本身仅提供对属于 OpenGL ES 2.0 API 一部分的函数的访问。 该子集有望在 Qt 支持的大多数桌面和嵌入式平台上工作(其中 OpenGL 完全可用)。 但是,这是一组非常有限的功能,有时您可能希望以支持较少平台为代价使用更新的 OpenGL 版本。 对于每个已知的 OpenGL 版本和配置文件,Qt 提供了一个单独的类,其中包含一组可用函数。 例如,QOpenGLFunctions_3_3_Core 类将包含 OpenGL 3.3 核心配置文件提供的所有函数。 Qt 推荐的方法是选择与您要使用的版本对应的 OpenGL 函数类 并将此类添加到您的窗口或小部件的第二个基类中 这将使该版本的所有 OpenGL 函数在您的类中可用 这种方法允许您直接使用使用 OpenGL 库的代码而无需更改它。 例如,当您将此类代码放入类中时,编译器将使用 QOpenGLFunctions::glClearColor() 函数而不是 OpenGL 库提供的全局 glClearColor() 函数 但是,在使用这种方法时,您必须小心,不要只使用基类提供的函数。 如果您选择的 Qt 类不包含全局函数,您可能会意外地使用全局函数而不是 Qt 类提供的函数 例如,如果您使用 QOpenGLFunctions 作为基类,则不能使用 glBegin() 函数,因为该 Qt 类不提供它 这种错误的代码可能在一个操作系统上运行,然后突然无法在另一个操作系统上编译,因为您没有链接到 OpenGL 库 只要只使用 Qt 类提供的 OpenGL 函数,就不必考虑与 OpenGL 库链接或跨平台解析函数 如果你想确保你只使用 Qt OpenGL 函数包装器,你可以使用 Qt 类作为私有字段而不是基类 在这种情况下,您必须通过私有字段访问每个 OpenGL 函数 例如,m_openGLFunctions->glClearColor()。 这将使您的代码更加冗长,但至少您将确保不会意外使用全局函数。 在使用 Qt OpenGL 函数之前,您必须在当前 OpenGL 上下文中调用函数类的 initializeOpenGLFunctions() 方法 这通常在窗口的 initializeGL() 函数中完成 QOpenGLFunctions 类应始终成功初始化,因此其 initializeOpenGLFunctions() 方法不返回任何内容。 在所有其他函数的类中,此函数返回 bool。 如果返回 false,则表示 Qt 无法成功解析所有必需的函数,您的应用程序应退出并显示错误消息。 我们将从最基本的方法开始,称为立即模式 在此模式下,不需要额外设置 OpenGL 缓冲区或着色器 您可以只提供一堆几何图元并立即获得结果。 立即模式现在已被弃用,因为它的工作速度要慢得多,而且不如更高级的技术灵活 然而,它比它们容易得多,基本上每个 OpenGL 教程都是从描述立即模式调用开始的 在本节中,我们将展示如何使用很少的代码执行一些简单的 OpenGL 绘图。 本章的下一节将介绍更现代的方法。