vulkan学习(三)——基础单元封装

举报
lutianfei 发表于 2022/04/11 12:41:44 2022/04/11
【摘要】 一、物理设备创建 二、逻辑设备与队列 2.1 命令队列由命令队列族为类型,创建的队列实例,驱动只允许一个队列族创建少量队列。所以可以使用多个二级命令提交到一个主命令中,然后提交主命令到一个渲染队列的方式。即多线程渲染的秘籍。概念解析:队列族:一个队列的类型,类似于C++当中的class, 只代表类型,不代表具体的队列。其中规定了本类型队列应该满足的队列功能。渲染队列:渲染相关的命令,送入该...

一、物理设备创建

image.png

二、逻辑设备与队列

2.1 命令队列

由命令队列族为类型,创建的队列实例,驱动只允许一个队列族创建少量队列。所以可以使用多个二级命令提交到一个主命令中,然后提交主命令到一个渲染队列的方式。即多线程渲染的秘籍。

image.png

概念解析:

  • 队列族:一个队列的类型,类似于C++当中的class, 只代表类型,不代表具体的队列。其中规定了本类型队列应该满足的队列功能。

  • 渲染队列:渲染相关的命令,送入该队列,可被执行。

  • 显示队列:渲染完毕的图片,形成命令,送入该队列,可以执行显示功能。

  • 传输队列:比如Buffer之间的数据拷贝,CPU、GPU之间的数拷贝,可送入该队列。

2.2 创建队列

需要与逻辑设备挂钩,先创建逻辑设备,由逻辑设备对其进行创建。

三、Surface概念与封装

Surface是Vulkan实例(mInstance)和窗口(mWindow)之间的桥梁,即用于将实例渲染出来的东西,放在窗口进行展示的部件。

四、显示队列族与显示队列

五、交换链基础理论与对象封装

SwapChain 用于解决多buffer渲染与显示的撕裂感问题
image.png

5.1 创建交换链关心的问题

逻辑设备扩展:有很多设备,比如云渲染不需要交换链向屏幕显示,所以其被设计为扩展,VK_KHR_SWAPCHAIN_EXTENSION_NAME

查询表面支持的细节:

  1. 基础特性:最小、最大图像数量,最小、最大图像宽高
  2. 表面格式:像素格式(RGB GRBA),颜色空间(SRGB-Gamma校正后颜色)
  3. 可用呈现模式:先进先出,立即模式等

5.2 表面格式储备知识

由于各个显示器对RGB颜色值的反应不通,比如红色为1.0应该比0.5更加量一倍,但是显示器是按照2.2次幂曲线呈现的。

解决方案:在FragmentShader输出的时候,对每个颜色进行一次1/2.2次幂运算,经过屏幕的2.2次幂的指数操作,整体就会呈现线性,即Gamma校正。

image.png

在Vulkan当中,该过程可以通过设置图片解读格式以及颜色空间翻译格式进行。

  • sRGB颜色空间: 当前图片,在存储的时候就已经被做了取1/2.2次幂的操作,如下图所示
    image.png

在Vulkan当中,一张图片有两个问题:

  1. 对于读入一张图片,这张图片到底是什么颜色空间的图片,如何使用?
    image.png

  2. 对于渲染完毕的一张图片,显示器如何解释并且显示这张图片?
    image.png

5.3 交换链的呈现模式(PresentMode)

显示模式:用来规定,显示队列当中如何处理多帧输入的显示问题
VK_PRESENT_MODE_IMMEDIATE_KHR: 渲染完毕的图片,会立即送去显示,因此有可能产生撕裂

VK_PRESENT_MODE_FIFO_KHR:渲染完毕的图片,会立即送入队列,先到的会先显示,如果队列满了,渲染程序就会阻塞等待。每次在垂直消隐期间才会更新一次显示图片。

VK_PRESENT_MODE_FIFO_RELAXED_KHR:与第二个一样,不同的是,如果队列空置,新图片会直接送去显示,不用等待垂直消隐,会造成撕裂。

VK_PRESENT_MODE_MAILBOX_KHR:与第二个一样,但新来的图片会替换队列当中的图片,这样渲染效率会提高,不用阻塞等待。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。