【GPU精粹与Shader编程】 七 一篇文章读完 GPU Gems 3

               

 

        本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处  

        文章链接: 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上关于程序化地形和植被生成的分享:

这边是《幽灵行动:荒野》在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)这项技术适用于实时地渲染数量庞大且彼此独立的动画人物。它使用顶点纹理存取来读取存储在单一纹理中的动画数据ÿ

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值