我正在使用xcb在X11下学习OpenGL,我很难搞清楚visuals和fbconfigs(你在glxinfo
中找到的那些)之间的区别
就我所见,视觉是一组与深度缓冲,模板缓冲,帧缓冲等相关的属性。与fbconfigs有什么不同,为什么一个优于另一个?
在X Window系统中,Visual封装了Display的颜色映射(颜色类型,颜色深度)。可以使用不同的Visuals配置相同的Display。
当OpenGL诞生时,在X System之后大约十年,在OGL部分创建了一个结构XVisualInfo
,而不是在X系统中。这种新结构通过添加更多功能扩展了Visual
类型,例如辅助缓冲区,双缓冲区和立体声。这个XVisualInfo
用于创建gl-context。
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。另请注意,使用Framebuffer objects,因为OGL 3.0使得过时使用GLXPbuffer。
视觉是X11本身的概念。它描述了颜色编码属性。一个特定的X11服务器我的晚餐有一组不同的视觉效果,而X11客户端(图形应用程序)可能会选择一个最适合它的用例。每个X11窗口都是针对一个视觉创建的。有关详细信息,请参阅the documentation about X11 visual types。
在具有glX扩展的X11服务器上,有一些这样的视觉效果,通过OpenGL提供硬件加速渲染。在创建要用于GL渲染的X11窗口之前,需要查询合适的视觉效果。在传统的glX中,你可以使用例如glXChooseVisual
来做到这一点。
另一方面,GLXFBConfig
是一个仅与GLX本身相关的实体,经典X服务器对此一无所知。 GLXFBconfigs可用于创建名为P-Buffers的屏幕外渲染缓冲区(尽管如此,它现在已经过时了)。
可以将FBConfigs分为两组:
glXGetVisualFromFBConfig
来查询。FBConfigs通过glxChooseFBConfig
提供更新,更灵活的界面,因此即使你想要一个离屏窗口,最好使用FBConfig API。
典型的GL实现将为它支持的每种可视类型提供FBconfig,因此您应该在glxinfo
输出中找到两次:作为实际视觉效果,以及或多或少相同的fbconfigs。此外,它还将提供更多fbconfig格式,这些格式对于X11窗口来说是不典型的(例如超过32位色深)。