【问题标题】:How do GTK+ and OpenGL libraries cooperate on a single X server?GTK+ 和 OpenGL 库如何在单个 X 服务器上协作?
【发布时间】:2013-08-01 21:34:30
【问题描述】:

图形用户界面隐藏了神秘的机制。它将 2D 和 3D 上下文混合在一个屏幕上,并允许这两个截然不同的世界无缝组合。但是它们实际上以何种方式以及在哪个级别交错呢?

实践表明,OpenGL 上下文可以嵌入到 2D 小部件库中,因此整个 2D 界面可以由 OpenGL 支持。此外,一些应用程序可能会探索硬件加速,而其他应用程序则不会(在同一屏幕上呈现时)。图形卡是否“了解”屏幕上的 2D 和 3D 区域以及窗口管理器是否会产生有凝聚力的前端的错觉? ...人们会注意到加速窗口(3D,视频)“跳跃”以适应 2D 界面,例如滚动网页或在屏幕上移动视频播放器。

这个问题似乎是微不足道的,但我还没有遇到任何人能够给我一个全面的答案。一个答案,它可以让我将 OpenGL 上下文嵌入到 GTK+ 应用程序中,并了解它为什么以及如何工作。我已经尝试过 GtkGlExt 和 GLUT,但我想深入了解这个主题并编写自己的解决方案作为学术项目的一部分。我想知道 X、GLX、GTK、OpenGL 和窗口管理器之间的关系是什么,以及如何探索这个库网络以有意识地对其进行编程。

我不希望有人会在这里写论文,但我会感谢任何关于该主题的指示、建议或文章链接。

【问题讨论】:

  • 你想的太复杂了。 OpenGL 只是另一个可用于在常规 X11 窗口上绘制的 API。 GTK+ 本身(如果在 X11 上运行)将只使用 X 服务器提供的图形基元,即 X 核心、XRender 和 GLX/OpenGL。请参阅我的回答stackoverflow.com/a/8777891/524368 如此详尽的解释。
  • @datenwolf 感谢您的回答——我掌握了用于绘图的 GTK+ 库图的一般概念。但是它如何在相反的方向工作,即本机窗口事件如何传播回应用程序?我知道如何使用 Xlib 或 WinAPI 本地捕获它们;以及如何为此使用 GLUT。但是是否有一个非 GLUT 的便携式解决方案可以使用,例如同时为 GTK+ 实现支持 OpenGL 的小部件?
  • 嗯,大多数框架和工具包都实现了一个主事件循环,它使用 Xlib/Xcb 或 Win32 或任何使用的窗口 API 的常规函数​​,从本机系统检索事件并将它们转换为自己的内部事件格式;然后他们将它们注入到他们自己的内部事件传播系统中。

标签: opengl user-interface gtk


【解决方案1】:

你的想法太复杂了。像 GTK+ 或 Qt 这样的工具包在某些东西上添加了相当多的抽象层,这实际上相当简单:您系统的图形设备由一个处理器和一些可以运行的内存组成。在最简单的情况下,处理器是普通的系统 CPU,而内存是普通的系统内存。但是,现代计算机具有专用图形处理器 (GPU),它有自己的高带宽内存。

内存保存帧缓冲区。从逻辑上讲,帧缓冲区是一个二维值数组。可以对 GPU 进行编程,以某种方式处理帧缓冲区中的值。这可用于绘制帧缓冲区。显示图片的监视器连接到一个特殊的电路,该电路连续地将内存中某个帧缓冲区的数据馈送到屏幕(通常称为 RAMDAC 或 CRTC)。所以在 GPU 的内存中有一个帧缓冲区,它直接进入屏幕。如果你在那里画,屏幕上就会出现东西。

像 X11 服务器这样的程序可以加载“知道”如何对 GPU 进行编程以绘制图形基元的驱动程序。 X11 本身定义了某些图形基元,扩展模块可以添加更多的图形基元。 X11 本身允许将 GPU 内存上的帧缓冲区分离到称为 Drawable 的逻辑区域中。屏幕帧缓冲区上的可绘制对象称为 Windows。由于逻辑窗口可以重叠,X 服务器还管理 Z 堆叠,它用于对窗口进行排序以进行重绘。每次客户端想要绘制到 X11 服务器会告诉 GPU 的某个窗口时,绘制操作将只修改帧缓冲区的那些像素,其中绘制到的窗口是可见的(这称为“像素所有权测试”)。 X11 服务器还将创建不属于屏幕帧缓冲区内存区域的可绘制对象(即帧缓冲区)。这些在 X11 术语中称为 PBuffers 或 Pixmaps(也有一个特殊的扩展名,它也可以将窗口移出屏幕)。

然而,所有这些 Drawable 只是 内存。从技术上讲,这些是画布上的东西。这被称为“图形原语”。 X11本身提供了一定的集合,命名为X core。还有一个名为 XRender 的事实上的标准扩展,它提供了 X 核心中没有的原语。然而,X11 核心和 XRender 都没有提供可以生成 3D 绘图印象的图形基元。所以还有另一个扩展,称为 GLX,它向 X11 服务器传授另一组图形基元,即 OpenGL 的形式。

然而,X core、XRender 和 GLX/OpenGL 都是不同的笔、画笔和铅笔,它们都在同一种 Canvas 上运行,即由 X11 管理的简单帧缓冲区。

那么 Qt 或 GTK+ 之类的工具包又是什么呢?嗯,他们使用 X11 和它提供的图形基元来实际绘制小部件,例如按钮、菜单和类似的东西,而 X11 不知道这些。

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 2014-06-28
    • 2019-08-11
    • 2014-08-02
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多