选择交换链图像的大小
译者注:示例代码点击此处
通常,为交换链创建的图像应该适合应用程序的窗口。 支持的尺寸应该可在呈现表面的功能中使用。 但在某些操作系统上,图像的大小定义了窗口的最终大小。 我们还应该牢记这一点,并检查交换链图像的适当尺寸。
怎么做...
1.获取呈现表面的功能(请参阅获得呈现表面的功能)。将他们储存在名为surface_capabilities的VkSurfaceCapabilitiesKHR类型变量中。
2.创建一个名为size_of_images的VkExtent2D的类型的变量,我们将在其中储存所需交换链图片的大小。
3.检查surface_capabilities变量的currentExtent.width成员是否等于0xFFFFFFFF(-1转换为uint32_t类型的无符号值)。如果是,则表示图像的大小决定了窗口的大小。在这种情况下:
·为size_of_images变量的width和height成员分配所需的值。
·将size_of_images变量的width变量的值限制为surface_capabilities.minImageExtent.width和surface_capabilities.maxImageExtent.width定义的范围。
·将size_of_images变量的height变量的值限制为surface_capabilities.minImageExtent.height和surface_capabilities.maxImageExtent.height定义的范围。
4.如果surface_capabilities变量的currentExtent.width成员变量的值不等于0xFFFFFFFF,则在size_of_images变量中储存surface_capabilities.currentExtent的值。
译者注:currentExtent.width != 0xFFFFFFFF 的情况下我们可以在一定范围内设置图像大小,因为窗口会跟着我们的图像大小改变,反之图像大小应该跟着窗口变(也许并不需要跟着窗口改变大小,比如可能可以在一个窗口中同时渲染多个不同大小的表面是否可以这样做要看了之后的章节才能得知)。
这个怎么运作...
交换链图像的大小必须符合支持的限制,这些是由表面功能决定的。在大多数典型情况下,我们希望渲染与应用程序窗口的用户区域具有相同尺寸的图像。此值在表面功能的currentExtent成员中指定。
但是有些操作系统的窗口大小由交换链图像大小决定。这种情况由表面功能的currentExtent.width或currentExtent.height成员的0xFFFFFFFF值指示。在这种情况下,我们可以定义图像大小,但它仍然必须在指定范围内:
if( 0xFFFFFFFF == surface_capabilities.currentExtent.width ) {
size_of_images = { 640, 480 };
if( size_of_images.width < surface_capabilities.minImageExtent.width ) {
size_of_images.width = surface_capabilities.minImageExtent.width;
} else if( size_of_images.width > surface_capabilities.maxImageExtent.width ) {
size_of_images.width = surface_capabilities.maxImageExtent.width;
}
if( size_of_images.height < surface_capabilities.minImageExtent.height ) {
size_of_images.height = surface_capabilities.minImageExtent.height;
} else if( size_of_images.height > surface_capabilities.maxImageExtent.height ) {
size_of_images.height = surface_capabilities.maxImageExtent.height;
}
} else {
size_of_images = surface_capabilities.currentExtent;
}
return true;