代码之家  ›  专栏  ›  技术社区  ›  Michał Kalinowski

什么是Qt+OpenGL不能做的OpenGL扩展?[已关闭]

  •  -2
  • Michał Kalinowski  · 技术社区  · 7 年前

    由于Qt可以以正常方式处理OpenGL,因此它是跨平台的,可以处理鼠标、键盘、游戏板等。将Qt与OpenGL结合使用而不是将OpenGL与扩展结合使用有哪些缺点?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Nicol Bolas    7 年前

    将Qt与OpenGL结合使用,而不是将OpenGL与扩展结合使用,其缺点是什么?

    你的问题格式不正确。没有什么可以阻止您在OpenGL中使用Qt 使用OpenGL扩展。

    您可以使用Qt来管理OpenGL窗口,同时使用带有扩展的直接OpenGL命令进行渲染。你不是 必修的 使用Qt的OpenGL界面在OpenGL窗口中进行渲染。

    Qt不提供“额外的opengl功能”它 不能 提供“额外的opengl功能”它不是OpenGL的一部分,因此它不能使OpenGL功能神奇地出现。

    没有用于鼠标、键盘、游戏板或任何其他Qt处理的东西的OpenGL扩展。Qt的窗口功能和OpenGL扩展是 两件完全不同的事 彻底地 正交;没有什么可以阻止您同时使用Qt+OpenGL和OpenGL扩展。

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


    如果你的问题是是否直接使用Qt+OpenGL而不是使用Qt的OpenGL抽象层,那是另一回事。

    第一个问题是Qt的抽象层绑定到OpenGL . 当它 偶尔地

    不是“扩展”; 核心功能 .

    例如,不能将整数用于Qt抽象的顶点属性。 The QtOpenGLShaderProgram class 不允许这样做。所有的 setAttributeBuffer 电话 假定 你在打电话 glVertexAttribPointer . 它没有调用机制 glVertexAttribIPointer . 这就是OpenGL的核心 近十年 .

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

    QtOpenGLFunctions 类似地,仅限于OpenGL ES版本。这就在表上留下了大量无法通过抽象使用的非扩展桌面GL内容。

    此外,由于Qt的抽象是围绕ES 2.0进行的,所以它不关心核心OpenGL上下文。例如,它仍然具有非缓冲顶点属性( setAttributeArray

    因此,如果您想要实际使用核心桌面OpenGL功能,那么Qt抽象层就不存在了。

    例如(这是我个人最讨厌的事), QtOpenGLBufferObject 已键入。也就是说,绑定类型是对象的一部分。

    OpenGL buffer objects 没有打印。执行异步 glReadPixels 放入缓冲区,然后绑定 相同的缓冲区 用作顶点数据。这在Qt的类抽象中是不可能的。这并不是桌面GL特有的东西;OpenGL ES以同样的方式工作。

    类似地,出于众所周知的原因,他们将顶点属性规范函数(等效于 GLVERtexAttribute指针 )在 QtOpenGLShaderProgram . 他们为什么在那里?虽然顶点属性确实与程序有间接连接,但它们不是概念程序界面的直接部分。OpenGL不是这样工作的。

    这就是Qt抽象层的最大问题。如果你能在这些限制下生活,请随意使用它。对于制作桌面OpenGL应用程序的人来说,它们可能限制太多。

        2
  •  2
  •   datenwolf    7 年前

    你(OP)在评论中对另一个答案写道:

    扩展提供了OpenGL核心无法提供的功能,而Qt本身无法提供额外的OpenGL功能。它就像是用户的插件。

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

    另一方面,Qt为以可移植方式处理操作系统细节的应用程序提供了一个框架。Qt和OpenGL彼此完全正交 没有什么 OpenGL扩展在任何方面都类似于Qt。Qt有一个OpenGL集成模块,如果你要求的话,它还将加载OpenGL扩展;但这并不意味着它是一个“Qt”的东西。

        3
  •  2
  •   rbaleksandar    7 年前

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

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