Vulkan是新一代的图形和计算API,是Khronos推出的产品。该API继承自OpenGL,为开发者提供了极大的灵活性与高性能。 本书将首先介绍Vulkan系统的基本原理,尝试与硬件设备进行连接并查询可用的队列、内存类型,以及提供的功能。Vulkan很冗长,所以在深入编程之前,开发者需要首先理解相关的调试技巧,这样即使是新手也可以使用Vulkan的层和扩展特性来排除一些常见错误。 通过阅读本书,你将学到: 学习Vulkan编程模型的基本知识,理解现代GPU设备的基本功能。 实现设备、指令缓存,以及队列的功能,与物理硬件设备进行连接。 了解Vulkan中的验证层概念,学习调试方法与技巧。 深入理解内存管理的知识,控制宿主机和设备端的内存操作。 理解和实现缓存与图像资源的类型。使用线性和优化类型的纹理。 定义渲染通道中的绘制操作,实现完整的图形流水线。 通过SPIR-V管理GLSL着色器,使用描述符集和推送常数来更新着色器资源。 学习绘制的过程、同步资源,并通过交换链将3D场景渲染到屏幕上。 敏德·辛格(Parminder Singh)新加坡Blackmagic Design公司的计算机图形学工程师。在过去的十年里,他一直致力于网络模拟、几何建模、导航、自动驾驶、信息娱乐系统、图像处理及后期制作等领域的图形学软件开发。他的研究主要包括泛图形的GPU编程、通用计算,平台移植以及性能优化技术。 第1章 开始学习新一代3D图形API 11.1 Vulkan及其演化史11.2 Vulkan与OpenGL的对比21.3 重要术语41.4 Vulkan的原理51.4.1 Vulkan的执行模型51.4.2 Vulkan的队列61.4.3 对象模型71.4.4 对象生命周期与指令语法71.4.5 错误检查与验证81.5 理解Vulkan应用程序8 1.5.1 驱动81.5.2 应用程序91.5.3 WSI91.5.4 SPIR-V91.5.5 LunarG SDK91.6 开始学习Vulkan编程模型91.6.1 硬件初始化101.6.2 窗口展示表面111.6.3 资源设置121.6.4 流水线设置141.7 总结18 第2章 你的第一个Vulkan伪代码程序192.1 Vulkan的安装192.2 Hello World伪代码202.2.1 初始化—与设备握手的过程212.2.2 交换链初始化—查询WSI扩展242.2.3 着色器支持—将着色器编译到SPIR-V322.2.4 构建布局—描述符与流水线布局332.2.5 创建渲染通道—定义通道属性342.2.6 帧缓存—将绘制图像关联到渲染通道352.2.7 产生几何体—在GPU内存中保存一个顶点362.2.8 流水线状态管理—创建流水线382.2.9 执行渲染通道—显示Hello World!!!412.2.10 队列的提交和同步—发送任务432.2.11 使用展示层进行显示—渲染三角形442.3 全部整合到一起452.4 总结46 第3章 连接硬件设备473.1 学习使用LunarG SDK483.2 使用CMake设置我们的第一个工程493.3 扩展简介533.4 创建一个Vulkan实例583.5 理解物理设备和逻辑设备653.5.1 物理设备653.5.2 逻辑设备693.6 理解队列和队列族713.6.1 查询队列族723.6.2 创建队列743.7 整合设备和队列的代码763.8 总结78 第4章 调试Vulkan程序804.1 初探Vulkan中的调试方法814.2 了解LunarG验证层及其特性824.3 在Vulkan程序中实现调试834.4 总结90 第5章 Vulkan中的指令缓存和内存管理915.1 开始使用指令缓存915.1.1 显式同步925.1.2 指令缓存中的指令类型935.1.3 指令缓存与队列945.2 理解指令池和指令缓存API945.2.1 创建指令池955.2.2 指令缓存的分配975.3 记录指令缓存995.3.1 队列提交1005.3.2 队列等待1015.4 实现指令缓存的封装类1015.4.1 实现指令缓存的分配过程1025.4.2 记录指令缓存的分配过程1035.4.3 提交指令到队列1045.5 管理Vulkan内存1055.5.1 宿主机内存1055.5.2 设备内存1065.5.3 分配设备内存1085.5.4 释放设备内存1105.5.5 从宿主机访问设备内存1105.5.6 延迟分配内存1115.6 总结112 第6章 图像资源分配与交换链构建1136.1 什么是图像资源1136.2 了解图像资源1166.2.1 创建图像1166.2.2 理解图像的布局1206.2.3 创建图像视图1216.3 内存分配和图像资源的绑定1226.3.1 获取内存分配的需求条件1236.3.2 在设备端分配物理内存1236.3.3 将分配的内存绑定到图像对象1246.4 交换链简介1246.4.1 了解交换链实现的工作流1256.4.2 交换链实现类的框图1276.4.3 渲染器—窗口管理的自定义类1276.4.4 VulkanSwapChain—交换链的管理类1326.4.5 使用WSI创建表面并关联到窗口1356.4.6 支持画面展示的图形队列1376.4.7 查询交换链的图像格式1386.4.8 创建交换链1396.5 创建一个深度图1476.5.1 平铺简介1476.5.2 创建深度缓存图像对象1496.5.3 获取深度图的内存需求1506.5.4 判断内存的类型1516.5.5 将物理内存分配并绑定到深度图像1516.5.6 图像布局变换1526.5.7 图像布局变换与内存屏障1526.5.8 创建图像视图1566.6 总结程序流程1576.6.1 初始化1576.6.2 渲染—显示输出窗口1586.7 总结158 第7章 缓存资源、渲染通道、帧缓存以及SPIR-V着色器1607.1 理解Vulkan的缓存资源类型1617.1.1 创建缓存资源对象1617.1.2 创建缓存视图1627.2 使用缓存资源创建几何体1647.2.1 准备几何体数据1647.2.2 创建顶点缓存1647.2.3 缓存创建概述1657.2.4 实现一个缓存资源—创建几何体的顶点缓存1667.2.5 理解代码流线1697.3 理解渲染通道1717.3.1 附件1717.3.2 子通道1727.3.3 渲染通道对应的Vulkan API1727.3.4 实现渲染通道1767.4 使用渲染通道来创建帧缓存1797.5 清除背景颜色1827.5.1 设置渲染通道实例的背景颜色1837.5.2 渲染颜色背景1857.6 在Vulkan中实现着色器1867.6.1 SPIR-V简介1877.6.2 将GLSL着色器编译为SPIR-V1887.6.3 实现着色器1907.7 总结197 第8章 流水线和流水线状态管理1998.1 开始学习流水线1998.2 通过PCO缓冲流
阅读更多