GAMES104-05:渲染:光和材质的数学魔法
五、渲染:光和材质的数学魔法
5.1 渲染方程及挑战
5.1.1 渲染方程
\[ L_o(x,\omega_o)=L_e(x,\omega_o)+\int_{H^2}f_r(x,\omega_o,\omega_i)L_i(x,\omega_i)\cos\theta_id\omega_i \] radiance:辐射度;光照到物体上,物体反射出去的能量
irradiance:入射的能量
\(L_o(x,\omega_o)\):观察点为\(x\),观察方向为\(\omega_o\),观察到的radiance即为\(L_o(x,\omega_o)\)
- \(L_e(x,\omega_o)\):观察点\(x\),在\(\omega_o\)方向的自发光
- \(\int_{H^2}f_r(x,\omega_o,\omega_i)L_i(x,\omega_i)\cos\theta_id\omega_i\):观察点\(x\)接受所有方向射来的光,反射到\(\omega_o\)方向的光
- \(f_r(x,\omega_o,\omega_i)\):观察点\(x\),入射方向为\(\omega_i\),反射方向为\(\omega_o\),反射光能量占入射光能量的比例
- \(L_i(x,\omega_i)\):观察点\(x\),接受到的入射方向为\(\omega_i\)的光的能量
- \(\cos\theta_i\):光线与平面的夹角
5.1.2 挑战1:如何得到irradiance
对光源的可见性(阴影)
光源本身的复杂性
5.1.4 挑战2:如何快速地在球面上进行积分
如何计算光与表面的作用,即材质的影响
5.1.5 挑战3:所有的物体都可能是光源
5.2 基础光照解决方案
5.2.1 简化光源:Main Light + Ambient Light + Environment Map
简化光源的种类:主光dominant light
- 要么是点光源,要么是方向光源,要么是锥形光源
简化光场的表示:环境光ambient light
- 将四面八方的光,用平均值代替
环境光贴图:Environment Map
- 贴图是一个立方体
- 根据顶点的法线方向,计算观察到的颜色
void main(){
vec3 N = normalize(normal);
vec3 V = normalize(camera_position - world_position);
vec3 R = reflect(V,N);
FragColor = texture(cube_texture, R);
}
5.2.2 简化积分:Blinn-Phong 材质
将材质分为三类:\(L=L_a+L_d+L_s\)
- 环境光项Ambient:\(L_a=k_aI_a\)
- 漫反射项Diffuse:\(L_d=k_d\frac{I}{r^2}\max(0,\textbf{n}·\textbf{l})\)
- 镜面反射项Specular:\(L_s=k_s\frac{I}{r^2}\max(0,\textbf{n}·\textbf{h})^p\)
5.2.3 阴影
目标问题:场景中看到的每个点,对于光源是否可见
解决方法:shadow map
- 从光的角度渲染一张深度图
- 观察时,每个点投影回光源的视角,根据深度判断是否可见
// 将当前点投影到shadow map |
5.3 基于预计算的全局光照(空间换时间)
假设场景中90%的物体是不动的,每个场景太阳的角度是锁死的,那么就可以通过预计算,简化计算
5.3.1 全局光照:直接光照+间接光照
5.3.2 如何表示间接光照\(L_i(x,\vec{\omega_i})\)
5.3.2.1 傅里叶变换:
5.3.2.2 卷积定理:
5.3.2.3 球谐函数 Spherical Harmonics:
球谐函数本质上是一组基于球坐标系\((\theta,\phi)\)的基函数,基函数的计算公式为:\(Y_{lm}(\theta,\phi) &= N_{lm}P_{lm}(\cos\theta)e^{Im\phi} \\\)
- 正交:任意两个基函数卷积为0
- 二阶导永远为0:函数永远是光滑的
$$
由于环境光通常是低频的,因此只需要用二阶函数即可近似表达
5.3.3 光照贴图 Lightmap
优点:
- runtime的时候效率很高
- 离线渲染,可以表示很多细节
缺点:
- 预计算时间非常长
- 只能处理静态物体、静态光
- 占用存储空间,通常在几十MB~一百MB
5.3.4 光照探针 Light Probe
空间体素化
- 在场景中添加若干探针,针对每个探针计算全局光照
- 当需要某个点的全局光照时,对周围的探针进行插值
优点:
- runtime时效率高
- 可以处理静态物体和动态物体,可以动态更新
- 处理了diffuse、specular的渲染
缺点:
- 无法实现类似lightmap的细节
- SH light probe需要预计算
5.4 基于物理的材质 Physical-Based Material PBR
5.4.1 微平面理论
- 假设任意面都由很多小的微平面组成,每个微平面都是镜面反射
- 如果微平面的法线方向集中,则是镜面反射;如果发散,则是漫反射
5.4.2 基于微平面的BRDF模型
5.4.3 Disney Principled BRDF
五个原则
- 参数的含义要足够直观
- 参数要尽可能少
- 参数的范围要尽可能在
[0,1]
之间 - 参数的范围也可以超过
[0,1]
,但是这必须是有意义的 - 参数的组合不会产生非常诡异的结果,每个参数的组合都是有意义的
5.4.4 PBR Specular Glossiness
5.4.5 PBR Metallic Roughness
在SG模型的基础上进行封装,不是直接给出菲涅尔项的参数,而是通过metallic属性,对base_color进行插值
5.5 基于图像的光照:Image-Based Lighting(IBL)
基础想法:对环境光照做一些预处理,从而快速计算环境光照与材质的卷积运算
5.6 经典阴影方法
5.6.1 Cascade Shadow
- 将环境分为不同层,离玩家越近,shadow map的精度越高
5.6.2 PCF
5.6.3 PCSS
5.6.4 Variance Soft Shadow Map(VSSM)
5.7 总结
- 光:Lightmap + Lightporbe
- 材质:PBR + IBL
- 阴影:Cascade shadow + VSSM
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论