Vulkan

【下载】从OpenGL ES迁移到Vulkan的原因和方法

本文档概述了OpenGL ES和新Vulkan之间的主要区别,以及为什么开发人员想要从OpenGL ES迁移到Vulkan。

Vulkan是一种新的底层图形API,它允许开发人员通过几乎类似于控制台的API来获得非常低的级别,这使得开发人员能够更好的控制它的性能和透明度。这是通过增加实施复杂度的实现的。

详阅请点击下载《从OpenGL ES迁移到Vulkan的原因和方法》

[Vulkan规范]Vulkan的一些基础的概念

本文介绍一些基础的概念,包括Vulkan架构和执行模型、队列操作、对象模型。

架构模型

Vulkan和其API为符合以下特征的CPU、GPU和其他硬件加速架构所设计和实现:

• 运行时库支持8位、16位、32位和64位有符号和无符号整形,都可以通过该类型数据的粒度的大小来寻址到。
• 运行时库支持满足 Floating Point Computation 节的范围和精度的32位和64位浮点类型。
• 这些类型的表示和大小端必须满足主机端和设备端一致。

注意:因为Vulkan中很多数据类型和结构可能在主机端和设备端内存来回的映射,主机端和设备端架构必须能够高效的访问到数据,以便很方便的写高性能、可移植的应用程序。

在支持Vulkan的特定平台上此规范对影响ABI()的选项开放,这些选项通常是平台提供商用来向前兼容的。一些选项,比如函数调用惯例,可能在 vk_platform.h 头文件中的不同部分。

从三个视角讲解Vulkan

Vulkan图形系统是什么?

Vulkan是一个图形和计算硬件的API(Application Programming Interface)。 这个API由很多命令组成,它们允许程序员指定着色器程序,计算内核,对象和操作 产生高质量的图像,特别是三维对象的彩色图像。

程序员的视角看Vulkan

对程序员来讲,Vulkan是一些命令的集合,允许内核或者着色器,和shader执行的外部 Vulkan aspect控制,使用着色器程序或者着色器和数据。 通常,数据是指二维或者三维几何物体和纹理图像,着色器和内核控制数据的处理, 几何物体的光栅化,光栅化产生的光照和阴影的片段,及最终把几何对象渲染到帧缓冲区。

Khronos Group发布Vulkan API 1.1版本和SPIR-V 1.3规范

高性能跨平台图形接口Vulkan是用以取代OpenGL的新一代跨平台图形API,是继DX12之后的希望之星,Vulkan是开源的图形API,它承诺通过给予开发者访问硬件底层的能力而大幅提升3D应用的性能。Khronos Group宣布发布最新的Vulkan API 1.1版本,新版本同时增加了16-bit数据支持,新的保护性内容和子集操作功能,并且同时发布了SPIR-V编译器1.3规范。

1.1版本扩展了Vulkan的核心功能,融入了开发者要求的性能,例如子集操作,同时也融合了各种经验证的Vulkan 1.0扩展。Khronos将同时开源发布完整版本Vulkan 1.1 一致性测试,Imagination也将推出通过Vulkan 1.1 一致性测试的驱动。更多关于Vulkan 1.1规范及相关测试和工具的信息,请浏览Khronos Vulkan 资源页面 。

“通过不断增强的开发者工具、严谨的一致性测试和公开Vulkan生态系统论坛,Khronos在不断实现其目标,创建一个完整的、充满活力的Vulkan 生态系统,”ARM 杰出工程师兼Vulkan工作组主席Tom Olson讲到。“Vulkan 1.1 是对优化产业需求的响应,并展示了我们不断推出由开发者需求带动的功能扩展的承诺”。

Vulkan教程(16)Drawing a Triangle-Draw-Render and presentation

Rendering and presentation

接下来我们将使用drawFrame() 函数将三角形显示到屏幕上。

drawFrame()要做如下几件事:

1.从Swap Chain 请求一个image。

2.执行带有这个image的command buffer ,这个image曾被当做attachment存储在framebuffer中(Execute the command buffer with that image as attachment in the framebuffer)。

3.将image 返回到swap chain 等待显示。

虽然所有的操作都在一个函数里运行,但是它们的执行却是异步的,这个函数调用在它真正完成任务前就会返回,并且函数内部各个操作的执行顺序也不是确定的。这就产生了一个问题,因为我们希望后一个操作在前一个操作完成后才进行。

Vulkan教程(15)Drawing a Triangle-Draw-CommandBuffer

Command buffers(命令缓冲区)

在Vulkan中,像绘画命令、内存转换等操作并不是直接通过方法调用去完成的,而是需要把所有的操作放在Command Buffer 里。这样的一个好处就是:那些已设置好的具有难度的绘图工作都可以在多线程的情况下提前完成。

Command pools(命令池)

Command pools 管理Command buffer 的内存而且Command buffer 从Command pool中被创建。所以我们必须先来创建Command pool:

VDeleter<VkCommandPool> commandPool {device, vkDestroyCommandPool};
VkCommandPoolCreateInfo poolInfo = {};
poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily;

Vulkan教程(14)Drawing a Triangle-Draw-Framebuffer

上一篇:Vulakn教程(13)Drawing a Triangle-Pipeline-Render passes

Framebuffers

我们已在之前的章节中多次提到FrameBuffer 并且在创建Render Pass时,我们期望拥有一个和Swap Chain 里image具有相同格式(format)的FrameBuffer。 接下来我们就将创建这种FrameBufefr.

我们将attachments包裹在FrameBuffer中,FrameBuffer 通过引用VkImageView来关联所有的attachments。在我们案例中只有一个attachment : color attachment 。然而作为attachment的image取决于在显示的时候Swap Chain 到底返回的是哪一个image,这就意味着我们需要为Swap Chain里的每一个image 创建一个FrameBuffer。

std::vector<VDeleter<VkFramebuffer>> swapChainFramebuffers;

Vulakn教程(13)Drawing a Triangle-Pipeline-Render passes

Render Pass

在创建Pipeline 之前我们必须告诉Vulkan在渲染时要使用的FrameBuffer 附件(attachments),需要定义使用color buffer 以及 depth buffer attachments的数量,要使用多少个采样(samples)以及应该如何处理采样的内容。所有这些信息都可以填写在Render Pass里。

Attachment description

在我们的应用里只使用了一个color buffer attachment,我们用Swap Chain里的一个image 来表示这个buffer。先来看一下需要用到的结构:

typedef struct VkAttachmentDescription {
    VkAttachmentDescriptionFlags flags;
    VkFormat format;
    VkSampleCountFlagBits samples;
    VkAttachmentLoadOp loadOp;
    VkAttachmentStoreOp storeOp;

vulkan教程(12)Drawing a Triangle-Pipeline-Fixed function

Fixed functions

这一章节的内容主要是Pipeline中不可编程部分的配置。

Vertex input

VkPipelineVertexInputStateCreateInfo 代表我们传递给Vertex Shader 顶点数据的格式,它涉及以下两个方面:

1、顶点数据的描述(Bindings) :数据间的间隔,以及判断数据是顶点数据(pre-vertex)还是实例数据(pre-instance)。

2、顶点属性的描述(Attribute Descriptions):传入到Vertex Shader 里的属性(attributes)类型,从哪个Binding加载以及offset。

因为我们把顶点硬编码到Shader Code中了,所以这个结构先赋空值,当我们有需要的时候再回过头来重新审视这个结构。

VkPipelineVertexInputStateCreateInfo vertexInputInfo = {}; 
vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; 

vulkan教程(11)Drawing a Triangle-Pipeline-Shader Module

着色器模块 Shader modules

Vulkan 和之前的图形API有所不同,为了避免不同厂商移植代码的复杂性,Vulkan的着色器代码(shader code)采用字节码格式(bytecode) SPIR-V,而非人类可以阅读的文本格式,如GLSL(opengl 的一套体系)等。但这并不意味着我们要亲自手写字节码, 幸运的是LunarG SDK 已经提供了glslangValidator.exe ,这个程序已经在你的安装目录中了,所以我们在编写着色器程序的时候任然使用我们所熟悉的GLSL格式,glslangValidator.exe 将为我们把GLSL转换成SPIR-V。

上一篇:vulkan教程(10)Drawing a Triangle-Pipeline-Introduction

Vertex shader

同步内容
--电子创新网--
粤ICP备12070055号