Vulkan选择交换链图像的格式

选择交换链图像的格式
交换图像的格式定义了颜色组件的数量、每个颜色组件位的数量和使用的数据类型。在创建交换链的过程中,必须设定是否使用带或不带alpha组件的红色、绿色和蓝色通道、是否使用无符号整型或浮点型数据类型值为颜色值编码,以及这些数值的精度,还必须设定是否使用线性或非线性颜色空间为颜色值编码。但就像使用其他交换链参数一样,我们只能使用得到显示曲面支持的值。

准备工作
本节将使用几个含义非常相似的术语,但实际上它们定义了不同的参数。
● 图像格式用于描述组件数量、精度和图像像素的数据类型,它由VkFormat类型的变量代表。
● 颜色空间定义了硬件解析颜色组件值的方式,以及是否使用线性或非线性函数对颜色组件值进行编码和解码。颜色空间由VkColorSpaceKHR类型的变量代表。
● 曲面格式是一个图像格式-颜色空间对,由VkSurfaceFormatKHR类型的变量代表。
具体处理过程
(1)使用vkEnumeratePhysicalDevices()函数获取物理设备的句柄,将该句柄存储在一个类型为VkPhysicalDevice、名为physical_device的变量中。
(2)获取已创建显示曲面的句柄,将该句柄存储在一个类型为VkSurfaceKHR、名为presentation_surface的变量中。
(3)选择想要使用的图像格式和颜色空间,将这些数据存储到类型为VkSurfaceFormatKHR、名为desired_surface_format的变量中。
(4)创建一个uint32_t类型的变量,将其命名为formats_count。
(5)调用vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device,presentation_surface,&formats_count,nullptr)函数。将第一个参数设置为物理设备的句柄;将第二个参数设置为显示曲面的句柄;将第三个参数设置为指向formats_count变量的指针;将第四个参数设置为nullptr。
(6)如果该函数调用操作成功完成,formats_count变量就会含有指定硬件设备支持的所有图像格式-颜色空间对的总数。
(7)创建一个std::vector<VkSurfaceFormatKHR>类型的变量,将其命名为surface_formats。调整这个vector容器的尺寸,使之能够存储的元素数量不小于formats_count变量的值。
(8)调用vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device,presentation_surface,&formats_count,&surface_formats[0])函数。将前三个参数设置为与上次调用操作的前三个参数相同,将最后一个参数设置为指向vector容器surface_formats中第一个元素的指针。
(9)如果该函数调用操作成功完成,所有可用的图像格式-颜色空间对就都会存储到surface_formats变量中。
(10)创建一个VkFormat类型的变量,将其命名为image_format;创建一个VkColorSpaceKHR类型的变量,将其命名为image_color_space。这两个变量分别用于存储在创建交换链过程中使用的格式和颜色空间值。
(11)查明vector容器surface_formats中元素的数量。如果该vector容器仅含有值为VK_FORMAT_UNDEFINED的唯一一个元素,就意味着我们可以任意选择曲面格式。将desired_surface_format变量中各个成员的值,赋予image_format和image_color_space变量。
(12)如果vector容器surface_formats中含有更多元素,那么应循环该vector容器中变量的每个元素,并将其中的format和colorSpace成员值与desired_surface_format变量中的format和colorSpace成员值进行比较。如果某个元素中的format和colorSpace成员值与desired_surface_format变量中的format和colorSpace成员值相同,就意味着我们想要使用的曲面格式得到了支持,可以在创建交换链时使用该格式。将desired_surface_format变量中的各个成员的值,赋予image_format和image_color_space变量。
(13)如果没有找到format和colorSpace成员值与desired_surface_format变量中的format和colorSpace成员值相同的元素,就应该循环遍历vector容器surface_formats中的所有元素。查明该vector容器中是否含有format成员值与已经选中的surface_format.format成员值相等的元素。如果找到了这样的元素,就将desired_surface_format.format成员的值赋予image_format变量,但应获取vector容器surface_formats当前元素中colorSpace成员的值,并将该值赋予image_color_space变量。
(14)如果surface_formats变量中没有带选中图像格式的元素,则应获取该vector容器中的第一个元素,并将该元素中format和colorSpace成员的值,分别赋予image_format和image_color_space变量。

具体运行情况
要获取指定硬件设备支持曲面格式的名单,需要两次调用vkGetPhysicalDeviceSurface FormatsKHR()函数,第一次调用操作用于获取得到支持图像格式-颜色空间对的总数。

Vulkan选择交换链图像的格式
根据该数量准备存储空间,并通过执行第二次调用操作获取这个名单。

Vulkan选择交换链图像的格式
现在,可以在所有得到支持的曲面格式中选择最符合我们需求的一个。如果函数调用操作仅返回了一个曲面格式,并且该曲面格式的值为VK_FORMAT_UNDEFINED,就意味着在图像格式-颜色空间对上没有限制。在这种情况下,我们可以选择任何曲面格式并在创建交换链的过程中使用该曲面格式。

Vulkan选择交换链图像的格式
如果调用vkGetPhysicalDeviceSurfaceFormatsKHR()函数的操作返回了多个元素,就需要在这些元素中选择一个。首先应查明选中的曲面格式是否得到全面支持,即选中的图像格式-颜色空间对都可用。

Vulkan选择交换链图像的格式
如果没有图像格式和颜色空间都可用的元素,则可寻找图像格式得到支持但使用了其他颜色空间的元素。不能在选定得到支持的图像格式后,随意选择得到支持的颜色空间,必须选用与指定图像格式对应的颜色空间。

Vulkan选择交换链图像的格式
最后,如果我们想要使用的图像格式没有得到支持,则只需要使用第一个可用的图像格式和颜色空间对。

Vulkan选择交换链图像的格式

酷客网相关文章:

赞(44)

评论 抢沙发

评论前必须登录!

 

Vulkan实战