创建表示表面
译者注:示例代码点击此处
演示表面表示应用程序的窗口。 它允许我们获取窗口的参数,例如尺寸,支持的颜色格式,所需的图像数量或演示模式。 它还允许我们检查给定的物理设备是否能够在给定窗口中显示图像。
这就是为什么,在我们想要在屏幕上显示图像的情况下,我们需要首先创建一个表面,因为它将帮助我们选择适合我们需求的物理设备。
做好准备
要创建表示表面,我们需要提供应用程序窗口的参数。 为此,必须已经创建了窗口。 在本文中,我们将通过WindowParameters类型的结构提供其参数。 它的定义如下:
struct WindowParameters {
#ifdef VK_USE_PLATFORM_WIN32_KHR
HINSTANCE HInstance;
HWND HWnd;
#elif defined VK_USE_PLATFORM_XLIB_KHR
Display * Dpy;
Window Window;
#elif defined VK_USE_PLATFORM_XCB_KHR
xcb_connection_t * Connection;
xcb_window_t Window;
#endif
};
在Windows上,该结构包含以下参数:
一个名为HInstance的HINSTANCE类型的变量,我们在其中存储调用GetModuleHandle()函数获取的值。
HWND类型的变量,名为HWnd,我们在其中存储CreateWindow()函数的返回值。
在具有X11窗口系统和XLIB接口的Linux上,该结构包含以下成员:
一个名为Dpy的Display *类型的变量,其中存储了调用XOpenDisplay()函数函数获取的值。
Window的类型的变量我们在其中储存了一个由XCreateWindow()或XCreateSimpleWindow()函数返回的值。
在具有X11窗口系统和XCB接口的Linux上,WindowParameters结构包含以下成员:
一个名为Connection的xcb_connection_t *类型的变量,其中我们存储xcb_connect ()函数返回的值。
一个名为Window的xcb_window_t类型的变量,其中存储了xcb_generate_id()函数返回的值。
怎么做...
在Windows操作系统系上,执行以下步骤:
1.获取名为instance的VkInstance类型变量,其中储存了创建的Vulkan实例的句柄。
2.准备一个名为window_parameters的WindowParameters类型的变量。为其成员分配以下值:
1.HWnd为调用CreateWindow()返回的值。
2.HInstance为调用GetModuleHandle(nullptr)返回的值。
3.准备一个名为VkWin32SurfaceCreateInfoKHR的surface_create_inf类型变量并初始化其成员:
1.sType为VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR。
2.pNext为nullptr。
3.flags为0。
4.hinstance为window_parameters.HInstance。
5.hwnd为window_parameters.HWnd。
4.创建一个名为presentation_surface的VkSurfaceKHR类型变量并将其设为VK_NULL_HANDLE。
5.调用CallvkCreateWin32SurfaceKHR(instance, &surface_create_info, nullptr, &presentation_surface)。第一个参数传入创建的instance,第二份参数指向surface_create_info,第三个参数为nullptr,以及最后一个参数指向presentation_surface变量。
6.通过检查CallvkCreateWin32SurfaceKHR()函数返回值是否等于VK_SUCCESS并且presentation_surface的值不等于VK_NULL_HANDLE,确保函数调用成功。
在具有X11窗口系统和XLIB接口的Linux操作系统上,执行以下步骤:
1.获取名为instance的VkInstance类型变量,其中储存了创建的Vulkan实例的句柄。
2.准备一个名为window_parameters的WindowParameters类型的变量。为其成员分配以下值:
1.Dpy为调用XOpenDisplay()返回的值。
2.Window为调用XCreateSimpleWindow()或者XCreateWindow()返回的值。
3.准备一个名为VkXlibSurfaceCreateInfoKHR的surface_create_inf类型变量并初始化其成员:
1.sType为VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR。
2.pNext为nullptr。
3.flags为0。
4.dpy为window_parameters.Dpy。
5.window为window_parameters.Window。
4.创建一个名为presentation_surface的VkSurfaceKHR类型变量并将其设为VK_NULL_HANDLE。
5.调用vkCreateXlibSurfaceKHR(instance, &surface_create_info, nullptr, &presentation_surface)。第一个参数传入创建的instance,第二份参数指向surface_create_info,第三个参数为nullptr,以及最后一个参数指向presentation_surface变量。
6.通过检查vkCreateXlibSurfaceKHR()函数返回值是否等于VK_SUCCESS并且presentation_surface的值不等于VK_NULL_HANDLE,确保函数调用成功。
在具有X11窗口系统和XCB接口的Linux操作系统上,执行以下步骤
1.获取名为instance的VkInstance类型变量,其中储存了创建的Vulkan实例的句柄。
2.准备一个名为window_parameters的WindowParameters类型的变量。为其成员分配以下值:
1.Connection为调用xcb_connect()返回的值。
2.Window为调用xcb_generate_id()返回的值。
3.准备一个名为VkXcbSurfaceCreateInfoKHR的surface_create_inf类型变量并初始化其成员:
1.sType为VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR。
2.pNext为nullptr。
3.flags为0。
4.connection为window_parameters.Connection 。
5.window为window_parameters.Window。
4.创建一个名为presentation_surface的VkSurfaceKHR类型变量并将其设为VK_NULL_HANDLE。
5.调用CallvkCreateXcbSurfaceKHR(instance, &surface_create_info, nullptr, &presentation_surface)。第一个参数传入创建的instance,第二份参数指向surface_create_info,第三个参数为nullptr,以及最后一个参数指向presentation_surface变量。
6.通过检查CallvkCreateXcbSurfaceKHR()函数返回值是否等于VK_SUCCESS并且presentation_surface的值不等于VK_NULL_HANDLE,确保函数调用成功。
这个怎么运作...
表示表面创建在很大程度上取决于给定操作系统的参数。 在每个操作系统上,我们需要创建一个不同类型的变量并调用不同的函数。 这是在Windows上创建表示表面的代码:
#ifdef VK_USE_PLATFORM_WIN32_KHR
VkWin32SurfaceCreateInfoKHR surface_create_info = {
VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
nullptr,
0,
window_parameters.HInstance,
window_parameters.HWnd
};
VkResult result = vkCreateWin32SurfaceKHR( instance, &surface_create_info, nullptr, &presentation_surface );
当我们使用X11窗口系统时,以下是在Linux操作系统上执行相同操作的一部分代码:
#elif defined VK_USE_PLATFORM_XLIB_KHR
VkXlibSurfaceCreateInfoKHR surface_create_info = {
VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR,
nullptr,
0,
window_parameters.Dpy,
window_parameters.Window
};
VkResult result = vkCreateXlibSurfaceKHR( instance, &surface_create_info, nullptr, &presentation_surface );
最后是在Linux的XCB窗口系统上:
#elif defined VK_USE_PLATFORM_XCB_KHR
VkXcbSurfaceCreateInfoKHR surface_create_info = {
VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
nullptr,
0,
window_parameters.Connection,
window_parameters.Window
};
VkResult result = vkCreateXcbSurfaceKHR( instance, &surface_create_info, nullptr, &presentation_surface ); #endif
前面的代码示例非常相似。 在每个中,我们创建一个结构类型的变量,其成员使用创建的窗口的参数进行初始化。 接下来我们调用一个vkCreate ??? SurfaceKHR()函数,该函数创建一个表示表面并将其句柄存储在presentation_surface变量中。 在这之后,我们应该检查一切是否按预期工作:
if( (VK_SUCCESS != result) || (VK_NULL_HANDLE == presentation_surface) ) {
std::cout << "Could not create presentation surface." << std::endl;
return false;
}
return true;