文章

Vulkan复习(简述、环境配置、程序框架)

简述

  • 特性
    • 跨平台
    • 具有更接近GPU的API
    • 性能强大
    • 支持多线程
  • 对象
    • 1
      • 实线箭头:创建关系,指向被创建者,需要通过PhysicalDevice创建device
      • 虚线箭头:使用关系,指向被使用者,比如Pipeline使用CommandBuffer
      • 菱形箭头:获取/组合关系,指向整体,部分不可单独存在,整体swapchain和部分image
    • buffer缓冲:
      • mesh:顶点和索引各自的buffer和memory,组成mesh
      • shader的uniform数据
      • image:位图数据,纹理
    • VkImageSampler图像采样器:比如采样mipmap level
    • VkDeviceMemory设备内存:代表分配的显存,让我们自己定义分配策略
    • barrier屏障:缓存可能不一致,屏障告诉同步缓存
    • subpass子pass:renderpass 必须包含至少一个 subpass
    • Descriptor描述:传输uniform时需要,需要从DescriptorPool 分配,通过vkUpdateDescriptorSets() 绑定对象
    • pipelineCache管线缓存:用于存储和重用与管线创建相关的数据,显著加快管线创建
  • 图形API规范
    • Vulkan函数、枚举和结构体都在中定义vulkan.h头文件
    • 前缀后缀
      • 函数具有小写的vk前缀
      • 枚举和结构体等类型具有大写的Vk前缀
      • 枚举值具有VK_前缀
      • KHR后缀的属于vulkan扩展
    • 函数
      • API通常使用结构体来向函数传递参数
      • 结构体中需要在sType成员中明确指定结构体的类型
      • pNext可以指向扩展结构
      • 通常Enumerate函数会被调用两次
        • 首次调用传递&count(函数形参是*,接受地址,通过指针方式获取函数返回值),nullptr,获取数量
        • 再次调用传递arr.data()获取数据(函数形参是 元素*,data()可以获取指向数组第一个元素的指针(二维数组同理),不使用&vector是因为类型不匹配,不使用&vector[0]是为了防止访问越界,假如数组为空的话)
      • 几乎所有函数都会返回VkResult,该返回值要么是VK_SUCCESS,要么是错误代码

环境配置

  • Vulkan SDK
    • 包含头文件,验证层,函数的加载器(运行时查找驱动程序中的函数)
    • 安装Vulkan SDK
      • 版本:1.1/1.2都太陈旧了,建议1.3/1.4,我使用的是1.3.296.0
      • 下载:在官网选择window->x64/x86选择某某版本对应的VulkanSDK-版本号-Installer.exe下载
      • 安装:
        • 双击下载的.exe安装
        • 一路next即可
        • 对于选择组件这一步,选择你自己需要的组件
      • 环境变量:
        • 系统变量VK_SDK_PATH,VULKAN_SDK变量名,变量值为你的安装目录
        • 区别:
          • 系统变量:所有用户都可读取,只有管理员可以更改
          • 用户变量:仅当前用户可以读取,仅当前用户可改
          • 变量名唯一标识符,变量值为目录,它们是一种映射关系,可以通过键引用值
          • path中:当输入命令,会在path的目录顺序逐个搜索这个可执行文件,找到就执行
    • 验证:前往安装目录,在bin目录,运行vkcube.exe演示程序,如果看到飞速旋转的立方体,则显卡和驱动程序可以正确支持vulkan,否则你将收到错误消息
    • bin目录中glslangValidator.exe和glslc.exe用于将GLSL编译成字节码,我们会在shader章节详细介绍
    • bin目录还包含Vulkan加载器和验证层的二进制文件,Lib目录包含库文件,Include包含头文件
  • GLFW:
    • vulkan是跨平台的,本身不提供窗口的,会使用GLFW库来创建窗口,它支持不同的操作系统
    • 下载:在官网选择window64位二进制下载
    • 解压后会看到所有版本的集合,头文件,库文件
  • GLM
    • 用于线性代数运算的库,专为图形API设计
    • 下载:在官网下载最新版本即可
  • VisualStudioCode_MSVC_编辑器的配置文件
    • 详见 VsCode、MSVC编译C++ 此章节
    • 使用库_链接错误:

      1
      2
      3
      4
      5
      6
      
      若要使用此运行时库:单线程,静态链接(libc.lib) 请忽略这些库:libcmt.libmsvcrt.liblibcd.liblibcmtd.libmsvcrtd.lib 
      若要使用此运行时库:多线程,静态链接(libcmt.lib) 请忽略这些库:libc.libmsvcrt.liblibcd.liblibcmtd.libmsvcrtd.lib 
      若要使用此运行时库:多线程,动态链接(msvcrt.lib) 请忽略这些库:libc.liblibcmt.liblibcd.liblibcmtd.libmsvcrtd.lib 
      若要使用此运行时库:调试单线程,静态链接(libcd.lib) 请忽略这些库:libc.liblibcmt.libmsvcrt.liblibcmtd.libmsvcrtd.lib 
      若要使用此运行时库:调试多线程,静态链接(libcmtd.lib) 请忽略这些库:libc.liblibcmt.libmsvcrt.liblibcd.libmsvcrtd.lib 
      若要使用此运行时库:调试多线程,动态链接(msvcrtd.lib) 请忽略这些库:libc.liblibcmt.libmsvcrt.liblibcd.liblibcmtd.lib 
      

      展开

      • LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
        • C运行时库提供了标准C函数,它们有互斥性,运行时库冲突,使用/NODEFAULTLIB:MSVCRT 忽略特定版本的C运行时库
      • 错误:glfw3.lib(win32_init.obj) : error LNK2019: 无法解析的外部符号 __imp_TranslateMessage,函数 _glfwInitWin32 中引用了该符号
        • TranslateMessage函数位于user32.dll中,无法解析的外部符号,缺少Windows系统库导致的,添加必要的Windows系统库:user32.lib,gdi32.lib,shell32.lib
  • VisualStudioCode_MSVC_Cmake配置文件
    • 为了支持跨平台性,我们的项目将使用cmake配置工程
    • c_cpp_properties和task都不需要
    • 编写CmakeLists.txt文件,详见 构建工具_Cmake 此章节
    • 编译
      • 使用cmake + cmake tools 这两个插件
        • F1使用Cmake Configure生成工程,可以选择Visual Studio Community 2022 Release - amd64
        • 编译:RunTask->Cmake:build
        • 运行:还需要之前的launch.json文件,F5运行
      • 使用命令行:new Terminal,输入构建编译的命令,详见 构建工具_Cmake 此章节
  • 1
  • 运行结果

程序框架

  • 头文件
    • cstdlib 头文件提供了 EXIT_SUCCESS 和 EXIT_FAILURE 宏,作为程序返回结果
    • 包含 stdexcept 和 iostream 头文件是为了报告错误情况
  • APP
    • 程序本身作为一个类
    • run作为接口包含4个阶段:
      • 初始化窗口:glfwInit初始化,可调整大小,glfwCreateWindow创建窗口
      • 初始化vulkan
      • 循环:当glfwWindowShouldClose窗口没有关闭时,会一直循环,并接受glfwPollEvents窗口事件
      • 清理:glfwDestroyWindow销毁窗口,glfwTerminate
  • main
    • 创建app
    • 异常捕获在app run时,如果catch异常输出cerr错误日志
本文由作者按照 CC BY 4.0 进行授权
本页总访问量