-2

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

4

3 回答 3

2

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

扩展提供了 OpenGL 核心不提供的功能,当 Qt 本身不会被创建来提供额外的 opengl 功能时。它就像用户的插件。

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

另一方面,Qt 为以可移植方式处理操作系统细节的应用程序提供了一个框架。Qt 和 OpenGL 彼此完全正交,没有任何关系,OpenGL 扩展在任何方面都类似于 Qt 所做的。Qt 有一个 OpenGL 集成模块,除其他外,它还会在您要求时加载 OpenGL 扩展;但这并不能使它成为“Qt”的东西。

于 2017-11-03T12:20:08.390 回答
2

将 Qt 与 OpenGL 一起使用,而不是将 OpenGL 与扩展一起使用有什么缺点?

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

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

Qt 不提供“额外的 opengl 功能”。它不能提供“额外的 opengl 功能”。它不是 OpenGL 的一部分,所以它不能让 OpenGL 的特性神奇地出现。

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

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


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

第一个问题是 Qt 的抽象层绑定到 OpenGL ES 2.0。虽然它偶尔会提供 ES 2.0 无法提供的功能,但它主要是作为 ES 2.0 的分类实现。因此,通过使用 ES 2.0,您实际上放弃了使用大量桌面 OpenGL 功能。

不是“扩展”;核心功能

例如,在 Qt 的抽象中,您不能将整数用于顶点属性。班级不允许QtOpenGLShaderProgram它的所有setAttributeBuffer调用都假定您正在调用glVertexAttribPointer. 它没有调用机制glVertexAttribIPointer近十年来,这一直是桌面 OpenGL 的核心。

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

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

QtOpenGLFunctions同样仅限于 OpenGL ES 版本。这留下了许多无法通过抽象使用的非扩展桌面 GL 东西。

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

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

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

例如(这是我个人的烦恼),QtOpenGLBufferObject是打字的。也就是说,绑定类型是对象的一部分。这不是缓冲区对象的工作方式!

OpenGL 缓冲区对象没有类型。在缓冲区中执行异步操作是完全合法的glReadPixels,然后绑定相同的缓冲区以用作顶点数据。这在 Qt 的类抽象中是不可能的。这并不是桌面 GL 特有的东西。OpenGL ES 的工作方式相同。

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

所以这些是 Qt 抽象层的最大问题。如果您可以在这些限制范围内生活,请随意使用它。对于制作桌面 OpenGL 应用程序的人来说,它们可能过于严格。

于 2017-11-03T15:29:45.647 回答
2

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

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

于 2017-11-03T09:18:07.950 回答