【前言】
本书将帮助你从零开始学习Vulkan。Vulkan是新一代的跨平台图形和计算API接口。尽管它是以OpenGL API的继承者的身份出现的,但是它实际上是一套经过了底层全部重新设计的API,可以满足使用者的更多竞争性需求,并且与底层GPU硬件之间的联系更为紧密。Vulkan是一套可以对GPU硬件设置进行控制的软件接口,并且充分使用了硬件并行计算的能力。Vulkan的设备驱动层非常轻量化,它把更多的权力交到了应用软件开发者的手里,从而实现应用程序和资源的管理、内存的管理、同步等功能,这一显式特性使Vulkan显得有些烦琐。本书将手把手地帮助初学者逐步掌握这些内容,通过简单易懂的例子来完成每个章节的学习。本书的各个章节之间是循序渐进的,新的一章总是构建于前一章的内容之上,这样读者可以更好地理解各个功能模块之间的细节差异。
Vulkan API的学习显然需要读者对计算机图形学和通用计算方面有一定的理解,然后才可以开始进行程序的开发。本书中会直接用到很多通用的概念和术语。
本书实战性很强,目的就是帮助读者学习Vulkan的思想、概念以及API标准,并且通过随书的案例来进行实践。本书中涉及大量的参考文献,读者可以从中了解到更多的相关概念,在学习和实践过程中巩固自己的基础知识。
【本书内容】
●第1章将介绍Vulkan API的一些基础知识,并且通过与它的前身OpenGL API进行比较的方式,对Vulkan的一些核心特性进行概述。该章会涵盖Vulkan编程过程中必须了解的基础、概念、应用程序模型以及技术术语,这些对于初次接触Vulkan的学习者来说至关重要。你可以快速地概览Vulkan的编程模型,了解每一个模块的主要作用和学习要点。
●第2章将帮助你用伪代码的方法编写一个简单的Hello World程序。初学者可以感受Vulkan编程的基本方法,并且逐步地学会构建第一个Vulkan应用程序。你还可以从该章中了解安装必需软件以及SDK的方法。
●第3章将带你设置开发环境来构建你的第一个Vulkan案例。你可以创建一个Vulkan实例并初始化程序;还可以连接物理硬件设备,探索该设备所提供的不同队列,查询各个可用的层和扩展。该章会详细地讲解设备队列和队列族的概念,以及它与逻辑设备的关系。
●第4章将介绍Vulkan应用程序中进行调试的方法。Vulkan允许我们通过验证层来进行调试。该章我们会讨论每种验证层的功能并编写一个简单的例子来实际理解调试的过程。此外,我们还会查询层的扩展属性,以便增加更多的功能。这些功能可能并非是Vulkan标准中定义的。
●第5章将深入讨论和实现Vulkan中的指令缓存。读者将了解到指令池的作用,并学习如何使用Vulkann中的指令缓存进行录制。该章的后半部分会介绍Vulkan中的内存管理。你将深入理解设备内存,并学习GPU内存的分配和销毁操作,理解CPU和GPU内存之间的映射关系。
●第6章将介绍图像资源的概念,并讨论相关内存管理的概念,包括图像的创建、分配、绑定和映射。我们会使用这种方法来创建一个深度图像,以便进行深度测试。该章将介绍WSI交换链,使用它来实现渲染可绘制对象并展示到屏幕的功能。我们会尝试获取交换链的颜色图像,并创建颜色视图以便用于绘制图元。
●第7章将讨论缓存资源及其相关用途,即可绘制对象的几何体顶点缓存的构建。该章会详细地介绍使用渲染通道定义绘制操作的相关工作的方法,并使用多个附件和子通道。我们将使用渲染通道在Vulkan中实现帧缓存,并使用一个简单的示例演示如何清除背景颜色。在该章的结尾部分,我们将使用SPIR-V实现第一个Vulkan着色器程序。我们会学习一些SDK工具的用法,将GLSL代码转换为SPIR-V的中间语言格式。
●第8章将介绍Vulkan中的计算流水线和图形流水线。该章将会对图形流水线的流程做一个概述,并且涵盖整个流程中所用到的各个模块的作用讲解。我们将讨论流水线状态对象、流水线缓冲对象,以及流水线布局。该章还包含所有流水线状态的介绍,包括动态状态、输入装配(以及图元绘制)、光栅化、融混、视口、深度/模板测试,以及多重采样。我们将使用这些状态对象来实现一个完整的图形流水线。
●第9章将全面地介绍Vulkan中对象绘制的过程。我们将录制和执行绘制物体的指令缓存。录制过程中的视口和几何体数据将关联到渲染通道、帧缓存,以及流水线。指令缓存的执行过程包括将指令缓存提交到设备队列,以及将交换链图像提交给展示引擎。我们还将讨论Vulkan中的同步机制,并理解有关栅栏、信号量,以及内存屏障的知识。此外,我们还会介绍如何绘制相关的API并通过一些简单的案例演示它们的用法。
●第10章将介绍Vulkan程序中对着色器资源进行更新的过程,这里用到了描述符和推送常数的概念。我们会讨论描述符池以及描述符集布局的创建过程。读者将从中学到有关流水线布局的用法,并使用描述符来更新设备内存端的缓存资源,以及将更新后的几何体渲染到屏幕上。与描述符不同的是,推送常数并不会使用指令缓存,而是使用一种更为优化的方式来更新资源。用户可以尝试实现一个简单的程序来深入理解推送常数的相关知识。
●第11章将尝试使用更为真实的方法,即贴敷纹理来渲染3D可绘制对象。用户将会学习如何创建图像资源并为它设置采样器对象,还将学习使用线性和优化平铺的方式来更新纹理。在优化平铺的模式下,用户还需要考虑使用传输缓存和图像内存的指令方法。
【本书的目标读者】
本书适用于对跨平台、高性能的图形开发,以及桌面级和嵌入式的计算程序开发技术感兴趣的读者。读者需要对C/C++编程有较为深入的理解,同时具备一定的实际开发经验,还需要具备一些图形学和计算领域的知识和经验,以便更好地理解Vulkan中的概念。
【下载示例代码及彩色图像】
本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。