间接光漫反射理论基础
2025-11-10
| 2025-11-12
Words 1367Read Time 4 min
type
status
date
slug
summary
tags
category
icon
password

1.复习

我们首先复习一下在刚入行的时候,是如何在unity中实现间接光漫反射的:
notion image
notion image
是通过采样辐照度贴图的方式 获取

2.基础理论:

间接漫反射的核心是 “辐照度 × 漫反射率
无论是 “采样辐照度贴图”,还是NX引擎中间接光漫反射的vertex_light * diffuse_color_for_indirect,核心理论都来自辐射度学中的漫反射光照计算:(IndirectLighting间接光照计算
  1. 理论公式:漫反射光照 = 辐照度(Irradiance) × 漫反射率(Albedo) / π
物体表面的间接漫反射(环境光、反射光等)本质是半球空间内所有入射光的积分。根据辐射度学,单位面积表面接收的总入射光能量称为 “辐照度(E)”,单位是 W/(m²・sr)。
对于理想漫反射表面(Lambert 模型),其反射的出射辐射度(L)为:
notion image
其中:
  • p是漫反射率(即材质的基础色,如 Diffuse Color),范围 [0,1];
  • E 是表面接收的辐照度(来自环境各个方向的间接光总和);
  • 除以 PI 是为了满足能量守恒(将半球积分转化为单位立体角的辐射度)。

3. 实际和理论的对应

我们以nx在间接光漫反射计算的时候用的vertex_light * diffuse_color_for_indirect为例
vertex_light ≈ 辐照度(E),diffuse_color_for_indirect ≈ 漫反射率(ρ)
vertex_lightE的另一种近似(还可以用像素vlm啊 用lightmap啊 各种方式)。
diffuse_color_for_indirect对应ρ(漫反射率),但会根据材质类型修正(比如金属材质的间接漫反射率会降低,因为金属主要反射高光)。因此:
(工程中常省略 PI,因为辐照度贴图或 vertex_light 可能已预乘 π,或通过后续曝光调整补偿,不影响比例关系)
diffuse_color_for_indirect
对于大部分普通的材质,diffuse_color_for_indirect就是DiffuseColor
因为,rgb颜色的表示,本质就是用来表示材质对红(R)、绿(G)、蓝(B)三种原色光的漫反射率
比如:
  • 红色塑料的漫反射率是 (1, 0.2, 0.2):表示它会反射 100% 的红色漫反射光,20% 的绿色和蓝色漫反射光;
  • 白色墙面的漫反射率接近 (1, 1, 1):几乎反射所有漫反射光;
  • 黑色布料的漫反射率接近 (0.1, 0.1, 0.1):只反射 10% 的漫反射光。
vertex_light
那么vertex_light 作为辐照度(E)的近似,会存储环境光的颜色—— 因为辐照度(E)本身就包含 “光的颜色信息”(不同波长的光能量分布),而 vertex_light 的 RGB 通道正对应这种颜色分布,本质是对环境光 “颜色 + 强度” 的打包存储。
那么合起来就是 环境光的颜色强度 * 材质的反射率 很合理
当然,这里用不一定是用vertex_light 啊,还有各种方式获取E。 用vertex_light 只能说是获取静态环境光照的一种廉价方式

3.1 次表面的额外贡献

对于次表面散射材质(皮肤、玉石、布料等),间接光不仅被表面反射,还会穿透表面进入内部,经过多次散射后再射出(比如皮肤中的血液会散射红光)。这种情况下,基础 Lambert 模型不再适用,需要额外计算 “次表面间接光”:
次表面散射的完整理论模型是 BSSRDF,它描述了 “入射光进入材质内部后,从不同位置射出” 的能量分布。但 BSSRDF 计算复杂,工程中通常简化为:
notion image
其中:
  • SubsurfaceIrradiance(对应工程中的p.subsurface_amb_diffuse):进入材质内部的次表面辐照度(比表面辐照度更柔和,因为经过了内部散射);
  • SubsurfaceColorGBuffer.CustomData.rgb):次表面散射的颜色(如皮肤的红色、布料的透光色),本质是材质内部散射的光谱特性。
备注:NX管线里,这里在basepass没算,而且在lightingpass 虽然留了可拓展的地方,但是实际上只对双面树叶进行了特殊的处理。

3.2 合起来

基础漫反射(vertex_light * diffuse_color_for_indirect)计算的是 “表面直接反射的间接光”,而次表面项计算的是 “穿透后散射的间接光”。两者相加,才能完整描述次表面材质的间接光照效果

4.辐照度的计算方式

无论是采样辐照度贴图
还是在 顶点计算 还是 在像素计算 vlm
都是在以不同的方式计算辐照度(E)
我们管线目前还使用了 vlm 技术

5.间接光漫反射的分类

虽然用 辐照度 * 反射率 可以一言蔽之
但是实际项目中,会分别拆分为场景间接光 和 环境间接光
notion image
  • 图形学
  • HLSL
  • 渲染
  • GetIblSpecular间接光高光IBL(basepass静态)丝绸各向异性 - 十字高光双 Lobe 算法
    Loading...