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:QtOpenGLShaderProgram
、QtOpenGLVertexArrayObject
等。如果你使用它,你不会直接进行 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 应用程序的人来说,它们可能限制太多。
由于 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:QtOpenGLShaderProgram
、QtOpenGLVertexArrayObject
等。如果你使用它,你不会直接进行 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
的机制。 将近十年。
请注意,这只是一项功能。 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 应用程序的人来说,它们可能限制太多。