在 Linux 中制作程序,OpenGL、Wayland 和 Qt 如何融入画面

Making a Program in Linux, how OpenGL, Wayland and Qt fit into the picture

人们通常如何制作混合了窗口化 GUI 和 3D 渲染的 GUI 程序?即 SolidWorks

更具体地说: 由于缺乏更好的描述,OpenGL 似乎更适合渲染和创建 3D Objects/Worlds,这更像是游戏。因此,例如,如果我想使用 OpenGL 创建一个 GUI(即像 MATLAB),我将不得不从头开始为文本编辑、按钮等编写所有字符信息,这看起来很荒谬。 因此,如果我想创建这些 windows 我会使用像 Qt 这样的构建器及其所有功能,但我会受到限制,如果我想在 Qt 中创建一个奇特的 3D 模型,那么我不得不使用所有Qt 功能不如 OpenGl,对吗? (还有 Wayland 如何融入这幅画?)

是什么让您认为自己不能混搭事物?此外,您对什么是 OpenGL、Qt 和 Wayland 存在误解。总的来说,这个问题太广泛了,无法令人满意地回答。我已经在这里做了很长的解释:

简而言之:

  • Wayland:一种在进程之间发送帧缓冲区句柄和用户输入以及交互事件的协议(仅此而已)
  • Wayland 合成器:创建帧缓冲区并使用 Wayland 协议将它们提供给客户端
  • Wayland 客户端:通过他们喜欢的任何方法绘制到帧缓冲区
  • Westion:一种 Wayland 合成器,可在屏幕上创建帧缓冲区 windows 供客户端绘制到

  • X11:图形和用户输入服务器协议;客户端可以连接到 X11 服务器并将服务器执行的 X11 绘图命令发送给帧缓冲区(在 X11 术语中可绘制)。传统上,X11 直接绘制到屏幕上,但如果正确的 X11 服务器 (Xwayland) 也可以绘制到 Wayland 帧缓冲区。 X11 还将用户输入(鼠标、键盘、操纵杆等)多路复用到连接的客户端。

  • X11服务器:实现X11系统的显示端后端。
  • X11 客户端:连接到 X11 服务器并发送绘图命令。

  • OpenGL:面向帧缓冲区的绘图API。本质上,OpenGL 提供了有效地将点、线和三角形绘制到帧缓冲区的方法。绘图过程可以是一组硬连线操作(旧式 OpenGL)中的固定功能,也可以是自由编程的(现代的,基于着色器的 OpenGL)。 OpenGL 绘图命令可以发送到实现 GLX 的 X11 服务器;在这种情况下,OpenGL 命令由 X11 服务器执行,客户端只向服务器发送命令流。然而,OpenGL 命令通常由使用 OpenGL API 的进程直接执行,直接进入 GPU,GPU 将它们处理成帧缓冲区中的像素。

  • Qt 或 GTK 等工具包:为创建用户界面提供抽象。 Windows 和小部件是组织帧缓冲区内容的逻辑结构。用户输入在事件系统中处理,程序员可以使用该系统来控制工具包提供的设施。用户界面元素是通过工具包可用的任何方式绘制的。这可以是正在使用的图形系统的本机绘图方法(X11 绘图命令),或者如果没有本机设置绘图命令,如在 Wayland 中,则可以使用任何符合要求的方法。所以 OpenGL 是 Qt 的一个可行选项(并且被如此使用),如果进程的运行时环境非常适合这个,那么它会绘制它的用户界面元素。

How do normally people make GUI programs with a mix of windowed GUI and 3D rendering? i.e. SolidWorks

他们使用像 Qt 这样的工具包,并且必须使用 OpenGL(或类似的 API)绘制 3D 东西。

It seems that OpenGL is tailored more towards rendering and creating 3D Objects/Worlds which would be more like a game, for lack of a better description.

OpenGL 只绘制点、线和三角形。

OpenGL 中没有 "scenes" 或 "worlds"。一切看起来像场景或游戏环境的事情都是由于程序逻辑以某种方式使用 OpenGL 而发生的,结果看起来像它。

此外,OpenGL 不会执行 windows,它不会处理用户输入。为整个小部件业务使用 GUI 工具包,并使用 OpenGL 绘制场景。