12

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

在 Linux 系统上,我想它会是 GTK --> X Server --(OpenGL)--> 显卡。这是正确的吗?

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

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

做“软件渲染”的软件能不能直接写到显卡的framebuffer,让OpenGL不受影响?

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

4

2 回答 2

15

在 Linux 系统上,我想它会是 GTK --> X Server --(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 的设计允许在多个后端上运行。GTK+ 现在在版本 3 中使用 Cairo 图形引擎作为图形后端。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 会话,

做“软件渲染”的软件能不能直接写到显卡的framebuffer,让OpenGL不受影响?

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

于 2012-01-08T13:24:26.797 回答
2

做“软件渲染”的软件能不能直接写到显卡的framebuffer,让OpenGL不受影响?

不完全,或更准确地说:取决于驱动程序。XServer(或 Windows 和 MacOS 等价物)等显示系统不使用 API,而是描述 API。具体称为显示驱动程序必须满足的驱动程序模型(或在 XServer 的情况下为多种模型之一,如 XAA、EXA、UXA 和 DRI)。

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

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

于 2012-01-08T13:55:27.623 回答