当前位置: 首页 > article >正文

Vulkan 学习(9)---- vkSuraceKHR 创建

目录

        • OverView
        • 创建窗口表面
        • 参考代码

OverView

Vulkan Components

Vulkan 是一个平台无关的图形API,这意味着它不能直接与特定的窗口系统(WindowslinuxmacOS 的窗口系统)进行交互

为了解决这个问题,Vulkan 引入了窗口系统集成(Window System Intergration WSI)机制,使得 Vulkan 应用程序可以与不同操作系统的窗口系统(比如 WindowsWin32LinuxX11 或者 WaylandAndroidANativeWindow) 进行交互

这些机制运行Vulkan应用程序在窗口系统中创建和管理表面(Surface),并和图形硬件交换图像(Swapchain)

VK_KHR_surfaceWSI的核心扩展(instance 扩展),是 Vulkan 中用于渲染表面的对象,是一个平台无关的抽象类型,用于封装与窗口系统相关的表面信息,通过这个对象,Vulkan可以将渲染结果输出到窗口上。

创建窗口表面

VkSurfaceKHR对象是平台无关的,但是创建VkSurfaceKHR对象时,不同的窗口系统需要使用不同的 API

vkCreateAndroidSurfaceKHR()
vkCreateWaylandSurfaceKHR()
vkCreateWin32SurfaceKHR()
vkCreateXcbSurfaceKHR()

需要注意的是,创建Vulkan实例的时候需要提前设置好相应的扩展:

std::vector<const char*> instance_extensions;
instance_extensions.push_back("VK_KHR_surface");
instance_extensions.push_back("VK_KHR_win32_surface");//win32

instanceCreateInfo.enabledExtensionCount = static_cast<uint32_t>(instance_extensions.size());
instanceCreateInfo.ppEnabledExtensionNames = instance_extensions.data();
VkResult result = vkCreateInstance(&instanceCreateInfo, nullptr, &instance);

Windows系统上是借助于glfw创建出的window完成 VkSurfaceKHR的创建:

参考代码
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLFW_EXPOSE_NATIVE_WIN32
#include <GLFW/glfw3native.h>
#include <vulkan/vulkan_win32.h>


void vulkanBasicDemo::vulkanCreateVulkanSurface() {
    // 获取 instance extension
    uint32_t extensionCount = 0;
    vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
    std::vector<VkExtensionProperties> availableExtensions(extensionCount);
    vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, availableExtensions.data());
    
    if (!isExtensionSupported("VK_KHR_win32_surface", availableExtensions)) {
        throw std::runtime_error("VK_KHR_win32_surface extension not supported");
    }
    std::cout << "instance support VK_KHR_win32_surface" << std::endl;


    glfwInit();
    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);

    VkWin32SurfaceCreateInfoKHR  createInfo = {};
    createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
    createInfo.pNext = nullptr;
    createInfo.flags = 0;
    createInfo.hwnd = glfwGetWin32Window(window);
    createInfo.hinstance = GetModuleHandle(nullptr);

    VkResult result = vkCreateWin32SurfaceKHR(instance, &createInfo, nullptr, &surface);
    if (result != VK_SUCCESS) {
        throw std::runtime_error("vkCreateWin32SurfaceKHR failed");
    }

    vkDestroySurfaceKHR(instance, surface, nullptr);
    glfwDestroyWindow(window);
    glfwTerminate();
}

http://www.kler.cn/a/317829.html

相关文章:

  • 分布式锁实践方案
  • Linux系统编程多线程之条件变量和信号量讲解
  • 【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
  • 基于Java Web的传智播客crm企业管理系统的设计与实现
  • SpringBoot参数注解
  • Linux 常用操作指令大揭秘(下)
  • Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)
  • DevOps在提升软件质量方面的作用
  • 动手学深度学习8.5. 循环神经网络的从零开始实现-笔记练习(PyTorch)
  • Linux——常用系统设置和快捷键操作指令
  • 排序 (哈希) js
  • 视频无损压缩工具+预览视频生成工具
  • 文件上传js代码
  • git pull 报错 refusing to merge unrelated histories
  • 内容安全策略csp中的font-src如果设置为* ,会不安全吗
  • 滚雪球学SpringCloud[5.1讲]: Spring Cloud Config详解
  • Vue学习记录之六(组件实战及BEM框架了解)
  • Vue3 + ElementPlus 的后台菜单指引
  • Python 去掉文件后缀名
  • 【matlab安装】最近换磁盘重装电脑安装matlab遇到几个问题
  • VScode 修改 cursor 键盘设置
  • OpenAI converting API code from GPT-3 to chatGPT-3.5
  • 生成式语言模型技术栈
  • Spring Boot,在应用程序启动后执行某些 SQL 语句
  • python保留小数
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-18