vulkan学习(三)——基础单元封装
一、物理设备创建
二、逻辑设备与队列
2.1 命令队列
由命令队列族为类型,创建的队列实例,驱动只允许一个队列族创建少量队列。所以可以使用多个二级命令提交到一个主命令中,然后提交主命令到一个渲染队列的方式。即多线程渲染的秘籍。
概念解析:
-
队列族:一个队列的类型,类似于C++当中的class, 只代表类型,不代表具体的队列。其中规定了本类型队列应该满足的队列功能。
-
渲染队列:渲染相关的命令,送入该队列,可被执行。
-
显示队列:渲染完毕的图片,形成命令,送入该队列,可以执行显示功能。
-
传输队列:比如Buffer之间的数据拷贝,CPU、GPU之间的数拷贝,可送入该队列。
2.2 创建队列
需要与逻辑设备挂钩,先创建逻辑设备,由逻辑设备对其进行创建。
三、Surface概念与封装
Surface是Vulkan实例(mInstance)和窗口(mWindow)之间的桥梁,即用于将实例渲染出来的东西,放在窗口进行展示的部件。
四、显示队列族与显示队列
五、交换链基础理论与对象封装
SwapChain 用于解决多buffer渲染与显示的撕裂感问题
5.1 创建交换链关心的问题
逻辑设备扩展:有很多设备,比如云渲染不需要交换链向屏幕显示,所以其被设计为扩展,VK_KHR_SWAPCHAIN_EXTENSION_NAME
查询表面支持的细节:
- 基础特性:最小、最大图像数量,最小、最大图像宽高
- 表面格式:像素格式(RGB GRBA),颜色空间(SRGB-Gamma校正后颜色)
- 可用呈现模式:先进先出,立即模式等
5.2 表面格式储备知识
由于各个显示器对RGB颜色值的反应不通,比如红色为1.0应该比0.5更加量一倍,但是显示器是按照2.2次幂曲线呈现的。
解决方案:在FragmentShader输出的时候,对每个颜色进行一次1/2.2次幂运算,经过屏幕的2.2次幂的指数操作,整体就会呈现线性,即Gamma校正。
在Vulkan当中,该过程可以通过设置图片解读格式以及颜色空间翻译格式进行。
- sRGB颜色空间: 当前图片,在存储的时候就已经被做了取1/2.2次幂的操作,如下图所示
在Vulkan当中,一张图片有两个问题:
-
对于读入一张图片,这张图片到底是什么颜色空间的图片,如何使用?
-
对于渲染完毕的一张图片,显示器如何解释并且显示这张图片?
5.3 交换链的呈现模式(PresentMode)
显示模式:用来规定,显示队列当中如何处理多帧输入的显示问题
VK_PRESENT_MODE_IMMEDIATE_KHR
: 渲染完毕的图片,会立即送去显示,因此有可能产生撕裂
VK_PRESENT_MODE_FIFO_KHR
:渲染完毕的图片,会立即送入队列,先到的会先显示,如果队列满了,渲染程序就会阻塞等待。每次在垂直消隐期间才会更新一次显示图片。
VK_PRESENT_MODE_FIFO_RELAXED_KHR
:与第二个一样,不同的是,如果队列空置,新图片会直接送去显示,不用等待垂直消隐,会造成撕裂。
VK_PRESENT_MODE_MAILBOX_KHR
:与第二个一样,但新来的图片会替换队列当中的图片,这样渲染效率会提高,不用阻塞等待。
- 点赞
- 收藏
- 关注作者
评论(0)