本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处
文章链接: https://zhuanlan.zhihu.com/p/44671434
本文是【GPU精粹与Shader编程】系列的第七篇文章。文章盘点、提炼和总结了《GPU Gems 3》全书总计28章的核心内容。
同时这篇文章,也是【GPU精粹与Shader编程】系列文章对GPU精粹三部曲中《GPU Gems》、《GPU Gems 2》、《GPU Gems 3》组成的第一部曲的完结篇,是一个短暂的里程碑。
下篇文章,将开启全新的《GPU Pro》系列。
《GPU Gems 3》全书核心框架脉络思维导图
以下是《GPU Gems 3》全书核心章节的思维导图:
另外值得注意的几点是:
- 《GPU Gems 3》出版于2007年8月12日,全书共1008页,41章。
- 《GPU Gems 3》的英文原版已经由NVIDIA开源: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_pref01.html
- 本文对《GPU Gems 3》全书渲染相关的前28章进行了盘点、提炼与总结。
- 本文正文可以作为一个文字版的索引,方便后续通过此文,对《GPU Gems 3》一书的内容进行快速分类检索与对应章节的深入阅读与研究。
OK,下面开始正文。
全文内容总览
本文总结的《GPU Gems 3》中这28章,分别为:
第一部分 几何体(Geometry)
- 第1章 使用GPU 生成复杂的程序化地形(Generating Complex Procedural Terrains Using the GPU)
- 第2章 群体动画渲染(Animated Crowd Rendering)
- 第3章 DirectX 10 中的混合形状(DirectX 10 Blend Shapes: Breaking the Limits)
- 第4章 下一代SpeedTree 渲染(Next-Generation SpeedTree Rendering)
- 第5章 通用自适应网格细化(Generic Adaptive Mesh Refinement)
- 第6章 对树的GPU 生成程序式风动画(GPU-Generated Procedural Wind Animations for Trees)
- 第7章 GPU 上基于点的变形球可视化(Point-Based Visualization of Metaballs on a GPU)
第二部分 光照和阴影(Light and Shadows)
- 第8章 区域求和的差值阴影贴图(Summed-Area Variance Shadow Maps)
- 第9章 使用全局光照交互电影级重光照(Interactive Cinematic Relighting with Global Illumination)
- 第10章 在可编程GPU 上实现并行分割阴影贴图(Parallel-Split Shadow Maps on Programmable GPUs)
- 第11章 基于层次化的遮挡剔除和几何着色器的高效鲁棒阴影体(Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders)
- 第12章 高质量的环境光遮蔽(High-Quality Ambient Occlusion)
- 第13章 后处理特效:体积光散射(Volumetric Light Scattering as a Post-Process)
第三部分 渲染(Rendering)
- 第14章 用于真实感实时皮肤渲染的高级技术(Advanced Techniques for Realistic Real-Time Skin Rendering)
- 第15章 可播放的全方位动作捕捉(Playable Universal Capture)
- 第16章 Crysis 中植被的程序化动画和着色(Vegetation Procedural Animation and Shading in Crysis)
- 第17章 鲁棒的多镜面反射和折射(Robust Multiple Specular Reflections and Refractions)
- 第18章 用于浮雕映射的松散式锥形步进(Relaxed Cone Stepping for Relief Mapping)
- 第19章 《Tabula Rasa》中的延迟着色(Deferred Shading in Tabula Rasa)
- 第20章 基于GPU的重要性采样(GPU-Based Importance Sampling)
第四部分 图像效果(Image Effects)
- 第21章 真实Impostor(True Impostors)
- 第22章 在GPU上烘焙法线贴图(Baking Normal Maps on the GPU)
- 第23章 高速的离屏粒子(High-Speed, Off-Screen Particles)
- 第24章 保持线性的重要性(The Importance of Being Linear)
- 第25章 在GPU 上渲染矢量图(Rendering Vector Art on the GPU)
- 第26章 通过颜色进行对象探测:使用 GPU 进行实时视频图像处理(Object Detection by Color: Using the GPU for Real-Time Video Image Processing)
- 第27章 后处理效果:运动模糊(Motion Blur as a Post-Processing Effect)
- 第28章 实用景深后期处理(Practical Post-Process Depth of Field)
第一部分 几何体(Geometry)
第1章 使用GPU 生成复杂的程序化地形(Generating Complex Procedural Terrains Using the GPU)
【关键词】
-
程序化地形(Procedural Terrains)
-
MC(Marching Cubes)算法
-
密度函数(Density Function)
-
地形生成(Terrain Generation)
【内容盘点】
作为《GPU精粹3》的开篇章节,这章给出了一个使用GPU在交互速率下生成复杂程序化三维地形的方法。同样也展示了如何对地形进行纹理映射和着色、如何为地形创建LOD的方案。
阅读这一章时让我想起了近年两款大作《地平线:黎明》和《幽灵行动:荒野》在GDC 2017上关于程序化地形和植被生成的分享:
-
GPU-Based Procedural Placement in Horizon Zero Dawn,GDC 2017(https://d1z4o56rleaq4j.cloudfront.net/downloads/assets/GDC2017_VanMuijden_GPUBasedProceduralPlacementInHorizonZeroDawn.pptx?mtime=20170307152717)
-
Ghost Recon Wildlands: Terrain Tools and Technology,GDC 2017(https://666uille.files.wordpress.com/2017/03/gdc2017_ghostreconwildlands_terrainandtechnologytools-onlinevideos1.pptx)
这边是《幽灵行动:荒野》在GDC 2017程序化地形技术演示视频:
https://www.youtube.com/watch?v=JIQ_YVwUONA
而这边是《地平线:黎明》中Decima Engine程序化地形和植被生成的演示视频:
https://www.youtube.com/watch?v=t258ePDlxtQ
图《地平线:黎明》的地形和植被程序化生成
图《地平线:黎明》的地形和植被程序化生成
图 《幽灵行动:荒野》中程序化地形的11+种生物群系和140+种地表材质
图 《幽灵行动:荒野》的 32k x 32k x 4 layer的程序化地形大世界,让其成为了育碧至今地形最大的开放世界游戏
图 《幽灵行动:荒野》中基于程序化地形的16平方公里的湖面,河流和溪流面积
图 《幽灵行动:荒野》中基于程序化地形的超过600公里的道路
OK,回到本章内容中来。
传统上,程序化地形(Procedural Terrains)受限于CPU生成的,且用GPU进行渲染的高度场(Height Fields)。然而,生成复杂地形是一项高度并行化的任务,CPU的串行处理本质上不适合完成这项工作。此外,CPU生成高度场的方法也无法很好地提供吸引人的地形特征(如凹洞和凸起物)。为了交互级的帧率下生成高度复杂的程序化地形,文中使用GPU和来进行此项工作。
理论上,地形表面可以用单个函数完整地进行描述,这个函数被称为密度函数(Density Function)。
图 一个已知8个棱角密度(Density)值的体素(黑点指示了棱角处的正密度值,每个棱角为一个“位(byte)”,用于在总共8位的情况中进行判断)
使用GPU来生成地形块所需要的多边形,这个块进行进而被细分成 32 x 32 x 32的小单元,即体素(Voxel)。Marching Cubes算法允许我们在一个单独的体素中生成正确的多边形。MarchingCubes(简称MC)算法是面绘制算法中的经典算法,它是W.Lorensen等人于1987年提出来的一种体素级重建方法。MarchingCubes算法也被称为“等值面提取”(Isosurface Extraction)算法。
下图阐述了应用Marching Cube算法的一些基本案例
图 Marching Cubes算法的14种基本案例(而其他的240种案例仅仅是这些纪元案例的旋转或翻转的结果)
首先,将世界划分成无限数目的等大小立方体块。在世界空间坐标系中,每个立方块的大小为1 x 1 x 1。然而,每个块中有32^3个体素可能含有多边形。为当前视锥可视的地形块动态划分一个含有大约300个顶点缓冲区的内存池,较近的块具有较高的优先权。随着用户的移动,当有新的地形块进入视锥时,视锥中被裁掉的最远或最近的顶点缓冲区便被回收,以被新的块使用。
而对每一帧的渲染思路方面,文中的思路是,根据位置从前到后对所有的顶点缓冲区进行排序(它们的包围盒已知)。然后生成所有需要的立方体块,剔除最远距离的块。最终,按照从前到后的顺序绘制各个块,以免在被遮挡的块上进行像素着色时浪费大量的时间。
本章英文原书全文传送门:
https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html
第2章 群体动画渲染(Animated Crowd Rendering)
【关键词】
-
群体动画渲染(Animated Crowd Rendering)
-
蒙皮实例化(Skinned Instancing)
-
性能优化(Performance Optimization)
-
Draw Call降低(Reduce Draw Call)
【内容盘点】
使用实例化(instancing)方法,可以通过减少Draw Call、状态更改以及缓冲区更新的数量来减少CPU的开销。
这章中展示了如何使用顶点纹理存取的DirectX 10实例化来实现基于硬件调色板的蒙皮角色(skinned characters)。这个demo同时使用了常量缓冲区和系统变量SV_InstanceID来有效实现这项技术。在Intel Core 2 Duo GeForce 8800 GTX显卡上,能够实现大约1万个人物拥有不同的动画和蒙皮。
图 动画人群的特写镜头
图 使用Skinned实例化的群体动画
蒙皮实例化(Skinned instancing)这项技术适用于实时地渲染数量庞大且彼此独立的动画人物。它使用顶点纹理存取来读取存储在单一纹理中的动画数据ÿ