GTK +和OpenGL库如何在单个X服务器上协作?

Krz*_*icz 1 gtk opengl user-interface

图形用户界面隐藏着神秘的机制.它在单个屏幕上混合2D和3D上下文,并允许这两个不同的世界的无缝组合.但是它们以什么方式和在哪个级别实际交错?

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

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

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

dat*_*olf 6

你在想太多,太复杂了.像GTK +或Qt这样的工具包在某些方面增加了一层抽象,实际上相当简单:你的系统的图形设备包含一个处理器和一些可以操作的内存.在最简单的情况下,处理器是常规系统CPU,内存是正常的系统内存.然而,现代计算机具有专用图形处理器(GPU),它具有自己的高带宽内存.

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

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

然而,所有那些Drawable只是记忆.从技术上讲,那些是Canvas可以借鉴的东西.这个东西叫做"图形基元".X11本身提供了一个特定的集合,名为X core.还有一个事实上的标准扩展名为XRender,它提供了X核心中没有的原语.然而,X11核心和XRender都不提供可以生成3D绘图印象的图形基元.所以还有另一个名为GLX的扩展,它向X11服务器传授另一组图形基元,即以OpenGL的形式.

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

那么像Qt或GTK +这样的工具包呢?好吧,他们使用X11和它提供的图形基元实际绘制小部件,如按钮,菜单和类似的东西,X11不知道.