GLX visual和FBconfig有什么区别?

时间:2018-07-27 12:57:14

标签: linux opengl x11

我正在使用xcb在X11下学习OpenGL,并且很难弄清视觉效果与fbconfig(在glxinfo中发现的视觉效果)之间的区别

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

2 个答案:

答案 0 :(得分:3)

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

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

1998年,GLX 1.3规范(在Khronos page找到)添加了更多功能,尤其是GLXPbuffer用于屏幕外渲染,但比GLXPixmap更容易。还增加了透明度,多重采样和采样缓冲区。 GLXDrawable(Window或GLXPixmap,或者现在还有GLXWindow和GLXPbuffer)的配置与Visual功能完全不同,因此引入了GLXFBConfig

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

请注意,渲染到GLXPbuffer不会使用X Visual。还请注意,由于OGL 3.0起使用Framebuffer objects,因此已不再使用GLXPbuffer。

答案 1 :(得分:2)

visual 是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. GLXFBConfig,可用于创建X11窗口。在这种情况下,FBConfig引用了一些X11视觉ID,您可以使用glXGetVisualFromFBConfig进行查询。
  2. GLXFBConfig,仅可用于屏幕外渲染。没有相关的视觉ID,因此您不能使用它们来创建X11窗口。

FBConfig通过glxChooseFBConfig提供了一个更新且更灵活的界面,因此,即使您希望使用屏幕外的窗口,也最好使用FBConfig API。

典型的GL实现所要做的就是为其支持的每种视觉类型提供一个FBconfig,因此您应该在glxinfo输出中找到两次:作为实际视觉,或多或少相同的fbconfig 。此外,它将提供更多的fbconfig,其格式对于X11窗口来说是不典型的(例如超过32位的色彩深度)。