【发布时间】:2018-07-27 12:57:14
【问题描述】:
我正在使用 xcb 在 X11 下学习 OpenGL,我很难弄清楚视觉效果和 fbconfigs 之间的区别(您在 glxinfo 中找到的那些)
据我所知,视觉是一组与深度缓冲区、模板缓冲区、帧缓冲区等相关的属性。fbconfigs 有什么区别,为什么一个比另一个更可取?
【问题讨论】:
我正在使用 xcb 在 X11 下学习 OpenGL,我很难弄清楚视觉效果和 fbconfigs 之间的区别(您在 glxinfo 中找到的那些)
据我所知,视觉是一组与深度缓冲区、模板缓冲区、帧缓冲区等相关的属性。fbconfigs 有什么区别,为什么一个比另一个更可取?
【问题讨论】:
在 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 是如何成为 Xlib 的一部分并且可以在其文档和头文件中找到的呢?据我所知,XVisualInfo 是“不透明”(即实现定义)Visual 结构之外的客户端包装器。跟OpenGL关系不大,可以独立使用,在普通的Xlib代码中即可。
XVisualInfo 结构中看不到任何此类内容。它在Visual 周围添加的唯一字段是:colormap_size、bits_per_rgb、red_mask、green_mask、blue_mask、class、depth 和 screen。处理将像素划分为单独的 RGB 分量和颜色映射的事情。没有关于双缓冲或任何其他非颜色缓冲区的内容。这些东西是FBConfig 的一部分,它是Visuals 的实际 扩展。
XVisualInfo 定义在 X11/Xutil.h 中,它与 OpenGL 或 GLX 无关,它在 GLX 之前就存在,因此它不能与双缓冲、立体声或辅助缓冲器。它只处理 X Visuals。 GLX 将其GLXFBConfig 结构与支持 OpenGL 渲染的视觉对象相关联,但将它们与XVisualInfo 分开。这就是为什么会有不支持 OpenGL 渲染的视觉对象。
视觉是 X11 本身的一个概念。它描述了颜色编码属性。一个特定的 X11 服务器提供一组不同的视觉效果,并且 X11 客户端(图形应用程序)可能会选择最适合其用例的一个。每个 X11 窗口都是针对一个视觉对象创建的。详情请见the documentation about X11 visual types。
在带有 glX 扩展的 X11 服务器上,有几个这样的视觉效果通过 OpenGL 提供硬件加速渲染。在创建将用于 GL 渲染的 X11 窗口之前,您需要查询合适的视觉对象。在传统的 glX 中,您可以使用例如 glXChooseVisual 来执行此操作。
另一方面,GLXFBConfig 是一个仅与 GLX 本身相关的实体,经典的 X 服务器对此一无所知。 GLXFBconfigs 可用于创建称为P-Buffers 的屏幕外渲染缓冲区(不过现在已经过时了)。
可以将 FBConfig 分为两组:
glXGetVisualFromFBConfig 进行查询。FBConfigs 通过glxChooseFBConfig 提供了一个更新和更灵活的界面,因此最好始终使用 FBConfig API,即使您想要一个离屏窗口。
典型的 GL 实现会为它支持的每种视觉类型提供一个 FBconfig,因此您应该在 glxinfo 输出中找到两次:作为实际视觉效果,以及或多或少相同的 fbconfigs。此外,它将提供更多 fbconfigs 格式,这些格式对于 X11 窗口来说是非典型的(例如超过 32 位颜色深度)。
【讨论】: