繁体   English   中英

获取 Vulkan 的 XVisualInfo

[英]Get XVisualInfo for Vulkan

对于带有 Xlib 的 OpenGL,为了创建一个窗口,我们可以从 GLX 获取适当的XVisualInfo并将其传递给XCreateWindow 但是,如果我想将 Vulkan 与 Xlib 一起使用,我该如何获得正确的XVisualInfo 我还需要与 GLX 链接吗?

Vulkan 在这方面的做法有所不同。 首先,由于使用 OpenGL 的经验以及它与窗口系统交互的方式,选择了一种非常不同的方法。

传统上,使用 OpenGL,您可以根据某个可绘制对象的属性创建渲染上下文。 在 Microsoft 中,这与 windows 耦合得更紧密,因为视觉格式的选择是根据用于渲染上下文创建的设备上下文的可绘制(又名窗口)的像素格式进行的。 在 GLX 中,与可绘制对象没有紧密联系,但您仍然必须为要绘制的可绘制对象的视觉和帧缓冲区配置创建上下文匹配。

Vulkan 不是这样工作的!

首先,在 Vulkan 中不再有上下文。 你得到的是实例 并且对于每个实例,您都创建了物理和逻辑设备的句柄,然后您又为它们创建了要绘制的图像 所有这些都与窗口系统完全分离。 事实上,使用 Vulkan 进行无头渲染是微不足道的。

如果使用 OpenGL 进行无头渲染需要额外的努力,而使用 Vulkan 则相反:渲染到窗口需要额外的努力。

关键是所谓的“交换链”。 交换链是当今驱动程序和 GPU 架构用来管理图像到显示器的传递(双缓冲的缓冲区交换和您使用 OpenGL 调用的“SwapBuffers”就是这个名字)。 要创建交换链,您首先要在交换链的接收端为所需的可绘制对象获取 Vulkan 表面。 这些函数是 Vulkan 的窗口系统相关扩展的一部分; 它们是扩展,因此它们不会将 Vulkan 核心与窗口系统集成 (WSI) 相关的东西混淆。 对于 X11,您可以使用vkCreateXcbSurfaceKHRvkCreateXlibSurfaceKHR

创建表面后,您可以遍历其队列以查看它使用vkGetPhysicalDeviceSurfaceSupportKHR支持哪些操作,然后使用vkGetPhysicalDeviceSurfaceFormatsKHR可以使用哪些图像格式。 这一步是最接近查询Visual s 和FBConfig与创建 GLX 上下文相关的匹配,以回答您的问题。

一旦你决定了一种格式,你就创建了一个交换链,为此你必须再次做圆顶内务,即检查表面带来的功能(这里的功能是指它可以沿链传输数据的方法)。 其函数是vkGetPhysicalDeviceSurfaceCapabilitiesKHRvkGetPhysicalDeviceSurfacePresentModesKHR

有了到目前为止您获得的所有信息,您现在决定交换链的格式和配置,并使用vkCreateSwapchainKHR创建它。 完成后,您可以使用vkGetSwapchainImagesKHR获取交换链的图像。

现在您有了交换链的图像,您可以照常在它们上创建视图并将它们用作要渲染的附件。 恭喜你剃掉了那只 Vulkanic 牦牛*Phew*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM