当前课程知识点:移动图形概论 >  第八章 PowerVR 工具简介 >  8.1 Vulkan 介绍 >  Vulkan 介绍

返回《移动图形概论》慕课在线视频课程列表

Vulkan 介绍在线视频

下一节:SDK 中的实用工具介绍

返回《移动图形概论》慕课在线视频列表

Vulkan 介绍课程教案、知识点、字幕

各位同学大家好

今天为大家介绍一下Vulkan

今天的主要内容包括包括Vulkan的概述

使用Vulkan的基本步骤

还有介绍一些Vulkan的资源

Vulkan是一种图形API

与大多数其他图形API相比

它可以提供更好的性能

特别是在移动图形API方面

它具有很好的跨平台支持功能

可以更好地支持多线程处理器

并且处理器的负载更低

还支持对以多种着色器语言

编写的着色器程序进行预编译

在课程的介绍阶段

我们就提到了Vulkan

提到设置和使用Vulkan需要大量的代码

甚至达到OpengLES的十倍以上

因此

我们这里仅讨论Vulkan的基本概念和与OpenGL的区别

以及使用Vulkan的主要步骤

如果需要使用Vulkan进行开发

还要参考后面介绍的其它资料

这里有一个对比表格

把Vulkan和OpenGL做了多个维度的对比

首先由于Vulkan是一个比较新的标准

我们可以看到Vulkan能够更好的匹配当前的硬件

包括具有统一内存

和支持图块渲染的移动平台

而OpenGL最初是为直接渲染程序

和分离式存储器的工作站而创建

第二Vulkan专为多核多线程平台而设计

可以并行创建多个命令缓冲区

现代硬件具有多个处理器

Vulkan允许使用这些处理器

而OpenGL不允许并行的绘图命令

第三Vulkan使用二进制的spirv作为着色器输入

实现了前端语言的灵活性和可靠性

无需提供着色器代码

因为已经从着色器代码离线编译了SPIR V

而OpenGL着色器语言编译器是驱动程序的一部分

仅支持GLSL

因此着色器源代码必须随程序一起提供

第四Vulkan标准在设计初期

就经过了不同供应商之间严格测试

因此兼容性更好

理论上讲使用Vulkan时

硬件制造商之间不应存在视觉差异

而OpenGL的开发人员为了获得理想的性能

必须考虑到供应商之间的实现差异

第五Vulkan应用程序

通过显式API对GPU进行直接且可预测的控制

由于应用程序可以直接访问GPU

因此速度应该更快

OpenGL驱动程序处理状态验证

依赖性跟踪和错误检查

这可能会限制并让性能不可预测

OpenGL跟踪许多程序资源的状态

可管理存储器和控制同步

并在应用程序运行时检查错误

而Vulkan比OpenGL速度更快的原因之一

是Vulkan不执行这些检查

因此几乎所有的操作都由程序员负责

这里有一个视频

是2015年在PowerVR Rogue GPU上运行Gnome Horde的效果

左边屏幕显示的是Vulkan原型

右边屏幕显示的是OpenGLES原型

当场景中对象的数量增加时

Vulkan的性能明显胜出

在Vulkan中使用多个CPU内核发送图形调用

显然要比在OpenGL中使一个内核更好

即使OpenGL版本使用多个内核

但由于OpenGL本身不支持并行

内核的整体使用等效于仅使用1个内核

此外与使用OpenGL相比

在Vulkan中要执行的CPU工作更少

也可以提升程序的性能

Vulkan允许将以不同着色器语言编写的着色器

预编译为自己的二进制中间语言

称为SPIR V

支持的两种着色器语言是OpenGL中的GLSL

和DirectX中的HLSL

这两种着色器语言在图形编程中十分常用

而且涵盖了大多数图形应用程序

因此

可以使用这两种着色器语言之一来编写着色器

然后将其编译为SPIR V

这样便无需学习新的着色器语言

SPIR V是英文“标准可移植中间表示”的缩写

它是一种二进制中间语言

这意味着硬件制造商可以直接解析SPIR V

从而为你使用的硬件提供最佳性能

此外

由于在软件使用SPIR V之前

它已经被编译为二进制中间语言

因此这也减少了软件的启动时间

在代码中使用Vulkan并非易事

因为初始化Vulkan需要执行很多操作

包括设置设备 分配GPU存储器 分配命令缓冲区

创建图形管线 定义模型描述符

定义同步和定义渲染过程

着色器程序在加载前必须预先通过编译

与在OpenGL ES的介绍中一样

我们将通过渲染一个三角形

逐步说明使用Vulkan所需的主要步骤

由于绘制三角形的代码过于冗长

这里仅列出简化的伪代码作为说明

具体的代码还要参考相关文档

首先需要创建Vulkan API的一个实例

此操作通过vkCreateInstance完成

通过描述应用程序和我们要使用的任何API扩展来创建实例

此操作使用结构VkInstanceCreateInfo完成

创建实例后

可以使用vkEnumeratePhysicalDevices

查找所有支持Vulkan的硬件

将结果记录在VkPhysicalDevices

类型的结构体数组中

然后选择一个或多个要使用的物理设备

要能够渲染图形

我们需要创建一个窗口

窗口的创建将取决于你使用的操作系统

有了窗口后

我们将创建一个要渲染到窗口的Vulkan表面

我们将需要创建一个逻辑设备

但是在创建逻辑设备之前

还需要使用VkQueue

指定要使用的队列

可以创建多个队列

因此可能需要将一个队列用于图形命令

将另一个队列用于计算操作

选择物理设备并指定队列后

我们将使用vkCreateDevice

创建一个要在应用程序中使用的逻辑设备

VkDevice

逻辑设备为应用程序提供访问物理设备资源

和物理设备本身的主要接口

包括队列的创建

同步图元的创建和管理

内存的分配

释放和管理

命令缓冲区和命令缓冲区池的创建和销毁

包括管线和资源描述符在内的其他图形状态的创建

管理和销毁

交换链涉及多个渲染目标

包括屏幕上当前显示的图像

和至少一个用来渲染新对象的其他图像

这个图像将作为下一帧显示在屏幕上

我们经常使用两个渲染目标或三个渲染目标

分别称为双缓冲和三重缓冲

当我们完成对某个渲染目标的渲染时

可以通知交换链

渲染目标链将向前移动

对于双缓冲

当我们完成对屏幕外渲染目标的渲染时

相应的屏幕外目标将变为屏幕上显示的目标

然后我们可以将另一个目标

作为下一个图像要渲染到的屏幕外目标

要能够渲染到交换链中的渲染目标

需要为每个渲染目标创建图像视图

凭借图像视图

我们可以引用所使用图像的特定部分

我们经常使用图像视图来引用

将用作颜色缓冲区和深度缓冲区的目标

还可以使用图像视图进行渲染

使生成的图像用作纹理

然后在场景中使用

我们需要使用vkCreateRenderPass

创建一个渲染过程

渲染过程是一组操作的集合

这些操作描述了渲染期间使用的图像的类型

将如何使用这些图像

以及应如何处理其内容

之后还要使用vkCreateFramebuffer

创建帧缓冲区对象

引用将用于颜色

深度或模板目标的图像视图

因此

渲染过程用于描述图像的类型

帧缓冲区用于实际绑定渲染过程要使用的特定图像

在绘制图形之前

需要将图形绘制命令添加到命令缓冲区

而命令缓冲区是从

与特定队列相关联的命令池中分配的

命令池由vkCreateCommandPool函数建立

而命令缓冲区通过vkAllocateCommandBuffers建立

为了了解绘制命令是什么

可以看一下渲染单个三角形的命令为下面四个

一启动渲染过程vkCmdBeginRenderPass

二绑定图形管线vkCmdBindPipeline

渲染三角形 vkCmdDraw

完成渲染过程vkCmdEndRenderPass

我们将在下一张幻灯片中查看图形管线

我们需要至少创建一条图形管线

以便Vulkan提前了解我们要执行的操作和要使用的功能

Vulkan中图形管线可以看作一条生产线

命令进入管线的前端并分阶段处理

图形管线的许多部分都是可选的

但是你通常会在管线中

至少提供一个顶点着色器和一个片段着色器

管线还可包括曲面细分

几何着色器和片段着色器等

管线将包含有关要使用的着色器

要使用的渲染过程

渲染属性等信息

还可以定义深度和模板测试以及混合模式等

每次我们要执行不同的操作时

都需要创建一条管线

例如

如果我们要使用两个不同的着色器

则需要两条不同的管线

在创建图形管线时

使用vkCreateShaderModule加载着色器

SPIR V代码

并使用vkCreateGraphicsPipelines

完成管线的最终建立

我们已经概述了设置Vulkan的必要步骤

随后可以使用Vulkan在主循环中渲染对象

有多种方法可以实现此目标

常见的一种方法如下

一使用vkAcquireNextImageKHR从交换链中获取一个图像

二可以更新存储器对象,例如Uniform缓冲区

三随后可以为图像选择适当的命令缓冲区

并使用vkQueueSubmit来执行

四最后使用vkQueuePresentKHR

将图像返回到交换链以显示在屏幕上

提交到队列的命令采用异步方式来处理

可以按任何顺序处理队列

因此

我们必须使用同步对象

来确保执行顺序符合我们的预期

有多种方法可以实现同步

绘制主循环的三个步骤可以命名为“获取”

“提交”和“显示”

实现同步的常用方法如下

一获取阶段

发出一个“提交阶段”等待的信号量

这样可以确保在获取图像之前不会开始提交

这样就不会写入仍在使用的存储器

二提交阶段

通过信号量等待获取

发出一个“显示阶段”等待的信号量

这样可确保在渲染完成之前不会显示在屏幕上

此外

还要等待CPU侧的信号

以确保在此命令缓冲区上的前一次渲染已经完成

三显示阶段

通过信号量等待提交完成

我们已经介绍了Vulkan的基本编程流程

但是要使编写的程序能正确运行

必须查看Vulkan的示例代码

PowerVR SDK中包含很多Vulkan的示例

如Vulkan目录中的IntroducingPVRShell示例

使用原始的Vulkan调用实现渲染

IntroducingPVRVk使用一些PowerVR实用程序

来简化Vulkan的使用

最后介绍一些Vulkan的资源

《Vulkan应用开发指南》这本有中文版

由人民邮电出版社出版

是学习Vulkan的官方教程

除此之外这里还有一些在线资料值得阅读

好 今天的课程就到这里

谢谢大家

移动图形概论课程列表:

第一章 课程简介

-1.1 课程基本情况介绍

--课程基本情况介绍

-1.2 GPU 相关基础知识

--GPU 相关基础知识

-1.3 OpenGL ES 技术发展历史

--OpenGL ES 技术发展历史

-1.4 PowerVR SDK 安装和使用

--PowerVR SDK 安装和使用

-第一章测试

第二章 图形编程入门

-2.1 OpenGL ES 基本概念

--OpenGL ES 基本概念

-2.2 编写第一个图形程序

--编写第一个图形程序

-2.3 主要 API 介绍

--主要 API 介绍

-第二章测试

第三章 OpenGL ES 变换

-3.1 矢量和矩阵知识基础

--矢量和矩阵知识基础

-3.2 旋转与位移变换

--旋转与位移变换

-3.3 OpenGL ES 变换基础

--OpenGL ES 变换基础

-第三章测试

第四章 OpenGL ES 着色器

-4.1 着色器编程语言介绍

--着色器编程语言语法

--着色器编程语言特殊语法

-4.2 着色器编程实例

--着色器编程实例

-第四章测试

第五章 颜色与纹理

-5.1 颜色的基本概念

--颜色的基本概念

-5.2 纹理素材的使用

--纹理素材的使用

-5.3 立方体纹理

--立方体纹理

-第五章测试

第六章 光源与光照

-6.1 光照的基本概念

--光照的基本概念

-6.2 光源模型

--光源模型

-6.3 使用着色器渲染颜色

--使用着色器渲染颜色

-6.4 反射与折射

--反射与折射

-第六章测试

第七章 基于物理的渲染

-7.1 基于物理渲染的基本概念

--基于物理渲染的基本概念

-7.2 基于图像的照明

--基于图像的照明

-7.3 PBR 的实现

--PBR 的实现

-第七章测试

第八章 PowerVR 工具简介

-8.1 Vulkan 介绍

--Vulkan 介绍

-8.2 SDK 中的实用工具介绍

--SDK 中的实用工具介绍

-综合测试

Vulkan 介绍笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。