Qt+OpenGL 做不到的 OpenGL 扩展有哪些?

What can do OpenGL extensions that Qt+OpenGL can't?

由于 Qt 可以正常方式处理 OpenGL,它是跨平台的,可以处理鼠标、键盘、游戏手柄等。使用带有 OpenGL 的 Qt 而不是使用带扩展的 OpenGL 有什么缺点?

我认为你没有抓住重点。 OpenGL(包括它的扩展,它提供了一些普通 OpenGL 所没有的好处)是 "just" 一个用于渲染 2D 和 3D 的图形库。另一方面,Qt 远不止于此。 OpenGL 本身只提供渲染功能。你甚至不能用它创建一个 window(就像你在 Windows/Linux 中习惯的那样)。为了添加任何类型的用户输入处理,您需要 Qt(和许多其他类似框架)提供的额外层 - 集成到 OS 的 window 管理器中,处理鼠标和键盘事件等。Qt 也支持 OpenGL 扩展,所以如果你想使用它们,你不必扔掉它们。

您的 OpenGL(有或没有系统支持的扩展)任务是否需要 Qt 是您需要自己决定的事情。 Qt 确实提供了许多不错的功能,可以帮助您使 OpenGL 交互变得更好,但是这是一个巨大的开销,并且根据您的目标系统,您可能必须使用具有较小内存的较小框架(包括所有库文件的持久存储)足迹和 CPU 用法。其他流行的选择是 GLFW、freeglut 和 SDL/SDL2 所有这些都至少提供了基础知识(window 创建和 mouse/keyboard 处理)来启动您的应用程序和 运行.

您 (OP) 在对不同答案的评论中写道:

Extensions provide functionality that the core of OpenGL doesn't provide when Qt itself won't be created for providing additional opengl functionality. It was like a addon for users.

我认为您完全误解了什么是 OpenGL 扩展及其工作原理。 OpenGL 扩展允许向 OpenGL 添加新功能(实际上可能包含在以后的核心版本中)and/or 以公开特定于供应商的功能,例如访问仅适用于非常特定的窄范围 GPU 的特殊 GPU 功能。

另一方面,Qt 为以可移植方式处理操作系统细节的应用程序提供了一个框架。 Qt 和 OpenGL 彼此完全正交,并且 nothing,OpenGL 扩展在任何方面都与 Qt 相似。 Qt 有一个 OpenGL 集成模块,除其他外,如果您需要,它还会加载 OpenGL 扩展;但这并不能使它成为 "Qt" 事情。

What are the disadvantages of using Qt with OpenGL instead using OpenGL with extensions?

您的问题格式不正确。没有什么能阻止您将 Qt 与 OpenGL 与 OpenGL 扩展一起使用。

您可以使用 Qt 管理 OpenGL window,同时使用带扩展的直接 OpenGL 命令进行渲染。您 不需要 使用 Qt 的 OpenGL 接口在 OpenGL window.

中渲染

Qt不提供"additional opengl functionality."它不能提供"additional opengl functionality."它不是OpenGL的一部分,所以它不能使OpenGL特性神奇地出现.

没有用于鼠标、键盘、游戏手柄或 Qt 处理的任何其他东西的 OpenGL 扩展。 Qt 的windowing 功能和OpenGL 扩展是两个完全不同的东西。而且它们完全正交;没有什么能阻止您同时使用 Qt+OpenGL 和 OpenGL 扩展。

好吧,除非你停止你自己。看,Qt 有这个 OpenGL 抽象层。这是一组围绕 OpenGL 的包装器 classes:QtOpenGLShaderProgramQtOpenGLVertexArrayObject 等。如果你使用它,你不会直接进行 OpenGL 调用;您进行 Qt 调用,这些调用会为您进行 OpenGL 调用。


如果您的问题是直接使用 Qt+OpenGL 还是使用 Qt 的 OpenGL 抽象层,那是另一回事。

第一个问题是Qt的抽象层绑定了OpenGL ES 2.0。虽然它偶尔 提供 ES 2.0 无法提供的功能,但它主要是作为 ES 2.0 的 class 化实现。因此,通过使用 ES 2.0,您可以有效地放弃使用大量桌面 OpenGL 功能。

不是"extensions"; 核心功能.

例如,您不能将整数用于具有 Qt 抽象的顶点属性。 The QtOpenGLShaderProgram class 不允许。它的所有 setAttributeBuffer 调用 假定 您正在调用 glVertexAttribPointer。它没有调用 glVertexAttribIPointer 的机制。 将近十年

,这一直是桌面 OpenGL 的核心

请注意,这只是一项功能。 Qt 没有作为核心桌面 OpenGL 一部分的包装器 class 支持的其他东西(这不是一个完整的列表):

这些不是最新的硬件功能;他们中的大多数人已经存在了五年。

QtOpenGLFunctions 同样限于 OpenGL ES 版本。这在 table 上留下了大量无法通过其抽象使用的非扩展桌面 GL 内容。

此外,由于 Qt 的抽象是围绕 ES 2.0 进行的,因此它不关心核心 OpenGL 上下文。例如,它仍然具有非缓冲顶点属性 (setAttributeArray)。这在核心 OpenGL 中是不合法的,近十年来也是不合法的。

因此,如果您想实际使用核心桌面 OpenGL 功能,则 Qt 抽象层已退出。

然后,Qt 的抽象在某些地方与 OpenGL 的工作方式不匹配。

例如(这是我个人的小毛病),输入QtOpenGLBufferObject。也就是说,绑定类型是对象的一部分。 这不是缓冲区对象的工作方式!

OpenGL buffer objects 未输入。将异步 glReadPixels 执行到缓冲区中,然后绑定 相同的缓冲区 以用作顶点数据是完全合法的。这对于 Qt 的 class 抽象是不可能的。这并不是桌面 GL 特有的东西; OpenGL ES 的工作方式相同。

同样,出于他们自己最清楚的原因,他们将顶点属性规范函数(相当于glVertexAttribPointer)放在QtOpenGLShaderProgram中。他们为什么在那里?虽然顶点属性确实与程序有间接联系,但它们不是概念程序接口的直接部分。 OpenGL 不是那样工作的。

所以这些是 Qt 抽象层的最大问题。如果您可以遵守这些限制,请随意使用它。对于制作桌面 OpenGL 应用程序的人来说,它们可能限制太多。