vulkan操作解析

vulkan的目的是什么?有哪些操作?

 

Vulkan是用于控制设备(例如图形处理单元(GPU))的应用程序编程接口(API )。
尽管Vulkan是OpenGL的逻辑继承者,但它在形式上与OpenGL完全不同。
OpenGL驱动程序将要执行的许多操作
现在由Vulkan应用程序编写器负责。
这些东西包括同步,调度,内存管理等。

http://www.vulkanprogrammingguide.com  有示例代码

 

http://lunarg.com/vulkan-sdk/

1. 实例,设备和队列
Vulkan实例
Vulkan物理设备
物理设备内存
设备队列
创建逻辑设备

对象类型和功能约定
管理内存
Vulkan中的多线程
数学概念

向量和矩阵
坐标系

增强Vulkan
层数
扩展名

2. 内存和资源

主机内存管理
资源资源

buffer缓存
格式和支持
图片
资源视图
清除destory资源

设备内存管理

分配设备内存
主机访问设备内存
将内存绑定到资源
稀疏资源

3. 队列和命令

设备队列
创建命令缓冲区
记录record命令
回收命令缓冲区
提交命令

4. 移动数据

管理资源状态
管道壁垒barrier
全局内存壁垒barrier
缓冲存储器壁垒barrier
图像记忆屏障barrier
清除和填充缓冲区
清除和填充图像
复制影像数据
复制压缩图像数据
拉伸图像

5. 介绍演示

演示扩展
展示表面
    在window展示
    在xlib-based的平台
    在xcb
交换链
全屏表面
进行演示
清除

6. 着色器和管道
GLSL概述
SPIR-V概述
SPIR-V的表示形式
将SPIR-V交给Vulkan

流水线
计算管道
创建管道
专业化常数
加速管道创建
管道绑定bind

执行工作
着色器中的资源访问
描述符集
将资源绑定到描述符集
绑定描述符集
统一,texel和存储缓冲区
推送常数
采样图像


7. 图形管道

逻辑图形管道
渲染通道 render pass
帧缓冲
创建一个简单的图形管线
图形着色器阶段 shader stage
顶点输入状态 vertex
输入组件
镶嵌状态 Tesselation state
视口状态 viewport state
栅格化状态 rasterization state
多样本状态 multisample state
深度和模具状态  depth and stencil
颜色混合状态 color blend state
动态状态

8. 绘图

准备绘画
顶点数据vertex
索引绘制
    仅索引渲染
    重置指数
实例化
间接绘制 Indirect draws

9. 几何处理geomery

镶嵌 tessellation
    镶嵌配置
    镶嵌变量
    镶嵌示例:位移映射 displacement mapping
几何着色器   geometry shaders
切割基元 primitives
几何着色器实例化 instancing
可编程点大小
线宽和栅格化  line width and rasterization
用户剪辑和剔除 user clipping and culling
视图转换  viewport transformation

10. 片段处理

剪刀测试  scissor
深度和模板操作  depth and stencil operations
    深度测试
    模板测试
    早期片段测试
多样本渲染
    采样率阴影
    多样品解析
逻辑运算
片段着色器输出
色彩融合 blending

11. 同步
    围栏  fences
    事件  event
    信号量 semaphores

12. 取回数据

查询
    执行查询
    时序查询
与主机读取数据 Host

13. 多遍渲染 multipass rendering
输入附件
附件内容
    附件初始化
    渲染区域
    保留附件内容
辅助命令缓冲区

附录:Vulkan函数

图1.1 实例,设备和队列的Vulkan层次结构
图2.1 Mipmap图像布局
图2.2 LINEAR平铺图像的内存布局
图2.3 Gamma曲线适用于sRGB(顶部)和简单电源(底部)
图2.4多维数据集映射结构cube map
图2.5主机和设备内存
图4.1存储在缓冲区中的图像的数据布局
图6.1描述符集和管道集
图6.2线性采样
图6.3采样模式的影响
图7.1完整的Vulkan图形管道
图7.2带strip(左)和风扇Fan(右)拓扑
图7.3具有邻接拓扑的三角形
图7.4具有邻接拓扑的三角形带

图8.1索引数据流
图8.2原始重启的影响在三角形条上
图8.3许多实例化的立方体cubes

图9.1四边形细分quad tessellation
图9.2三角形细分tessellation
图9.3等值线细分Isoline tessellation
图9.4细分间距模式Tesselllation spacing modes
图9.5细分位移映射的结果displacement mapping
图9.6严格线的栅格化 rasterization of strict lines
图9.7非严格线的栅格化
图9.8裁剪而针对视口 clipping against a viewport

图10.1标准样品的地点
图13.1简单deferred renderer的数据流
Figure 13.2 Serial Dependency of Translucent on Opaque Geometry
图13.2半透明和不透明几何串行渲染
图13.3半透明和不透明几何并行渲染

表2.1稀疏纹理块大小Sparse Texture Block Sizes
表6.1管道资源限制
表6.2纹理比较功能 texture
表7.1动态和静态有效性
表9.1 GLSL和SPIR-V细分模式
表9.2 GLSL和SPIR-V细分模式缠绕顺序winding order
表10.1深度比较函数
表10.2模板运算 stencil
表10.3逻辑运算
表10.4混合方程式 blend
表10.5混合因子


清单1.1创建vulkan实例
清单1.2查询物理设备属性
清单1.3创建一个逻辑设备
清单1.4查询实例图层
清单1.5查询实例扩展

清单2.1内存分配类的声明
清单2.2实现内存分配类
清单2.3创建缓冲区对象
清单2.4创建图像对象
清单2.5选择图像的内存类型

清单3.1使用vkCmdCopyBuffer()的示例
清单4.1图像内存屏障
清单4.2用浮点数据填充缓冲区
清单5.1创建交换链 swap chain
清单5.2将图像转换为当前源
清单6.1最简单的GLSL着色器
清单6.2最简单的SPIR-V
清单6.3计算着色器(GLSL)中的局部尺寸声明
清单6.4计算着色器(SPIR-V)中的局部尺寸声明
清单6.5专业化常数GLSL中的
清单6.6 SPIR-V中的特殊化常量
清单6.7将管道缓存数据保存到文件中
清单6.8声明GLSL中的资源
清单6.9声明SPIR-V中的资源
清单6.10创建管道布局
清单6.11声明GLSL中的Uniform和Shader块
清单6.12在SPIR-V中声明Uniform和Shader块
清单6.13在GLSL中声明Texel缓冲区
清单6.14在SPIR-V中声明Texel缓冲区
清单6.15在GLSL中声明推送常量
清单6.16在SPIR-V中声明推送常量

清单7.1创建简单的渲染通道
清单7.2创建简单的图形管道
清单7.3描述顶点输入数据
清单7.4声明一个顶点着色器(GLSL)
清单7.5声明输入到顶点着色器(SPIR-V)

清单8.1单独的顶点属性设置
清单8.2索引多维数据集数据
清单8.3在着色器中使用顶点索引
清单8.4在着色器中使用实例索引
清单8.5绘图着色器

清单9.1中的细化细分控制着色器(GLSL)中使用的索引
清单9.2琐碎的镶嵌细分控制着色器(SPIR-V)
清单9.3在镶嵌细分控制着色器(GLSL)中声明输出
清单9.4在镶嵌细分控制着色器(SPIR-V)中声明输出
清单9.5在评估着色器(GLSL)中访问gl_TessCoord
清单9.6访问gl_TessCoord评估着色器(SPIR-V)
清单9.7位移映射的描述符设置
清单9.8位移映射的顶点着色器
清单9.9位移映射的Tessellation控制着色器
清单9.10位移映射的Tessellation评估着色器
清单9.11 Tessellation状态创建信息
清单9.12最小几何着色器(GLSL) )
清单9.13最小几何着色器(SPIR-V)
清单9.14在GLSL几何着色器中声明gl_PerVertex
清单9.15在SPIR-V几何着色器中读取gl_PerVertex
清单9.16在GLSL中声明输出块
清单9.17直通GLSL几何着色器
清单9.18传递通过SPIR-V Geometry Shader
清单9.19在Geometry Shader中切割条
清单9.20实例化GLSL Geometry Shader
清单9.21在GLSL中使用gl_PointSize
清单9.22用PointSize装饰输出
清单9.23在GLSL中使用gl_ClipDistance
清单9.24用ClipDistance装饰输出
清单9.25使用GLSL中gl_CullDistance的设置
清单9.26用CullDistance装饰输出
清单9.27在几何着色器(GLSL)中使用多个视口

清单10.1在片段着色器(GLSL)中声明输出
清单10.2在片段着色器(SPIR-V)中声明输出
清单10.3在片段着色器中声明输出片段着色器(GLSL)
清单10.4片段着色器(SPIR-V)中的几个输出

清单11.1四栅栏同步的设置 four-fence
清单11.2同步栅栏的循环等待
清单11.3带信号量的跨队列提交

清单12.1所有管道统计信息的C结构
清单12.2将缓冲区移到主机可读状态

清单13.1递延阴影渲染通道设置
清单13.2半透明和递延阴影设置

创建vulkan应用程序

应该注意的是,Vulkan是跨平台,跨供应商和跨设备的系统。
这些示例中的许多示例都可以在Android和其他移动平台
上运行,同样的代码在不同平台上运行,其适用性有差异。

最初有Mantle规范,Vulkan就是从该规范衍生而来的。

什么是Vulkan及其基本原理?
如何创建最小的Vulkan应用程序?
使用的术语和概念terminology?

API背后的基本概念:
    包括初始化
    对象生存期
    Vulkan实例
    逻辑和物理设备。

简单的vulkan程序包括:
    初始化Vulkan系统;
    发现可用的Vulkan设备并显示其属性和功能
    最后彻底关闭设备

Vulkan是图形和计算设备的编程接口。Vulkan设备通常
由处理器和许多固定功能的硬件块组成,以加速
图形和计算中使用的操作。设备中的处理器通常是
非常宽的多线程处理器,因此Vulkan中的计算模型主要
基于并行计算。Vulkan设备还可以访问可能与您的
应用程序运行所在的主处理器共享的内存,
也可以不与之共享。Vulkan还会向您显示此内存。

Vulkan的设计不仅仅是图形API。它可用于异构
设备,例如图形处理单元(GPU),数字信号处理器(DSP)
和固定功能硬件。功能分为粗粒度,广泛重叠的类别。所述
vulkan的当前版本定义了传输的类别,
    其用于围绕复制数据;
    在计算类别,其用于运行在计算负载着色器;
    图形类别,包括光栅化,图元装配,混合,
     深度和模板测试以及图形程序员将熟悉的其他功能。

vulkan实例VkInstance对象
    VkResult vkCreateInstance (
    const VkInstanceCreateInfo* pCreateInfo, --》 参数
    const VkAllocationCallbacks* pAllocator,
    VkInstance* pInstance);
pCreateInfo是指向

    VkInstanceCreateInfo结构的实例,其中包含描述
新Vulkan实例的参数。其定义如下
typedef struct VkInstanceCreateInfo {
    VkStructureType sType;  --》什么类型结构
    const void* pNext;       --》 类型结果参数,扩展参数
    VkInstanceCreateFlags flags;  --》设置为0,保留以后使用
    const VkApplicationInfo* pApplicationInfo;
    uint32_t enabledLayerCount;    --》  实例层数计数器;用于拦截Vulkan API并提供 日志记录,性能分析,调试或其他附加功能。

如果不需要图层,只需设置 enabledLayerCount设置为零,并将ppEnabledLayerNames保留为nullptr。

    const char* const* ppEnabledLayerNames;    --》  
    uint32_t enabledExtensionCount;    --》   扩展计数器, 可设为0,不用扩展
    const char* const* ppEnabledExtensionNames;   --》 如果不适用任何扩展名,这些字段可设置为nullptr
} VkInstanceCreateInfo;

如果设置sType字段为
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
pNext设置可为nullptr

 

pApplicationInfo 指向VkApplicationInfo的实例
结构,其定义是
typedef struct VkApplicationInfo {
    VkStructureType sType;   --》 设置为VK_STRUCTURE_TYPE_APPLICATION_INFO
    const void* pNext;     --》 可保留nullptr
    const char* pApplicationName; --》 是指向nul-terminated1字符串的指针,
    该字符串包含应用程序名称
    uint32_t applicationVersion;   --》 应用程序版本号
    这允许工具和驱动程序可以决定如何对待应用程序,而无需猜测
应用程序正在运行
    const char* pEngineName;  --》 引擎名称
    uint32_t engineVersion;    --》 引擎或中间件的版本
    uint32_t apiVersion;   --》 包含应用程序期望的Vulkan API的版本
运行,应将其设置为应用程序所需的Vulkan的绝对最低版本
运行,这允许最大范围可能有各种各样的设备和平台运
应用程序,即使对其Vulkan进行了更新实现可能不可用。
} VkApplicationInfo;

与OpenGL一样,Vulkan支持将扩展作为API的核心部分。但是,在OpenGL中,我们将
创建上下文,查询受支持的扩展,然后开始使用它们。这意味着driver将
需要假设应用程序可能随时会突然开始使用扩展程序并为此做好准备。
此外,它无法确定您要查找的扩展名,这使该过程更加困难。
在Vulkan中,要求应用程序选择加入扩展并明确启用它们。这使driver能够
禁用未使用的扩展名,使应用程序更难于意外地开始使用
功能是他们不打算启用的扩展的一部分。
最后,返回vkCreateInstance()函数,pAllocator参数是一个
指向应用程序可以提供以管理主机的主机内存分配器的指针
Vulkan系统使用的内存。将此设置为nullptr会导致Vulkan系统使用其
自己的内部分配器,这就是我们在这里要做的。应用程序托管的主机内存将是
在“内存和资源”中进行介绍。
假设vkCreateInstance()函数成功执行,它将返回VK_SUCCESS并放置一个
pInstance参数指向的变量中新实例的handle。handler是
引用对象的值。Vulkan句柄始终为64位宽,无论
主机系统的位。一旦有了Vulkan实例的hanlder,就可以使用它来调用其他
实例函数。

    

Vulkan物理设备

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值