GAMES104-渲染中光和材质的数学魔法
绘制的核心是什么?
光:光子、反射反弹
材质:光和物质怎么反应
渲染:Shader 如何去做一些复杂的计算
渲染宗师,James Kajiya
1986年,提出了渲染方程 BRDF 双向反射方程
观察角度:模拟人眼
观察点:是否自发光?其他的光反射出的效果是什么?
真实世界的光照非常复杂
直射光、阴影、反射光、折射
是否可见,阴影效果,非常难,如果做不好不能体现层级
复杂的光源:直射光、电光源、面光
最初简单的光照:
主光源:Main Light,均匀的环境光
环境光:Ambient Light,使用一个混合参数代替
环境反射:环境贴图,根据眼睛看的角度和法向做贴图采样
Blinn-Phong Materials
环境光+漫反射+高光 = 材质模型(光可叠加原理)
优点:简单
缺点:
1.能量不保守,光线追踪会反复叠加
2.不够真实,看什么都很塑料
Shadow
场景中每个点对于光是否可见
ShadowMap 原理:
从光的视角渲染一张图,深度图,表示到光的距离
每一个点反向和光源做距离,如果大于最靠近光的遮挡物的距离,就代表是光源
优点:简单
缺点:采样率不一样,自遮挡问题
3A的光照:
预计算(空间换时间)
全局光照 Global IIIumination
模拟室内效果,体现真实感的刻画
可以预计算全局光照,球面模拟
傅里叶变换
可以用少量参数大概表示图片是什么样子的
替换土方法:加权平均
卷积:投影到屏幕空间的几个参数
Spherical Harmonics 球面投影技术
LightMap 光照贴图 模拟 GI
把整个场景的光照烘培到一张贴图
需要先对环境进行几何简化
优点:
1.Runtime 效率很高
2.烘培可以得到很细致的效果
缺点:
1.预计算时间很长
2.只能处理静态物体和静态光
3.占用存储空间(几十M-几百M)
Light Probe+Refection Probe 模拟 GI
Light Probe 光照探针(空间体素化)
对每个 Probe 采样光场,可以理解为对周围拍六张照片拼成一个图
场景中放很多很多,精度不高
对于游戏的每个元素,找到最近的几个探针,做差值
如何摆这些 Probe ?太麻烦了,改了关卡之后就变了
(现在游戏都是自动化生产)
Refection Probe 反射探针
放的不多,但是精度很高
优点:
1.效率也不错
2.可以支持静态和动态物体
缺点:
1.效果不如光照贴图
材质
Physical-Based Material 基于物理的材质
中心思想:一个表面就是以无数反射组成的,法向分散的随机度 (roughness)
比如,金属表面:表面光滑,反射基本上一个方向
GGK
Frensnel 菲涅尔
眼睛视线靠近表面切线方向,反射系数会急剧增加,会造成反射效果
Physical Measured Material
Disney Principled BRDF
1.每个参数要复合设计者的直觉
2.尽可能少的参数
3.所有参数的范围尽可能是0-1
4.如果超过了0-1,必须要有意义
5.随便调参数,不会产生很诡异的效果
常用 PBR 模型
1.PBR Specular Glossiness ,SG 模型
几乎没有什么参数,用图表达
Diffuse+Specular(菲涅尔参数)+Glossiness(粗糙光滑)
缺点:SG 模型对图的参数要求比较高,容易出错,可以再封装一层
2.RBR Metallic Roughness, MR 模型
BaseColor+Roughness+Metallic
缺点:非金属和金属过度会产生小小白边
Image-Based Lighting,IBL
核心思想:对真实环境光照做预处理,快速把环境光照卷积运算出来
LUT:Look up table
Shadow 阴影
解决方案:Cascade Shadow
因为 ShadowMap 精度不够,把 Shader 分成几层
10米的高精度
100米的一般精度
2公里的垃圾精度
保证近处看的清晰,近处看的稀疏(符合人眼)
问题:
不同的层级之间做差值,否则会有撕裂感
Hard Shadow & Soft Shadow 方案
PCF、PCSS
Variance Soft Shdow Map,效率高
技术总结:
Lightmap + LightProbe
PBR + IBL
Cascade shadow + VSSM
新技术:
实时光追,Real-Time Ray-Tracing
Real-Time Global IIIumination
Screen-space GI
SDF Base GI
Voxel-Based GI(SVOGI/VXGI)
RSM/RTX GI
皮肤材质、毛发渲染
Virtual Shadow Map
大量 Shader 管理
Shader 变体,各种宏定义分出各种条件,最后会编译很多分支的 Shader
跨平台编译
vulkan、metal、opengl、dx11,12