本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处
文章链接: https://zhuanlan.zhihu.com/p/35974789
题图背景来自《战神4》。
系列文章前言
我们知道,《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》组成的饕餮盛宴,共11本书,合称“GPU精粹三部曲“,是游戏开发、计算机图形学和渲染领域的业界顶尖大牛们一线经验的合辑汇编,是江湖各大门派武林绝学经典招式的精华荟萃,是了解业界各种高阶知识和技法Trick,将自己的游戏开发、图形学与渲染能力提升到下一个高度的捷径。
本文将总结提炼“GPU精粹三部曲“11本书中的第一本《GPU Gems 1》全书的核心内容,是【GPU精粹与Shader编程】系列文章正篇的第一篇,全文共1万5千余字。
本文内容关键词:
- 真实感水体渲染(Realistic Water Rendering)
- 真实感皮肤渲染(Realistic Skin Rendering)
- 无尽草地的渲染(Rendering Countless Blades of Waving Grass)
- 水焦散渲染(Rendering Water Caustics)
- 面部表情模拟(Facial expression simulation)
- Perlin噪声(Perlin Noise)
- 火焰的渲染(Fire Rendering)
- 衍射的模拟(Simulating Diffraction)
- 阴影的渲染(Shadow Rendering)
- 电影级光照(Cinematic Lighting)
- 阴影贴图抗锯齿(Shadow Map Antialiasing)
- 全方位阴影贴图(Omnidirectional Shadow Mapping)
为什么要分成上下两篇?
原本计划,是将整本书的提炼总结一次性更新,总字数3万字。但很遗憾,当我将整本书的提炼内容3万字贴到文本编辑器中,内容排版都已经基本完成时,发现文本编辑器下方直接提示已超出1万6千字....
这时我才发现,原来知乎专栏的单篇文章,其实也是有字数限制的,大概1万多汉字的样子。
所以,原本全文3万字的整本书的提炼总结文章,将分为上下两部分发布。
今天暂且发布上半部分,而下半部分的内容,则可以经过进一步的优化提炼,在下次更新中发布。
不过话说回来,上半部分也已经超过1万5字,内容方面,应该完全够看了。
GitHub上已更新完整的上下两篇
GitHub上自然是不会像知乎专栏这样有单篇文章1万多字字数限制的,所以全部的3万字已经更新,想提前看3万字完整版的同学请戳GitHub链接:
QianMo/Game-Programmer-Study-Notes
系列文章风格说明
为了让每篇文章的干货更足,内容更加详实,本文与后续文章的的写作风格与文章结构,将在系列文章开篇中的规划的写作风格的基础上,做一些微调。
具体是将每篇需要提炼的章节内容分为两大部分:
- 主核心内容
- 次核心内容
其中,主核心内容,将选取大家最感兴趣、最有提炼价值的渲染相关的内容,会用更加详细的篇幅进行提炼总结。每章主核心内容将包含五个部分:
- 【章节概览】
- 【核心内容提炼】
- 【核心要点总结】
- 【本章配套代码汇总表】
- 【关键词提炼】
而次核心内容,则会用更加精炼的篇幅进行总结。每部分将包含:
- 【章节概览】
- 【核心要点】
- 【本章配套代码汇总表】
- 【关键词提炼】
目录 · 核心内容导航Highlight
【说明】上文已经说明,因为知乎专栏的字数限制,导致原本3万字的内容需要分成两次发布,下文目录中加粗标题为本文将包括的内容,非加粗的标题将在下次的文章中发布。
对《GPU Gems 1》全书核心内容,将进行重点提炼总结的主核心内容有:
- 一、用物理模型进行高效的水模拟(Effective Water Simulation from Physical
Models) - 二、Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)
- 三、无尽波动的草地叶片的渲染(Rendering Countless Blades of Waving Grass)
- 四、次表面散射的实时近似(Real-Time Approximations to Subsurface
Scattering) - 五、环境光遮蔽(Ambient Occlusion)
对《GPU Gems 1》全书核心内容,将进行提炼总结的次核心内容有:
- 六、水焦散的渲染 (Rendering Water Caustics)
- 七、 Dawn Demo中的动画(Animation in the "Dawn" Demo)
- 八、 改良的Perlin噪声实现(Implementing Improved Perlin Noise)
- 九、Vulcan Demo中的火焰渲染(Fire in the "Vulcan" Demo)
- 十、衍射的模拟(Simulating Diffraction)
- 十一、高效的阴影体渲染(Efficient Shadow Volume Rendering)
- 十二、电影级光照(Cinematic Lighting)
- 十三、阴影贴图抗锯齿(Shadow Map Antialiasing)
- 十四、全方位阴影映射(Omnidirectional Shadow Mapping)
- 十五、使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion
Interval Maps) - 十六、透视阴影贴图(Perspective Shadow Maps: Care and Feeding)
- 十七、逐像素光照的可见性管理(Managing Visibility for Per-Pixel Lighting)
- 十八、空间BRDF(Spatial BRDFs)
- 十九、基于图像的光照(Image-Based Lighting)
- 二十、纹理爆炸(Texture Bombing)
- 二十一、实时辉光(Real-Time Glow)
- 二十二、颜色控制(Color Controls)
- 二十三、景深 (Depth of Field)
- 二十四、高品质的图像滤波(High-Quality Filtering)
- 二十五、用纹理贴图进行快速滤波宽度的计算(Fast Filter-Width Estimates with
Texture Maps) - 二十六、OpenEXR图像文件格式(The OpenEXR Image File Format)
《GPU Gems 1》其书
《GPU Gems 1》英文原版出版于2004年4月,中文版《GPU精粹1》出版于2006年1月。需要说明的是,书中很多内容放到今天,并不过时,仍然很有研究、学习、运用、实践的价值。尤其是水体渲染,皮肤渲染,次表面散射、阴影渲染、后处理相关的章节。
图 《GPU Gems 1》封面
图 全书内容概览图
《GPU Gems 1》随书配套资源与源代码下载
这一节提供了《GPU Gems 1》随书的配套资源,以及源代码的下载地址。
PS:配套的不少工程中不仅包含完整的源码,也直接包含经过编译后的exe执行文件,可以直接运行后查看效果。
NVIDIA官方网站上<GPU Gems>1~3 Web版的url变更有几次了,下面的链接,是目前最稳定版本。
- 原书全文的Web版本:
https://developer.nvidia.com/gpugems/GPUGems/gpugems_pref01.html
- 原书配套源代码、工程与资源下载:
http://http.download.nvidia.com/developer/GPU_Gems/CD_Image/Index.html
图 配套资源的截图
- 另外,我维护了的一个名为“GPU-Gems-CD-Content”的GitHub仓库,以备份这些珍贵的资源,也方便直接在GitHub Web端查看大牛们写的代码:
【Github】QianMo/GPU-Gems-CD-Content
第一部分 · 主核心内容提炼总结
一、 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)
【内容概览】
本章介绍了在GPU中模拟和渲染大型水体的一些方法,并且提出了改进反射的一些有用技巧。
文章由计算简单的正弦函数之和来对水面进行近似模拟开始,逐步扩展到更复杂的函数如Gerstner波,也扩展到像素着色器。主要思路是使用周期波的加和,来创建动态的平铺(tiling)凹凸贴图,从而获得优质的水面细节。
这章也集中解释了水体渲染与模拟系统中常用参数的物理意义,说明了用正弦波之和等方法来近似水面的要点。
图 基于文中水体技术渲染的Uru:Ages Beyond Myst中的场景
【核心内容提炼】
1.1 背景与范围
《GPU Gems 1》出版于2004年,在这几年间,实时渲染技术渐渐从离线渲染领域中分离,自成一派。
而《GPU Gems 1》中收录的这篇文章问世期间,快速傅里叶变换(Fast Fourier
Transform,FFT)库已经能用于顶点和像素着色器中。同时,运行于GPU上的水体模拟的模型也得到了改进。Isidoro等人在2002年提出了在一个顶点着色器中加和4个正弦波以计算水面的高度和方位的思路。另外,Laeuchi在2002年也发表了一个使用3个Gerstner波计算水面高度的着色器。
图 基于快速傅里叶变换的水体渲染
1.2 水体渲染的思路
文中对水体渲染的思路,运行了两个表面模拟:一个用于表面网格的几何波动,另一个是网格上法线图的扰动。这两个模拟本质上是相同的。而水面高度由简单的周期波叠加表示。
正弦函数叠加后得到了一个连续的函数,这个函数描述了水面上所有点的高度和方向。在处理顶点时,基于每个顶点的水平位置对函数取样,使得网格细分形成连续水面。在几何分辨率之下,将该技术继续应用于纹理空间。通过对近似正弦叠加的法线取样,用简单像素着色器渲染到渲染目标纹理(render target texture),从而产生表面的法线图。对每帧渲染法线图,允许有限数量的正弦波组相互独立地运动,这大大提高了渲染的逼真度。
而直接叠加正弦波产生的波浪有太多的“簸荡(roll)”,而真实的波峰比较尖,波谷比较宽。事实证明,正弦函数有一个简单的变体,可以很好地控制这个效果。
1.2.1 波的选择
对于