GUI输出如何从应用程序到硬件级别工作?

时间:2012-01-08 12:33:44

标签: user-interface opengl graphics gtk xserver

我正在进入GUI编程并做了一些研究。现在不是一切都清楚了。 如果我使用GTK +作为工具包,它如何与显卡通信?

在Linux系统上,我认为它将是GTK - > X服务器 - (OpenGL) - >显卡。 这是对的吗?

我读到一些GUI直接绘制OpenGL(例如Blender3D),那么其他应用程序如何绘制GUI?

如果图形卡的唯一API(我知道)是Direct3D和OpenGL,那么软件渲染和硬件加速之间的区别是什么?

执行“软件渲染”的软件可以直接写入显卡的帧缓冲区,以便OpenGL不受影响吗?

PS:很抱歉有很多问题,但我真的不知道这一切是如何运作的,谢谢你的每一个答案:)

2 个答案:

答案 0 :(得分:14)

  

在Linux系统上,我认为它将是GTK - > X服务器 - (OpenGL) - >显卡。这是对的吗?

没有。 Linux上的GTK +

                                              /-[ if direct context ]---\
                     /--> OpenGL >-+---------/                           \
                    /              \-> GLX -+--------------\              \
                   /                         \              \              \
GTK+ -+-> cairo >-+---> XRender >--------+----+-> Xlib/xcb >-+-> X server >-+-> Kernel Module >-> GPU
       \           \–-> pixmap buffer >–/
        \                              /
         \―---------------------------/
  

我读到一些GUI直接绘制OpenGL(例如Blender3D),那么其他应用程序如何绘制GUI?

这只是“Blender”(没有尾随3D)。 Blender的GUI工具包使用OpenGL作为其唯一的后端,是的。但是GUI不是直接使用OpenGL绘制的,这只是为了使用繁琐(使用OpenGL调用绘制每个按钮.Blender有自己的工具包.GTK +是另一个工具包但不依赖于Blender(事实上,一个)我的宠物项目正在提取Blender的GUI工具包,以便它可以在独立项目中使用。)

GTK +和Qt等工具包旨在实现最大的便携性。 Blender很高兴知道会有OpenGL可用。为GTK +或Qt开发的应用程序可以在非3D系统上运行,因此GTK +和Qt的设计允许在许多后端上运行。现在版本3中的GTK +使用Cairo图形引擎作为图形后端。开罗还有自己的后端,即软件光栅化器绘制成像素图(像素图像),或代理绘图命令到底层图形架构。对于Linux上的Cairo,这可能是OpenGL或X11(核心和XRender协议扩展)。

  

如果图形卡的唯一API(我知道)是Direct3D和OpenGL,那么软件渲染和硬件加速之间的区别是什么?

OpenGL和Direct3D都不与显卡通信。他们与显卡的驱动程序交谈。因此,您可以选择与驾驶员交谈,绕过OpenGL和Direct3D。但你为什么要这样做?这很乏味。

在Windows上,您还有用于绘制内容的GDI和/或WPF(Windows Presentation Foundation)以及Direct2D。

在Linux上,你可以获得X11核心和XRender扩展协议来绘制漂亮的图片。

另一个崛起的API是OpenVG,旨在标准化所有这些2D绘图API。至少在Linux中,OpenGL和OpenVG被选中成为唯一可用的抽象绘图API,具有一些用于管理帧缓冲和用户输入的窗口系统。开发中的Wayland(我完全不喜欢它的设计)和X11,我认为它有更好的设计(它是一个面向网络的系统,允许分布式执行,我认为将来非常重要),但是需要一个对一些“X12”进行全面检修 - 清理旧版本,使其在联系颜色空间中运行,使连接可转换(这样您就可以在X服务器之间迁移客户端,这将允许更优雅的方式锁定X会话,通过将所有连接移动到某个影子X服务器,而不是尝试使用锁定屏幕保护程序阻止访问。)

  

执行“软件渲染”的软件可以直接写入显卡的帧缓冲区,以便OpenGL不受影响吗?

不适用于现代操作系统。但是,操作系统可能会通过一些帧缓冲API(Linux上的/ dev / fb0)为您提供对图形卡的抽象访问。然而,帧缓冲是不受管理的,所以如果有一个X服务器或Wayland正在运行,那么其中任何一个都在管理FB的任务,那么这不是你的业务。

答案 1 :(得分:2)

  

执行“软件渲染”的软件可以直接写入显卡的帧缓冲区,以便OpenGL不受影响吗?

不完全或更准确:取决于驾驶员。像XServer(或Windows和MacOS等价物)这样的显示系统不使用API​​,而是描述API。特别称为显示驱动程序必须满足的驱动程序模型(或在XServers案例中,如XAA,EXA,UXA和​​DRI之类的多个模型之一)。

这些模型中未定义的所有内容都必须在“软件”中完成并在CPU上计算。此外,模型定义的一些操作也可以由驱动程序在CPU上计算。

OpenGL曾经是这些模型的完全独立标准。图形驱动程序根本不必实现OpenGL以供操作系统使用。但随着3D图形和更复杂的合成在现代操作系统中的不断整合,驱动程序模型已经开始依赖于与OpenGL和Direct3D相同的范例。例如,WDDM(Windows显示驱动程序模型)完全需要Direct3D 9支持。