时间:2025-09-12 10:44
人气:
作者:admin
【从UnityURP开始探索游戏渲染】专栏-直达
光照模型是计算机图形学中用于模拟光线与物体表面相互作用的数学算法,它通过计算光能传播的物理特性,决定场景中每个像素的最终颜色值。其本质是求解光能传输方程的简化实现。
graph LR A[光源发射光子] --> B[与物体表面交互] B --> C[反射/折射/吸收] C --> D[进入人眼或传感器] D --> E[形成视觉颜色]光照模型通常包含以下物理现象的数学描述:
| 组件 | 物理原理 | 数学描述 |
|---|---|---|
| 环境光 | 全局间接光照 | Lₐ = kₐ * Iₐ |
| 漫反射 | 朗伯余弦定律 | L_d = k_d * I * max(0, N·L) |
| 镜面反射 | 菲涅尔反射 | L_s = k_s * I * (R·V)^n |
| 自发光 | 物体辐射 | L_e = emissiveColor |
入射光能 = 反射光能 + 吸收光能 + 透射光能光照模型是渲染方程的特定解形式:
$$
L_o(x,ω_o) = L_e(x,ω_o) + ∫_Ω f_r(x,ω_i,ω_o) L_i(x,ω_i) (n·ω_i) dω_i
$$
其中:
| 类型 | 原理 | 代表模型 |
|---|---|---|
| 局部光照 | 仅考虑直接光照 | Phong, Blinn-Phong |
| 全局光照 | 包含间接光照 | 路径追踪,辐射度算法 |
| 混合光照 | 直接+简化间接 | 屏幕空间环境光遮蔽(SSAO) |
| 模型 | 核心公式 | 适用场景 | 计算复杂度 |
|---|---|---|---|
| Lambert | L = k_d I (N·L) |
粗糙无光泽表面 | ★☆☆☆☆ |
| Phong | L = k_d(N·L) + k_s(R·V)^n |
塑料/陶瓷 | ★★☆☆☆ |
| Blinn-Phong | L = k_d(N·L) + k_s(N·H)^n |
实时渲染通用 | ★★☆☆☆ |
| Cook-Torrance | f = (D·F·G)/(4(N·V)(N·L)) |
金属/高光材质 | ★★★★☆ |
| Oren-Nayar | L = k_d I (A + B·max(0,cosφ)sinα tanβ) |
布料/粗糙表面 | ★★★☆☆ |
Unity URP:
csharp
// 表面着色器示例
void surf (Input IN, inout SurfaceOutputStandard o) {
o.Albedo = _Color.rgb;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex));
}
Unreal Engine:基于物理的材质编辑器(PBR)
RenderMan RIS:使用路径追踪求解完整渲染方程
Arnold:
surface PBR(
color baseColor = 0.8,
float metallic = 0,
float roughness = 0.5)
{
// GGX微表面BRDF实现
bsdf = ggx_brdf(normal, roughness, metallic);
Ci = baseColor * illuminate(bsdf);
}
光照模型是连接虚拟与现实的桥梁——从简单的(N·L)点积运算到包含数百万光路的路径追踪,其演进史就是计算机图形学追求物理真实性的奋斗史。理解光照模型不仅需要掌握其数学形式,更要洞察光与物质相互作用的物理本质。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)