自定义 PBR 与 Unity Lit 的差异拆解
记录我如何从零写一套 PBR,并对比 Unity URP/Lit:为什么要改 BRDF、为什么要拆近场和远场光照。
Rendering Notes · PBR / SSS / Hair
在做 Unity / URP 渲染与 Shader 开发。这里记录 PBR、皮肤与头发渲染、Portal、水体、体积光的折腾笔记。
一些关于渲染技术、Shader 实现细节和踩坑记录。如果你也在做实时渲染,应该会有点参考价值。
实时渲染核心概念的精简卡片。点开任意卡片看公式与延伸解释——写文章时反复查的那一组。
双向反射分布函数,描述入射光如何反射到出射方向。
BRDF 定义单位立体角辐照到单位面积辐出的比例,是整个 PBR 的核心。物理正确的 BRDF 必须满足能量守恒、亥姆霍兹互易律和非负性,否则材质在不同光照下会失衡。
f_r(\omega_i, \omega_o) = \frac{dL_o}{dE_i}微表面法线分布函数,决定高光的核心形状。
GGX 是目前最主流的微表面法线分布函数。相比 Beckmann,它的尾部更长,能产生更锐利的高光核心与更柔和的外围过渡,更贴近真实金属与粗糙材质的观测表现。
D(\mathbf{h}) = \frac{\alpha^2}{\pi \left((\mathbf{n}\cdot\mathbf{h})^2 (\alpha^2-1)+1\right)^2}反射率随观察角度变化的廉价近似。
Schlick 近似用菲涅尔反射率 F0 与视线-半程向量夹角计算反射率。掠射角时反射趋近 1,这就是金属边缘高光(rim light)的来源。F0 由材质 IOR 决定。
F(\mathbf{v},\mathbf{h}) = F_0 + (1-F_0)(1-\mathbf{v}\cdot\mathbf{h})^5光穿透材质内部多次散射后从另一处射出。
次表面散射描述光进入半透明材质(皮肤、玉石、蜡)后,在内部多次散射再从邻近点射出的现象。它是皮肤真实感的关键,忽略 SSS 会让人物看起来像塑料假人。
用环境贴图替代显式光源计算间接光照。
Image-Based Lighting 用预滤波环境贴图(PMREM)近似无穷远的环境光照,让 PBR 材质在任何场景下都能获得自然的反射与漫反射,无需手动放置补光。 Split-sum 把积分拆为预滤波卷积 + BRDF LUT 两步离线烘焙。
\int_{\Omega} L_{env}(\omega)\, f_r(\omega_i,\omega_o)\, \cos\theta\, d\omega_i用纹理扰动法线,在低模上伪造表面细节。
法线贴图存储切线空间下的扰动法线,着色时替换几何法线,能在低模上模拟高模的凹凸细节。比位移贴图廉价,但侧视角会“露馅”——凹凸不改变 silhouette。
表面某点被周围几何遮蔽的程度。
AO 量化表面某点接收环境光的可达性,褶皱、接缝、角落处增强,让几何关系更清晰。SSAO 是实时近似(屏幕空间),烘焙 AO 用于静态场景,精度更高。
A_o(p) = \frac{1}{\pi} \int_{\Omega} V(p,\omega)\,(\mathbf{n}\cdot\omega)\, d\omega把 HDR 线性亮度映射到显示器可显示范围。
Reinhard 是最简单的全局色调映射,用 L/(1+L) 把 HDR 压缩到 [0,1]。ACES 更符合电影风格,但 Reinhard 计算便宜,是入门 HDR 管线的首选。
T(L) = \frac{L}{1+L}基于物理定律的渲染范式。
PBR 用真实物理量(辐照度、BRDF、能量守恒)驱动着色,让材质在不同光照下表现一致。核心三件套:法线分布 D、几何遮蔽 G、菲涅尔 F,三者相乘构成 Cook-Torrance 镜面项。
把粗糙表面建模为大量朝向随机的微小镜面。
微表面模型假设粗糙表面由无数微小镜面组成,统计这些微面的法线分布 D、几何遮蔽 G 与菲涅尔 F,乘起来就是 Cook-Torrance BRDF。粗糙度 α 控制微面朝向分散程度。
f_r = \frac{D\,G\,F}{4\,(\mathbf{n}\cdot\mathbf{l})(\mathbf{n}\cdot\mathbf{v})}反射光能量不能超过入射光能量。
能量守恒要求 BRDF 在半球积分后反射的总能量不超过入射能量。粗糙金属的镜面反射 + 漫反射比例由金属度参数控制——这是 PBR 与传统 Blinn-Phong 的核心区别。
经典头发高光模型,把发丝近似为切向圆柱。
Kajiya-Kay 把头发近似为切线方向的圆柱,用 Phong 式余弦项产生沿发丝方向的高光条。它不物理正确(缺乏偏移与穿透),但实现简单,至今仍是实时头发的基线。
基于光纤测量的物理头发模型。
Marschner 用三次散射模型(R、TT、TRT)描述光在头发中的传播,能产生偏移的高光、穿透光与内部反射。它是头发渲染的黄金标准,Kajiya-Kay 是其廉价近似。
描述参与介质中光的散射相位。
HG 相位函数用不对称因子 g 控制散射前后倾向:g>0 前向散射(雾、烟),g<0 后向散射(红血球)。它是体积渲染与 SSS 散射核的标准工具。
p(\theta) = \frac{1-g^2}{4\pi\,(1+g^2-2g\cos\theta)^{3/2}}沿射线逐步前进求交点。
Raymarching 沿视线方向按步长推进,每步采样场函数判断是否命中。它不依赖几何光栅化,是体积云、SDF 渲染、距离场软阴影的标准工具。Sphere tracing 是其加速变体。
标量场,空间点到表面的有符号距离。
SDF 在空间中存储到最近表面的有符号距离(内部为负、外部为正),可用于平滑布尔运算、抗锯齿、字体渲染与 Raymarching 求交。CSG 组合只需 min/max/smooth-min。
|\nabla d| = 1
截止当前,站点的渲染管线产出。
每篇文章都标了技术标签,点选一个标签筛选出相关笔记。
点击标签筛选文章
Unity 图形 / Shader 爱好者,偏技术美术 / 渲染工程方向。喜欢把“看起来很玄学”的效果拆成数学和代码,再一点点还原出来。这个站会集中记录:图形学基础复习提纲、渲染管线学习笔记、Unity URP 实战 Shader、以及一些面向面试的问答整理。
了解更多