什么可以做Qt + OpenGL可以做的OpenGL扩展?

时间:2017-11-03 09:00:10

标签: qt opengl opengl-extensions

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

3 个答案:

答案 0 :(得分:2)

我认为你错过了这一点。 OpenGL(包括其提供普通OpenGL不具备的一些特权的扩展)是"只是"用于渲染2D和3D的图形库。另一方面,Qt更多。 OpenGL本身并不提供除渲染之外的任何东西。您甚至无法使用它创建一个窗口(就像您在Windows / Linux中习惯的那样)。为了添加对用户输入的任何处理,你需要一个Qt(和许多其他类似框架)提供的额外层 - 集成到操作系统的窗口管理器,处理鼠标和键盘事件等.Qt也支持OpenGL扩展,因此如果你想使用它们,你不必抛弃它们。

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

答案 1 :(得分:2)

你(OP)在评论中写了一个不同的答案:

  

扩展提供了当不提供Qt本身以提供额外的opengl功能时OpenGL核心无法提供的功能。它就像是用户的插件。

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

另一方面,Qt为以便携方式处理操作系统细节的应用程序提供了一个框架。 Qt和OpenGL完全正交, nothing ,OpenGL扩展以任何方式与Qt完全相同。 Qt有一个OpenGL集成模块,除其他外,如果你要求它还会加载OpenGL扩展;但这并没有使它成为“Qt”的东西。

答案 2 :(得分:2)

  

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

您的问题格格不入。没有什么可以阻止你使用Qt与OpenGL 与OpenGL扩展。

您可以使用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抽象的顶点属性。 The QtOpenGLShaderProgram class不允许这样做。它的所有setAttributeBuffer次调用都假设您正在调用glVertexAttribPointer。它没有调用glVertexAttribIPointer的机制。这已经是近十年的核心桌面OpenGL

请注意,这只是一个功能。其他东西Qt没有包装类支持,它是核心桌面OpenGL的一部分(这不是一个全面的列表):

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

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

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

因此,如果您想实际使用核心桌面OpenGL功能,那么Qt抽象层就已经完成了。

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

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

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

类似地,出于他们自己最熟悉的原因,他们将{Vertus属性规范函数(相当于glVertexAttribPointer)放在QtOpenGLShaderProgram中。他们为什么在那里?虽然顶点属性确实与程序有间接连接,但它们不是概念程序界面的直接部分。 OpenGL不能那样工作。

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