【GPU精粹与Shader编程】(二) 《GPU Gems 1》全书核心内容提炼总结 · 上篇


 

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

                                    文章链接: 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 波的选择

对于每个波的组成,有如下几个参数需要选择:

  • 波长Wavelength (L):世界空间中波峰到波峰之间的距离。波长L与角频率ω的关系为

    ω=2π/L。

  • 振幅Amplitude (A):从水平面到波峰的高度。
  • 速度Speed (S):每秒种波峰移动的距离。为了方便,把速度表示成相位常数 φ=S x

    2π/L。

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值