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



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

在Linux系统上,我想它应该是GTK-->X Server--(OpenGL)-->图形卡。这是对的吗?

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

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

做"软件渲染"的软件可以直接写入显卡的帧缓冲区,这样OpenGL就不会受到影响吗?

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

在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作为其唯一的后端,是的。但是图形用户界面并不是直接使用OpenGL绘制的,这将非常麻烦(使用OpenGL调用绘制每个按钮。Blender有自己的工具包。GTK+是另一个工具包,但与Blender无关(事实上,我最喜欢的项目之一是提取Blender的图形用户界面工具包,以便在独立项目中使用)。

像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会话的方式,通过将所有连接移动到某个影子X服务器中,而不是试图使用锁定屏幕保护程序阻止访问)。

做"软件渲染"的软件可以直接写入显卡的帧缓冲区,这样OpenGL就不会受到影响吗?

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

做"软件渲染"的软件可以直接写入显卡的帧缓冲区,这样OpenGL就不会受到影响吗?

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

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

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

相关内容

最新更新