type
status
date
slug
summary
tags
icon
password

窗口表面(window surface)

一、 为什么要创建window surface

由于Vulkan是个平台无关的API,因此它不能直接与实际设备上的Window system直接交互。为了建议Vulkan和Window system之间的连接让Image呈现在屏幕上,我们需要使用WSI(Window System Integration拓展)。我们第一个要讨论的东西是VK_KHR_surface拓展。它暴露了VkSurfaceKHR对象,可以用来表示一个用于呈现Image的Surafece抽象。在我们的程序中,该Surface将会通过已经创建好的GLFW窗口支持。

二、 创建window surface(在initVulkan函数中在Vulkan实例创建和setupDebugCallback调用之后调用它)

尽管VkSurfaceKHR对象是平台无关的,但它的创建依赖窗口系统。比如,在Windows系统上,它的创建需要HWND和HMODULE。存在一个叫做VK_KHR_win32_surface的Windows平台特有扩展,用于处理与Windows系统窗口交互有关的问题,这一扩展也被包含在了glfwGetRequiredInstanceExtensions函数获取的扩展列表中。
我们需要填写VkWin32SurfaceCreateInfoKHR结构体来完成VkSurfaceKHR对象的创建。这一结构体包含了两个非常重要的成员:hwnd和hinstance。它们分别对应Windows系统的窗口句柄和进程实例句柄:
glfw提供了一个兼容多平台的创建函数glfwCreateWindowSurface帮我们处理好了平台问题,因此我们可以通过它继续写平台无关的代码。

三、创建surface的QueueFamily

交换链(swap chain)

一、 什么是交换链?

Vulkan并不拥有“默认Framebuffer”的概念,因此它需要一个基础概念来持有一些buffers,这些buffers用来在呈现到屏幕之前存储我们的渲染结果。这个基础概念叫做交换链Swap chain。它必须在Vulkan中被显式创建,Swap chain实际上是一个Images的队列,这些Images就是等待被呈现到屏幕上的Images。我们的应用需要这样一张Image用来绘制,绘制完之后返回给Images队列。这个Images队列如何工作和其中images呈现到屏幕上的条件取决于Swap chain如何被设置,通常Swap chain的一大作用是将Images的呈现频率和屏幕刷新率同步。

二、 检查当前的物理设备是否支持交换链VK_KHR_SWAPCHAIN_EXTENSION_NAME

不是所有的显卡都支持直接将Images呈现到屏幕上,例如为服务器设计的没有显示输出的显卡。另外,因为Images presentation和window system、surfaces紧密关联,它并不属于Vulkan core的一部分。我们必须在查询交换链支持后开启VK_KHR_swapchain这一device extension。
首先在isDeviceSuitable函数中检查是否支持Vk_KHR_swapchain这一device extension。通过VK_KHR_SWAPCHAIN_EXTENSION_NAME宏代替VK_KHR_swapchain,该宏会帮我们检查拼写错误。

三、 再检查交换链支持的细节(这里的细节指的是与window system)

我们需要检查最基础的三种属性: 1. Basic surface capabilities(swap chain中images的最小最大数量,images的最小最大长宽)。 2. Surface formats(像素格式,颜色空间)。 3. Available presentation modes(可用的呈现模式)。

四、 寻找swap chain中最佳的一套设置

主要由以下三个条件作为判断标准:
  1. Surface format(颜色、深度)
  1. Presentation mode(交换Images的模式)
  1. Swap extent(swap chain中images的分辨率)
对于这三个衡量指标,我们有一套理想值,如果达不到这些理想值,再寻找一些fallback。

1、 Surface format

这个参数弄的是图像的颜色和深度
每个VkSurfaceFormatKHR包含一个format和一个colorSpaceformat确定了颜色通道和类型,例如VK_FORMAT_B8G8R8A8_SRGB。colorspace表示SRGB颜色空间是否支持
对于颜色空间,如果SRGB可用我们就使用SRGB,因为它更符合人的感知。它也几乎是大部分Images的标准颜色空间,比如Textures。因此,我们也需要使用支持SRGB的Surface format,最常见的是VK_FORMAT_B8G8R8A8_SRGB

2、 Presentation mode

代表了实际展现Images到屏幕的条件。Vulkan下有4种模式
  1. VK_PRESENT_MODE_IMMEDIATE_KHR:应用提交的Images会被立刻传输到屏幕,可能会造成撕裂。
  1. VK_PRESENT_MODE_FIFO_KHR:swap chain是一个先进先出的Images队列,每当屏幕刷新,从队头取出一张Images;应用每渲染完一张Images,将其插入到队尾。它与现代游戏中的垂直同步类似。显示刷新的瞬间称为垂直空白“Vertical blank”
  1. VK_PRESENT_MODE_FIFO_RELAXED_KHR:这个模式和上一个模式只有一个不同点,如果应用延迟了,在最后一次Vertical blank时队列为空时,在下一张Image进队时会立刻把它传输到屏幕而不是等待下一个Verticle blank,可能会造成画面撕裂。
  1. VK_PRESENT_MODE_MAILBOX_KHR:这是第二个模式的一个变体。当队列已满时,在下一个Images到达时,会立刻出队将新的Image传输到屏幕上。这个模式可以用于尽快渲染画面,同时避免画面撕裂,比起垂直同步会有更少的延迟问题。它通常被叫做"三重缓冲Triple buffering",但三重缓冲也并不意味着帧率不被锁定。

3、 Swap extent

Swap extent决定了swap chain的images的分辨率,它大部分情况来说都等于window的分辨率(以pixel为单位)。我们可以通过VkSurfaceCapabilitiesKHR结构体来得到可用的分辨率范围,并且可以从它的currentExtent成员得到目前Vulkan自动匹配的分辨率。那我们要选择的分辨率一定是优先匹配window分辨率

五、 创建交换链

创建swap chain的过程中,我们需要指定其中image的数量,我们使用最小数量+1以确保一定的并行度。创建Swap chain的过程和创建其他Vulkan object类似,需要填充一个庞大的createInfo。在其中我们还需要填写swapchain的imageArrayLayers,它用于确定每张Image组成layer的数量,非3D情况下应该一直为1。imageUsage用于确定swap chain的使用目的,直接在swap chain提供的image上进行渲染,因此使用VK_IMAGE_USAGE_TRANSFER_DST_BIT。如果我们希望渲染在单独的一张image来执行一些后处理,那我们会选择将swap chain的imageUsage设置为VK_IMAGE_USAGE_TRANSFER_DST_BIT,并且使用内存操作来将渲染完的image传输到swap chain image上。
我们还需要确定swap chain在多Queue families情况下的工作模式,一共有两种模式:
  1. VK_SHARING_MODE_EXCLUSIVE:一个Image同一时间只属于一个Queue family,在其他queue family使用前,拥有权需要显式转移,该模式性能最佳。
  1. VK_SHARING_MODE_CONCURRENT:Images可以被多queue families同时使用,不需要显式转移。
咱们在Graphics和Present的Queue family相同的情况下使用VK_SHARING_MODE_EXCLUSIVE,否则使用VK_SHARING_MODE_CONCURRENT。
另外我们还需要确定Swap chain中的image被应用的变换preTransform,我们使用默认值不对其变换(通常会有旋转90°或者水平翻转之类的)。
需要确定oldSwapchain。在Vulkan运行时,swap chain可能变得非法或者非最优,比如window被resize。在这种情况下,swap chain需要重建,并且我们需要在重建时明确老的swap chain的引用。

六、 将Image包装到VkImageView

为了在PipeLine中使用任何VkImage,包括Swap Chain中的那些Image,我们必须创建一个VkImageView对象。ImageView实际上是对图像的一种观察。它描述了如何访问图像以及访问图像的哪一部分,我们必须通过ImageView来能够读取Image。例如,如果它应该被当作一个没有任何mipmapping级别的2D纹理。
销毁ImageViews:
Pipeline物理设备逻辑设备队列
Loading...
JucanaYu
JucanaYu
干饭人,干饭魂🍚
最新发布
Python练习-类型转换
2025-4-9
Python练习-count、remove、append、extend
2025-4-8
Python练习-set和sorted
2025-4-6
Python练习-insert和del
2025-4-6
Python练习-range
2025-4-6
Python练习-双指针法
2025-4-6