games104现代游戏引擎学习笔记整理(05.渲染中光和材质的数学魔法)

渲染方程BRDF(双向反射分布方程):简单来说,就是某点的光照强度=其自身的光照强度+间接接收的光照强度的积分。

做渲染的几个难点

1. visibility to light:光在某点的可见性的判断(如阴影的形成)

2. light source complexity:光源本身类型是很多样的(点光源,面光源等)。

3. 如何快速求积分部分的结果(如何做shading)

4. 光源数目的不确定性(直接光源和间接光源)

简化的光照环境搭建组成:Main Light + Ambient Light + Environment Map(主光源+环境光+环境贴图(天空盒))

主光源:主要的发光对象。

环境光:呈椭圆状分布辐射的一块低频光强区域。

环境贴图:呈椭圆状分布辐射的一块高频光强区域。

(可以理解为环境贴图是针对整个区域的,而环境光是针对区域中的一部分的)

 最基础的光照模型:Blinn-Phong光照模型

简单介绍下Blinn-Phong光照模型,该模型认为物体某一点射到摄像机里的光强由三部分组成:环境光,漫反射光和高光。环境光相当于一块区域里的一个常量光强;漫反射光表示一个物体表面均匀射向四周的一个光强,它的大小由射入到摄像机的光强由入射到物体表面的光强(一般会随距离衰减)和入射光的入射角度以及物体表面的漫反射参数决定;高光则代表物体表面的镜面反射光强,它的大小由入射光的强度,出射角度与观察角度的夹角,以及物体本身的高光系数决定。模型具体可见:Blinn-Phong光照模型详解_dx1313113的博客-CSDN博客

Shadow:即阴影,其形成原因是该点到光源之间有物体遮挡,针对这点设计了很多专门的Shadow算法。

早期的shadow算法:

planar shadow:把物体映射在一个平面上,然后很据光线数据把这个阴影“贴”在它应该在的表面上。与其说是一个光照算法,不如说是一个快速解决阴影问题的trick。

shadow volume:沿光源照射向物体的方向给物体添加一个阴影体,然后判断摄像机的注视到的部分哪些属于阴影体。

projective shadow:给物体根据光照生成一个阴影贴图,然后把贴图贴到对应的表面上。感觉和planar shadow很像,但似乎能贴到任意表面(planar shadow生成的只是个平面的阴影,贴到有坡度的表面上需要特殊处理)?

游戏引擎中最常用的shadow算法:shadow map

每个点通过反向投影获得到光源的距离,如果这个距离大于遮挡物到光源的距离,则在shadow中,否则不在shadow中。一般适用于静态场景的阴影生成。shadow map需要根据光源的位置作为视点把整个场景渲染出来,以得到它们相对于光源的深度信息,然后再使用这些深度信息去决定场景中哪一个部分是处于阴影之中的。

预计算的全局光照算法:在场景中,直接光照起到一个主光源的作用,而间接光照能使得场景更加真实。但是,间接光照如果实时计算的话计算量非常大,因此可以采用预计算的方法,计算全局的间接光照效果,并存储在文件中,最后在游戏中直接加载。这是典型的空间换时间算法,一般适用于静态物体的光照效果。

 基于傅里叶函数的图像压缩:傅里叶变换可以将循环的信号分解成无限的正弦余弦函数的叠加。运用傅里叶变换,可以将图片信号转移到频率域,通过删除一定的信号(做卷积)达到图片数据的压缩而失真程度不高的效果,同时在频率域下的卷积运算速度会比直接对图像卷积要快得多。

Spherical Harmonics:球谐函数。一种光场压缩的方法,表示为一组sin,cos组合的球面函数之和,其中无限维的各阶函数都是正交。这是类似于傅里叶函数设计的一种函数,其一维下是一个球状,而维度越高,其能表示的形状越复杂(但其基础是一个球形)。通过傅里叶函数对图像进行压缩类似的方式,可以对一个点光源辐射向四周的光场结果进行压缩(即用固定阶的球谐函数对光场辐射进行拟合),从而达到低失真和高压缩率的效果(有关球谐函数可见:球谐函数介绍(Spherical Harmonics) - 知乎)。

Light Map:光照贴图,把整个场景的光照烘焙到一张贴图上去。这需要要对世界做几何体的简化,从而能获得将整个场景转化出贴图展开的结果,即获得一整个场景的UV图。

 通过光照烘焙和全局光照以及反射光,可以实现很真实的光影效果。光照烘焙烘焙(预计算的)速度虽然慢,但是在实时游戏渲染中效率很高,且能很明显地显示环境细节。但这一技术只能处理静态物体和静态光,且会占用内存几十兆到一百兆左右的空间,非常吃内存。

 Light probe:在场景上撒一堆探针并预先计算好探针上的光场,人物移动时根据看到的位置周围的探针进行光照效果的插值计算,从而获得整个场景的光照效果(有点类似于对渲染空间体素化后对每个体素的光照效果进行预计算)。如何摆放Light probe是很重要的问题,现在很多游戏都实现了Light probe摆放的自动化(比如均匀采样后根据玩家的可到达区域进行probe的减少或增加)。在此基础上,还发展出了Reflection probe。这种probe的采样精度会非常高,但因此数量也不会很多。这一技术的优势是在runtime时可以实时更新,因此可以用于动态物体。但是其真实度上比不上light map。

现今的主流材质模型框架: Physical-Based Material(基于物理的材质模型)

通过设定模型物理性质参数来描述模型的表面光照效果。

相关的几种模型:

1.GGX模型,一种材质模型,输入参数只需输入粗糙度和菲涅尔参数等几个参数,就能获得包含了物体表面法向分布,物体内自遮挡以及菲涅尔现象的信息的材质模型。

2.PBR Specular Glossiness(SG):材质所有的效果都用一张图来表达,使艺术家可以对模型进行像素级的精准控制

3.PBR Metallic Roughness(MR):材质只包含底色,法向,粗糙度和金属度四项待设置参数,实际相当于对SG进行封装,通过调整参数来改变材质本身,但在金属到非金属的转化过程中可能会出现白边。

Image-Based Lighting(IBL):一种某点的光照效果的预计算方法,预计算结果会存在一张图上。这有点像之前提到的光照贴图,但它是物体的材质层次的,而非全局层次的。对它的利用能够显著增强物体的细节光照效果。

阴影的经典解决方案——Cascade Shadow:根据观测距离的远近计算不同精度的Shadow。这能够实现大场景的阴影效果,但是绘制的计算成本和存储成本都比较高。

Shadow的其它几个计算算法:PCSS ,Variance Shadow Map

3A游戏中常用渲染算法总结:

光照:LightMap+Lightprobe

材质:PBR+IBL

阴影:Cascade shadow+VSSM(最新的是Virtual Shadow Map)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值