【问题标题】:What's the difference between a GLX visual and a FBconfig?GLX 视觉对象和 FBconfig 之间有什么区别?
【发布时间】:2018-07-27 12:57:14
【问题描述】:

我正在使用 xcb 在 X11 下学习 OpenGL,我很难弄清楚视觉效果和 fbconfigs 之间的区别(您在 glxinfo 中找到的那些)

据我所知,视觉是一组与深度缓冲区、模板缓冲区、帧缓冲区等相关的属性。fbconfigs 有什么区别,为什么一个比另一个更可取?

【问题讨论】:

    标签: linux opengl x11


    【解决方案1】:

    X 窗口系统 中,Visual 封装了 Display 的颜色映射(颜色类型、颜色深度)。同一个显示器可以配置不同的视觉效果。

    当 OpenGL 诞生时,大约在 X System 之后十年,在 OGL 部分而不是在 X System 中创建了一个结构 XVisualInfo。这种新结构通过添加更多功能(例如辅助缓冲区、双缓冲区和立体声)扩展了Visual 类型。这个XVisualInfo 用于创建 gl-context。

    1998 年的 GLX 1.3 规范(在 Khronos page 找到它)添加了更多功能,特别是用于离屏渲染的 GLXPbuffer,但比 GLXPixmap 更容易。还添加了透明度、多重采样和采样缓冲区。 GLXDrawable(Window 或 GLXPixmap,或者现在还有 GLXWindow 和 GLXPbuffer)的配置与 Visual 能力相差太大,因此引入了 GLXFBConfig

    当前的 GLX 1.4 规范允许出于向后兼容性的原因以及如果您不使用 GLX>1.2 功能,则可以使用 XVisualInfo。但是创建上下文的首选方式是 GLXFBConfig。

    请注意,渲染到 GLXPbuffer 不使用 X Visual。另请注意,从 OGL 3.0 开始使用 Framebuffer objects 会使 GLXPbuffer 的使用过时。

    【讨论】:

    • 你写了“一个结构 XVisualInfo 是在 OGL 部分中创建的,而不是在 X 系统中”。那么XVisualInfo 是如何成为 Xlib 的一部分并且可以在其文档和头文件中找到的呢?据我所知,XVisualInfo 是“不透明”(即实现定义)Visual 结构之外的客户端包装器。跟OpenGL关系不大,可以独立使用,在普通的Xlib代码中即可。
    • 您还写道“这种新结构通过添加更多功能扩展了 Visual 类型,例如辅助缓冲区、双缓冲区和立体声。”我在XVisualInfo 结构中看不到任何此类内容。它在Visual 周围添加的唯一字段是:colormap_sizebits_per_rgbred_maskgreen_maskblue_maskclassdepthscreen。处理将像素划分为单独的 RGB 分量和颜色映射的事情。没有关于双缓冲或任何其他非颜色缓冲区的内容。这些东西是FBConfig 的一部分,它是Visuals 的实际 扩展。
    • @SasQ OpenGL 在 Linux 中是 X 窗口系统的扩展。这个“扩展”就是我所说的“OGL 部分”,并被命名为“GLX”。阅读GLX 1.2 spec 的前两页。以及图 1 看看 Xlib 在 OGL 部分的表现如何。
    • 我非常了解 GLX,这让我对你写的内容产生怀疑,因为根据规格,它不含水。 OpenGL 不是“X 窗口系统的扩展”——它是一个独立于平台的 API 规范,在不同的平台上有不同的实现。在 Linux 上,GLX 扩展了 X 协议以引入对 OpenGL 的支持,但是,这些 GL 调用的实际实现通常是一个单独的库,而不是 Xlib 提供的(您链接到 -lGL,不是吗?)。例如,它可能是 MESA 或来自 nVidia 或 ATI 的某些设备驱动程序。
    • 不过,这与我之前的反对意见无关。 XVisualInfo 定义在 X11/Xutil.h 中,它与 OpenGL 或 GLX 无关,它在 GLX 之前就存在,因此它不能与双缓冲、立体声或辅助缓冲器。它只处理 X Visuals。 GLX 将其GLXFBConfig 结构与支持 OpenGL 渲染的视觉对象相关联,但将它们与XVisualInfo 分开。这就是为什么会有支持 OpenGL 渲染的视觉对象。
    【解决方案2】:

    视觉是 X11 本身的一个概念。它描述了颜色编码属性。一个特定的 X11 服务器提供一组不同的视觉效果,并且 X11 客户端(图形应用程序)可能会选择最适合其用例的一个。每个 X11 窗口都是针对一个视觉对象创建的。详情请见the documentation about X11 visual types

    在带有 glX 扩展的 X11 服务器上,有几个这样的视觉效果通过 OpenGL 提供硬件加速渲染。在创建将用于 GL 渲染的 X11 窗口之前,您需要查询合适的视觉对象。在传统的 glX 中,您可以使用例如 glXChooseVisual 来执行此操作。

    另一方面,GLXFBConfig 是一个仅与 GLX 本身相关的实体,经典的 X 服务器对此一无所知。 GLXFBconfigs 可用于创建称为P-Buffers 的屏幕外渲染缓冲区(不过现在已经过时了)。

    可以将 FBConfig 分为两组:

    1. 可用于创建 X11 窗口的 GLXFBConfigs。在这种情况下,FBConfig 引用了某个 X11 视觉 ID,您可以使用 glXGetVisualFromFBConfig 进行查询。
    2. 只能用于离屏渲染的 GLXFBConfigs。没有关联的视觉 ID,因此您不能使用它们来创建 X11 窗口。

    FBConfigs 通过glxChooseFBConfig 提供了一个更新和更灵活的界面,因此最好始终使用 FBConfig API,即使您想要一个离屏窗口。

    典型的 GL 实现会为它支持的每种视觉类型提供一个 FBconfig,因此您应该在 glxinfo 输出中找到两次:作为实际视觉效果,以及或多或少相同的 fbconfigs。此外,它将提供更多 fbconfigs 格式,这些格式对于 X11 窗口来说是非典型的(例如超过 32 位颜色深度)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多