Vulkan Cookbook 第二章 2 创建表示表面

创建表示表面

译者注:示例代码点击此处

演示表面表示应用程序的窗口。 它允许我们获取窗口的参数,例如尺寸,支持的颜色格式,所需的图像数量或演示模式。 它还允许我们检查给定的物理设备是否能够在给定窗口中显示图像。
这就是为什么,在我们想要在屏幕上显示图像的情况下,我们需要首先创建一个表面,因为它将帮助我们选择适合我们需求的物理设备。

做好准备

要创建表示表面,我们需要提供应用程序窗口的参数。 为此,必须已经创建了窗口。 在本文中,我们将通过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.获取名为instanceVkInstance类型变量,其中储存了创建的Vulkan实例的句柄。
2.准备一个名为window_parametersWindowParameters类型的变量。为其成员分配以下值:
    1.HWnd为调用CreateWindow()返回的值。
    2.HInstance为调用GetModuleHandle(nullptr)返回的值。
3.准备一个名为VkWin32SurfaceCreateInfoKHRsurface_create_inf类型变量并初始化其成员:
    1.sTypeVK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR
    2.pNextnullptr
    3.flags0
    4.hinstancewindow_parameters.HInstance
    5.hwndwindow_parameters.HWnd
4.创建一个名为presentation_surfaceVkSurfaceKHR类型变量并将其设为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.获取名为instanceVkInstance类型变量,其中储存了创建的Vulkan实例的句柄。
2.准备一个名为window_parametersWindowParameters类型的变量。为其成员分配以下值:
    1.Dpy为调用XOpenDisplay()返回的值。
    2.Window为调用XCreateSimpleWindow()或者XCreateWindow()返回的值。
3.准备一个名为VkXlibSurfaceCreateInfoKHRsurface_create_inf类型变量并初始化其成员:
    1.sTypeVK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR
    2.pNextnullptr
    3.flags0
    4.dpywindow_parameters.Dpy
    5.windowwindow_parameters.Window
4.创建一个名为presentation_surfaceVkSurfaceKHR类型变量并将其设为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.获取名为instanceVkInstance类型变量,其中储存了创建的Vulkan实例的句柄。
2.准备一个名为window_parametersWindowParameters类型的变量。为其成员分配以下值:
    1.Connection为调用xcb_connect()返回的值。
    2.Window为调用xcb_generate_id()返回的值。
3.准备一个名为VkXcbSurfaceCreateInfoKHRsurface_create_inf类型变量并初始化其成员:
    1.sTypeVK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR
    2.pNextnullptr
    3.flags0
    4.connectionwindow_parameters.Connection 。
    5.windowwindow_parameters.Window
4.创建一个名为presentation_surfaceVkSurfaceKHR类型变量并将其设为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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值