新書推薦:

《
人体脂肪的秘密
》
售價:HK$
352

《
社会史:理论与实践(增订版)(德国著名社会史学家于尔根·科卡重要文集。全面展现德国社会史学派的兴起与
》
售價:HK$
500

《
津巴多时间心理学 首次系统论述时间观疗法 菲利普·津巴多 著 自我觉察 活在当下 津巴多 心理学 当
》
售價:HK$
352

《
亲爱的族人:菲利普王之战的新叙事(横扫北美史学界各项大奖 以印第安女王视角重写北美大陆的反殖民之战)
》
售價:HK$
653

《
中国古代货币思想史
》
售價:HK$
434

《
什么是新疆
》
售價:HK$
908

《
多资产多策略投资实战
》
售價:HK$
454

《
乳腺整合肿瘤学 国际经典乳腺肿瘤学译著 一部聚焦乳腺肿瘤综合治疗的实用专著
》
售價:HK$
653
|
編輯推薦: |
还在为传统图形API性能瓶颈发愁? 想在图形技术领域占据优势? 《Vulkan图形编程》专为突破这一难题而来!作者结合AMD、The Multiplayer Group一线经验,从Raptor引擎基础架构讲起,逐步深入异步计算、网格着色器、稀疏资源等核心技术,更覆盖光线追踪、时间抗锯齿等前沿内容。每章都有可落地的实战代码(GitHub可获取)。无论你是游戏开发者还是图形工程师,都能借助书中技术构建高性能渲染引擎,轻松应对多光源、体积雾等复杂场景,适配Windows/Linu双平台,助力项目高效落地。
|
內容簡介: |
本书深入探讨Vulkan图形编程技术,助力读者掌握构建渲染引擎的技术、实现和算法优化。本书从开发渲染框架基础入手,引导读者学习利用Vulkan高级功能编写现代渲染引擎。具体涵盖自动化资源绑定和依赖管理、运用GPU驱动渲染技术扩展场景规模、熟悉光线追踪技术、提升渲染图像视觉质量等内容。通过学习本书,读者能够全面了解现代渲染引擎内部工作原理,掌握实现先进渲染效果的图形技术,所开发的框架还可作为未来实践的起点,适合有图形编程基础且希望深入学习Vulkan的开发者阅读。
|
關於作者: |
马可·卡斯托瑞纳(Marco Castorina)AMD的游戏图形性能团队技术专家,最初在Samsung担任驱动开发人员时开始熟悉Vulkan。后来,他为一家领先的媒体服务器公司从零开始开发了一个2D和3D渲染器。加布里埃尔·萨松(Gabriel Sassone)The Multiplayer Group首席渲染工程师,渲染技术专家。他之前在Avalanche Studios工作时首次接触Vulkan,并为专有的Ape引擎及其Google Stadia端口开发了Vulkan层。他曾在ReadyAtDawn、Codemasters、FrameStudios以及一些其他非游戏技术公司工作过。
|
目錄:
|
目 录译者序致谢前言关于作者关于审校者第一部分 现代渲染引擎的基础知识第1章 Raptor引擎和Hydra工程概述 21.1 技术要求 21.1.1 Windows 31.1.2 Linu 31.1.3 macOS 41.2 如何阅读本书 51.3 理解代码结构 51.4 理解glTF场景格式 121.5 PBR技术简介 181.6 关于GPU调试的说明 201.7 总结 221.8 扩展阅读 23第2章 优化资源管理 242.1 技术要求 242.2 解锁和实现无绑定渲染 242.2.1 检查支持情况 252.2.2 创建描述符池 262.2.3 更新描述符集 282.2.4 更新着色器代码 302.3 自动化流水线布局生成 312.3.1 将GLSL编译为SPIR-V 312.3.2 理解SPIR-V的输出内容 332.3.3 从SPIR-V到流水线布局 352.4 通过流水线缓冲区减少加载时间 392.5 总结 422.6 扩展阅读 42第3章 解锁多线程技术 433.1 技术要求 443.2 使用enkiTS实现基于任务的多线程 443.2.1 为什么使用基于任务的并行机制 443.2.2 使用enkiTS(任务调度器)库 453.3 异步加载 463.3.1 创建I/O线程和任务 473.3.2 Vulkan队列及第一条并行指令生成 493.3.3 AsynchronousLoader类 523.4 在多个线程上记录命令 573.4.1 分配策略 583.4.2 命令缓冲区回收 583.4.3 主命令缓冲区与次命令缓冲区 593.4.4 使用主命令缓冲区进行绘制 593.4.5 使用次命令缓冲区进行绘制 603.4.6 生成多个任务以记录命令缓冲区 613.5 总结 623.6 扩展阅读 63第4章 实现帧图 644.1 技术要求 644.2 理解帧图 644.2.1 构建图 654.2.2 数据驱动的方法 664.2.3 实现帧图 684.2.4 实现拓扑排序 704.2.5 通过帧图驱动渲染 774.3 总结 794.4 扩展阅读 80第5章 解锁异步计算技术 815.1 技术要求 815.2 用单一时间线信号量替换多栅栏 815.2.1 启用时间线信号量扩展 825.2.2 创建时间线信号量 845.2.3 在CPU上等待时间线信号量 845.2.4 在GPU上使用时间线信号量 855.3 添加一个用于异步计算的单独队列 865.4 通过异步计算实现布料模拟 895.4.1 使用计算着色器的好处 895.4.2 计算着色器概述 895.4.3 编写计算着色器 905.5 总结 955.6 扩展阅读 95第二部分 GPU驱动的渲染第6章 GPU驱动的渲染 986.1 技术要求 996.2 将大型几何体网格分解成网格单元 996.3 了解任务着色器和网格着色器 1036.3.1 实现任务着色器 1046.3.2 实现网格着色器 1076.4 使用计算着色器进行GPU端的剔除 1096.4.1 深度金字塔生成 1106.4.2 遮挡剔除 1116.5 总结 1146.6 扩展阅读 114第7章 使用集群延迟渲染技术处理多光源 1167.1 技术要求 1167.2 集群照明方案的简要历史 1167.3 实现一个G-Buffer缓冲区 1207.4 实现光照集群 1257.4.1 CPU端的光源分配 1257.4.2 GPU端的光源处理 1307.5 总结 1317.6 扩展阅读 132第8章 使用网格着色器添加阴影 1338.1 技术要求 1338.2 阴影技术的简要历史 1338.2.1 阴影体积法 1348.2.2 阴影映射法 1348.2.3 光线追踪阴影 1348.3 使用网格着色器实现阴影映射 1358.3.1 概述 1358.3.2 立方体贴图阴影 1368.3.3 关于多视图渲染的说明 1378.3.4 逐光源进行网格实例剔除 1378.3.5 间接绘制命令的生成 1398.3.6 阴影立方体贴图面的剔除 1408.3.7 网格单元阴影渲染:任务着色器 1418.3.8 网格单元阴影渲染:网格着色器 1448.3.9 阴影图采样 1458.4 利用Vulkan的稀疏资源机制优化阴影内存 1468.4.1 创建和分配稀疏纹理 1478.4.2 选择每个光源的阴影内存使用方案 1498.4.3 渲染到稀疏阴影图 1528.5 总结 1548.6 扩展阅读 154第9章 实现可变速率着色 1569.1 技术要求 1569.2 介绍可变速率着色技术 1569.3 使用Vulkan API集成可变速率着色 1589.4 利用特化常量 1619.5 总结 1649.6 扩展阅读 164第10章 添加体积雾效果 16510.1 技术要求 16610.2 介绍体积雾渲染 16610.2.1 体积渲染 16610.2.2 体积雾 16710.3 实现体积雾渲染 17010.3.1 数据注入 17010.3.2 计算光照贡献 17110.3.3 集成散射和消光效果 17310.3.4 将体积雾应用到场景 17410.3.5 添加滤波器 17510.3.6 体积噪声生成 17810.3.7 蓝噪声 17810.4 总结 17910.5 扩展阅读 180第三部分 高级渲染技术第11章 时间抗锯齿技术 18211.1 技术要求 18311.2 概述 18311.3 最简单的时间抗锯齿实现 18511.3.1 相机抖动 18511.3.2 选择抖动序列 18611.3.3 添加运动向量 18711.3.4 初步的实现代码 18811.4 改进时间抗锯齿技术 18911.4.1 重投影 18911.4.2 历史采样 19011.4.3 场景采样 19111.4.4 历史约束 19211.4.5 解析 19311.5 锐化图像 19511.5.1 后处理的图像锐化 19511.5.2 负MIP偏差 19611.5.3 消除纹理UV的抖动 19611.6 改善条带效应 19611.7 总结 19711.8 扩展阅读 198第12章 开始使用光线追踪 19912.1 技术要求 19912.2 Vulkan中光线追踪技术的简介 19912.3 构建BLAS和TLAS 20112.4 定义并创建光线追踪流水线 20612.5 总结 21212.6 扩展阅读 212第13章 基于光线追踪重新审视阴影 21413.1 技术要求 21413.2 实现简单的光线追踪阴影 21413.3 改进光线追踪阴影 21613.3.1 运动向量 21613.3.2 计算可见性方差 21713.3.3 计算可见性 21813.3.4 计算滤波后的可见性 22313.3.5 使用滤波后的可见性 22413.4 总结 22513.5 扩展阅读 225第14章 基于光线追踪增加动态漫反射全局照明 22614.1 技术要求 22714.2 间接照明简介 22714.3 动态漫反射全局照明简介 22814.3.1 对每个探针执行光线追踪 22914.3.2 探针偏移 23014.3.3 探针辐照度和可见性更新 23014.3.4 探针采样 23214.4 实现动态漫反射全局照明 23214.4.1 光线生成着色器 23214.4.2 光线命中着色器 23314.4.3 光线未命中着色器 23514.4.4 探针辐照度和可见性更新着色器 23514.4.5 间接照明采样 23914.4.6 对calculate_lighting方法的修改 24314.4.7 探针偏移着色器 24314.5 总结 24714.6 扩展阅读 247第15章 基于光线追踪增加反射效果 24915.1 技术要求 24915.2 屏幕空间反射的工作原理 25015.3 实现基于光线追踪的反射 25115.4 实现去噪器 25515.5 总结 26015.6 扩展阅读 260
|
內容試閱:
|
前 言Vulkan现已成为一个成熟且灵活的多平台图形API(应用程序接口)。它已被许多行业采用,包括游戏开发、医学成像、电影制作和媒体播放。学习Vulkan是理解现代图形API在桌面和移动设备上如何工作的基础步骤。在本书中,你将从开发渲染框架的基础开始。你将学习如何利用Vulkan的高级功能来编写现代渲染引擎,了解如何自动化资源绑定和依赖管理。然后,你将利用GPU驱动的渲染技术来扩展场景规模,最后,你将熟悉光线追踪技术,该技术能显著提升你所渲染图像的视觉质量。在本书的最后,你将全面了解现代渲染引擎的内部工作原理,以及用于实现最先进效果的图形技术。本书中开发的框架将成为你未来所有实践的起点。本书适用对象本书适合所有图形和游戏开发者阅读,尤其是那些希望深入了解如何使用Vulkan编写高性能现代渲染引擎的人。读者应熟悉图形编程的基本概念(即矩阵和向量),并且具有Vulkan的基础知识。本书内容介绍第1章介绍框架的结构,提供主要组件的概览。接着,我们将看到如何为Windows和Linu编译代码。第2章通过将渲染器转向使用无绑定纹理(bindless teture)来简化渲染纹理的管理。我们还将通过解析生成的SPIR-V来自动化流水线布局(pipeline layout)的生成,并展示如何实现流水线缓存(pipeline caching)。第3章详细介绍基于任务的并行执行(task-based parallelism)概念,这将帮助我们利用多核心。我们将利用这种技术异步加载资源,并且并行记录多个命令缓冲区(command buffer)。第4章帮助我们开发帧图(frame graph),这是一种数据结构,用于存储我们的渲染通道(render pass)及其相互依赖关系。我们将利用这种数据结构来自动化资源屏障(resource barrier)的放置,并通过资源别名(resource aliasing)提高内存使用率。第5章展示如何在Vulkan中利用异步计算队列。我们介绍时间线信号量(timeline semaphore),这会使队列同步管理变得更加简单。最后,我们实现一个简单的布料模拟,它将在一个单独的队列上运行。第6章将渲染器从网格(mesh)转换为网格单元(meshlet),网格单元是用于实现GPU剔除的小块三角形。我们将介绍网格着色器(mesh shader)并解释如何利用它们来实现现代剔除技术。第7章描述G-Buffer实现,然后转向集群光源渲染。我们将展示如何利用屏幕瓦片和深度分桶(depth binning)来实现高效的渲染。第8章提供阴影技术的简要历史,然后介绍我们选择的方法。我们利用自己的网格单元和网格着色器支持来高效地渲染立方体贴图阴影图(cubemap shadowmap)。我们还将展示如何使用稀疏资源(sparse resource)来减少内存使用。第9章提供可变速率着色的概述,并解释它为什么有用。接着,我们将描述如何使用Vulkan扩展将这项技术添加到渲染器中。第10章从第一性原理实现了一个体积雾效果。然后,我们将讨论空间和时间滤波(spatial and temporal filtering)技术以提高最终效果的质量。第11章简要回顾抗锯齿技术的发展历史。接着,我们将描述实现一个稳健的时间性抗锯齿解决方案所需的所有步骤。第12章概述使用Vulkan中的光线追踪(ray tracing)技术扩展所需的关键概念。然后,我们将提供创建光线追踪流水线、着色器绑定表和加速结构的实现细节。第13章提供一个使用光线追踪的阴影实现替代方案。我们将描述一个算法,该算法利用每个光源的动态光线数量,配合空间和时间滤波器产生稳定的效果。第14章涉及在场景中添加全局照明。我们将描述如何使用光线追踪生成探针数据,并提供一个最小化光泄漏的解决方案。第15章简要介绍屏幕空间反射及其不足之处。然后,我们将描述实现的光线追踪反射(ray-traced reflection)。最后,我们将实现一个去噪器,使结果可用于最终的光照计算。如何充分利用本书本书假定读者熟悉Vulkan或其他现代渲染API(如Direct 12或Metal)的基本概念,能够熟练编辑和编译C或 C++代码以及GLSL(OpenGL Shading Language)着色器代码。本书使用的软件版本 本书使用的操作系统Vulkan 1.2 Windows或Linu你需要一个支持C++17的C++编译器。系统上还需要安装最新版本的Vulkan SDK。我们会提供Visual Studio解决方案以及用于编译项目的CMake文件。如果你正在使用本书的数字版本,我们建议你自己输入代码或从本书的GitHub仓库(下一小节有链接)获取代码。这样做可以帮助你避免复制和粘贴代码时可能出现的错误。对于每一章,我们建议你运行代码并确保自己理解其工作原理。每一章都在前一章概念的基础上进行构建,重要的是要在继续之前消化这些概念。我们还建议你自己进行修改,以尝试不同的方法。下载示例代码文件你可以从GitHub上下载本书的示例代码文件,网址为https://github.com/PacktPublishing/Mastering-Graphics-Programming-with-Vulkan。如果代码有更新,GitHub仓库也会同步更新。下载彩色图片我们还提供了一个包含本书彩色截图和图表的PDF文件。你可以在此处下载:https://packt.link/ht2jV。排版约定本书中使用了以下排版约定。代码体:表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和Twitter用户名。这里有一个例子:“针对每种资源类型,我们在DescriptorSetCreation对象上调用相应的方法。”代码块如下所示:当我们希望你关注代码块某个特定部分时,相关的行或项会被设置为粗体:任何命令行输入或输出都如下所示:加粗:表示新术语、重要词汇或屏幕上显示的词语。例如,菜单或对话框中的词语会以加粗形式出现。这里有一个例子:“我们通过单击Launch(启动)来启动应用程序,然后我们会看到一个覆盖页面,其中会显示帧时间和渲染的帧数。”提示或重要说明提示内容。
|
|