创建显示曲面
当需要在屏幕上显示图像时,应先创建显示曲面。显示曲面代表应用程序的窗口,使用显示曲面可以获取应用程序窗口的参数,如尺寸、支持的颜色格式、必要的图像数量和显示模式。使用显示曲面还可以查明指定的物理设备是否能够在指定的窗口中显示图像。
显示曲面能够帮助我们选出符合需求的物理设备。
准备工作
要创建显示曲面,需要先获取应用程序窗口的参数。要做到这一点,该应用程序窗口必须已经创建好。本例将使用WindowParameters类型的结构存储应用程序窗口的参数。下面是该结构的定义。

在Windows中WindowParameters类型的结构含有下列参数:
● 类型为HINSTANCE、名为HInstance的变量,存储了通过调用GetModuleHandle()函数获得的值。
● 类型为HWND、名为HWnd的变量,存储了通过调用CreateWindow()函数获得的值。
在通过XLIB接口使用X11窗口系统的Linux操作系统中,该结构含有下列参数:
● 类型为Display*
、名为Dpy的变量,存储了通过调用XOpenDisplay()函数获得的值。
● 类型为Window、名为Window的变量,存储了通过调用XCreateWindow()或XCreateSimpleWindow()函数获得的值。
在通过XCB接口使用X11窗口系统的Linux操作系统中,WindowParameters结构含有下列参数:
● 类型为xcb_connection_t*
、名为Connection的变量,存储了通过调用xcb_connect()函数获得的值。
● 类型为xcb_window_t、名为Window的变量,存储了通过调用xcb_generate_id()函数获得的值。
具体处理过程
在Windows操作系统中执行下列操作。
(1)获取类型为VkInstance、名为instance的变量,该变量存储了Vulkan实例的句柄。
(2)创建一个WindowParameters类型的变量,将其命名为window_parameters。将下列值赋予该结构中的成员:
● 将通过调用CreateWindow()函数获得的值赋予HWnd。
● 将通过调用GetModuleHandle(nullptr)函数获得的值赋予HInstance。
(3)创建一个VkWin32SurfaceCreateInfoKHR类型的变量,将其命名为surface_create_info,并使用下列值初始化该结构中的各个成员:
● 将VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR常量赋予sType成员。
● 将nullptr赋予pNext成员。
● 将0赋予flags成员。
● 将window_parameters.HInstance成员的值赋予hinstance成员。
● 将window_parameters.HWnd成员的值赋予hwnd成员。
(4)创建一个VkSurfaceKHR类型的变量,将其命名为presentation_surface,并将VK_NULL_HANDLE常量赋予该变量。
(5)调用vkCreateWin32SurfaceKHR(instance,&surface_create_info,nullptr,&presentation_surface)函数。将第一个参数设置为已创建的Vulkan实例的句柄;将第二个参数设置为指向surface_create_info变量的指针;将第三个参数设置为nullptr;将第四个参数设置为指向presentation_surface变量的指针。
(6)通过查明调用vkCreateWin32SurfaceKHR()函数返回的值等于VK_SUCCESS,且presentation_surface变量的值不等于VK_NULL_HANDLE,确认该函数调用操作已成功完成。
在通过XLIB接口使用X11窗口系统的Linux操作系统中,执行下列步骤。
(1)获取类型为VkInstance、名为instance的变量,该变量存储了Vulkan实例的句柄。
(2)创建一个WindowParameters类型的变量,将其命名为window_parameters。将下列值赋予该结构中的成员:
● 将通过调用XOpenDisplay()函数获得的值赋予Dpy成员。
● 将通过调用XCreateSimpleWindow()或XCreateWindow()函数获得的值赋予Window成员。
(3)创建一个VkXlibSurfaceCreateInfoKHR类型的变量,将其命名为surface_create_info,并使用下列值初始化该结构中的成员:
● 将VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR常量赋予sType成员。
● 将nullptr赋予pNext成员。
● 将0赋予flags成员。
● 将window_parameters.Dpy成员的值赋予dpy成员。
● 将window_parameters.Window成员的值赋予window成员。
(4)创建一个VkSurfaceKHR类型的变量,将其命名为presentation_surface,并将VK_NULL_HANDLE常量赋予该变量。
(5)调用vkCreateXlibSurfaceKHR(instance,&surface_create_info,nullptr,&presentation_surface)
函数。将第一个参数设置为已创建的Vulkan实例的句柄;将第二个参数设置为指向surface_create_info变量的指针;将第三个参数设置为nullptr;将第四个参数设置为指向presentation_surface变量的指针。
(6)通过查明调用vkCreateXlibSurfaceKHR()函数返回的值等于VK_SUCCESS,且presentation_surface变量的值不等于VK_NULL_HANDLE,确认该函数调用操作已成功完成。
在通过XCB接口使用X11窗口系统的Linux操作系统中,执行下列步骤。
(1)获取类型为VkInstance、名为instance的变量,该变量存储了Vulkan实例的句柄。
(2)创建一个WindowParameters类型的变量,将其命名为window_parameters。将下列值赋予该结构中的成员:
● 将通过调用xcb_connect()函数获得的值赋予Connection成员。
● 将通过调用xcb_generate_id()函数获得的值赋予Window成员。
(3)创建一个VkXcbSurfaceCreateInfoKHR类型的变量,将其命名为surface_create_info,并使用下列值初始化该结构中的成员:
● 将VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR常量赋予sType成员。
● 将nullptr赋予pNext成员。
● 将0赋予flags成员。
● 将window_parameters.Connection成员的值赋予connection成员。
● 将window_parameters.Window成员的值赋予window成员。
(4)创建一个VkSurfaceKHR类型的变量,将其命名为presentation_surface,并将VK_NULL_HANDLE常量赋予该变量。
(5)调用vkCreateXcbSurfaceKHR(instance,&surface_create_info,nullptr,&presentation_surface)函数。将第一个参数设置为已创建的Vulkan实例的句柄;将第二个参数设置为指向surface_create_info变量的指针;将第三个参数设置为nullptr;将第四个参数设置为指向presentation_surface变量的指针。
(6)通过查明调用vkCreateXcbSurfaceKHR()函数返回的值等于VK_SUCCESS,且presentation_surface变量的值不等于VK_NULL_HANDLE,确认该函数调用操作已成功完成。
具体运行情况
创建显示曲面的过程会在很大程度上受到具体操作系统的专用参数影响。在不同种类的操作系统中,我们需要创建不同类型的变量和调用不同的函数。下面是在Windows中创建显示曲面的代码。

下面是在通过XLIB接口使用X11窗口系统的Linux操作系统中,创建显示曲面的代码。

下面是在通过XCB接口使用X11窗口系统的Linux操作系统中,创建显示曲面的代码。


上面的3段代码非常相似。每段代码都创建了一个结构类型的变量,该结构中的成员存储了用于创建窗口的参数。每段代码都调用了vkCreate???SurfaceKHR()函数,该函数用于创建显示曲面并将创建好的显示曲面的句柄存储在presentation_surface变量中。执行了上述操作后,我们应该检查所有操作是否都按预想的方式运行。

酷客网相关文章:
评论前必须登录!
注册