这只是笔记,有很多理解和翻译错误的,请谨慎参考。请以原书为准。
文章目录
- 1 Physics of Light
- 9.2 Camera
- 9.4 BRDF(bidirectional reflectance distribution function)
- 9.5 Illumination
- 9.6 Fresnel Reflectance
- 9.7 Microfacet Theory
- 9.8 BRDF Models for Surface Reflection
- 9.9 BRDF Model for Subsurface Scattering(次表面散射)
- 9.10 BRDF Models for Cloth
- 9.11 Wave Optics BRDF Models
- 9.12 Layered Materials
- 9.13 Blending And Filtering Materials
- 引用
1 Physics of Light
基本概念
可见光波长400~700 nm
能量
辐射度
定义
符号 | 定义 | 说明 |
---|---|---|
l ⃗ \vec l l | 光源方向 | |
v ⃗ \vec v v | 视线反方向 | |
p ⃗ \vec p p | 片元点 | |
n ⃗ \vec n n | 法线 | |
c l i g h t c_{light} clight | 光源的颜色 | |
l ⃗ c \vec l_c lc | 光源原点 | |
r ⃗ i \vec r_i ri | 反射光线 | 与法线夹角 θ i \theta_i θi |
m ⃗ \vec m m | 为表面法线 | |
ρ s \rho_s ρs | 表面Albedo | |
ρ s s \rho_{ss} ρss | 次表面Albedo | |
关键角度
符号 | 定义 | 说明 |
---|---|---|
θ \theta θ | 光线与法线夹角 | |
公式相关
形式 | 含义 |
---|---|
( x ) ∓ (x)^{\mp} (x)∓ | saturate(x),clamp to [0,1] |
Azimuth angles
ϕ
i
\phi_i
ϕi and
ϕ
0
\phi_0
ϕ0are given with respect to a given tangent
vector
t
⃗
\vec t
t. The relative azimuth angle
ϕ
\phi
ϕ, used for isotropic BRDFs instead of
ϕ
i
\phi_i
ϕi and
ϕ
0
\phi_0
ϕ0, does not require a reference tangent vector.
Particles
介质
IOR n
原始波和新波的速度比
让波速减少的介质有衰减系数k(kappa)
Surface
折射
sin ( θ t ) sin ( θ i ) = n 1 n 2 \frac{\sin(\theta_t)}{\sin(\theta_i)}=\frac{n_1}{n_2} sin(θi)sin(θt)=n2n1
微表面
Subsurface Scattering
次表面散射
BRDF
L i ( c ⃗ , − v ⃗ ) = L 0 ( p ⃗ , v ⃗ ) L_i(\vec c,-\vec v)=L_0(\vec p,\vec v) Li(c,−v)=L0(p,v)
c ⃗ \vec c c 指camera pos
v ⃗ \vec v v 指点到摄像机的射线
p ⃗ \vec p p 指片元点,也就是view ray与surface的焦点(intersection)
9.2 Camera
9.4 BRDF(bidirectional reflectance distribution function)
f ( l ⃗ , v ⃗ ) f(\vec l,\vec v) f(l,v)
S(V)BRDF
考虑折射率方程
L 0 ( p ⃗ , v ⃗ ) = ∫ l ⃗ ∈ Ω f ( l ⃗ , v ⃗ ) L i ( p ⃗ , l ⃗ ) ( n ⃗ ⋅ l ⃗ ) d l ⃗ L_0(\vec p,\vec v) = \int_{\vec l \in \Omega}f(\vec l,\vec v)L_i(\vec p,\vec l)(\vec n \cdot \vec l)d\vec l L0(p,v)=∫l∈Ωf(l,v)Li(p,l)(n⋅l)dl
l ⃗ ∈ Ω \vec l \in \Omega l∈Ω
对于点 p p p,起折射率为
L 0 ( v ⃗ ) = ∫ l ⃗ ∈ Ω f ( l ⃗ , v ⃗ ) L i ( l ⃗ ) ( n ⃗ ⋅ l ⃗ ) d l ⃗ L_0(\vec v) =\int_{\vec l \in \Omega}f(\vec l,\vec v)L_i(\vec l)(\vec n \cdot \vec l)d\vec l L0(v)=∫l∈Ωf(l,v)Li(l)(n⋅l)dl
在球坐标下,通常用角度 ϕ \phi ϕ 、 θ \theta θ来描述
d l ⃗ d\vec l dl = sin ( θ i ) d θ i d ϕ i \sin(\theta_i)d\theta_id\phi_i sin(θi)dθidϕi
n ⃗ ⋅ l ⃗ \vec n \cdot \vec l n⋅l = cos θ i \cos\theta_i cosθi
于是有
L 0 ( θ 0 , ϕ 0 ) = ∫ ϕ i = 0 2 π ∫ θ i = 0 π 2 f ( θ i , ϕ i , θ 0 , ϕ 0 ) L ( θ i , ϕ i ) cos θ i sin θ i d θ i d ϕ i L_0(\theta_0,\phi_0)=\int_{\phi_i=0}^{2\pi}\int_{\theta_i=0}^{\frac{\pi}{2}}f(\theta_i,\phi_i,\theta_0,\phi_0)L(\theta_i,\phi_i)\cos\theta_i\sin\theta_id\theta_id\phi_i L0(θ0,ϕ0)=∫ϕi=02π∫θi=02πf(θi,ϕi,θ0,ϕ0)L(θi,ϕi)cosθisinθidθidϕi
θ i \theta_i θi
ϕ i \phi_i ϕi
θ 0 \theta_0 θ0
ϕ 0 \phi_0 ϕ0
BRDF只定义了view和light位于surface上方的情况
意味着 n ⃗ ⋅ l ⃗ \vec n\cdot\vec l n⋅l需要calmp(0,)
为了避免除0,通常用abs( n ⃗ ⋅ l ⃗ \vec n\cdot\vec l n⋅l)*0.00001
BRDF原则
- 互异性: f ( l ⃗ , v ⃗ ) = f ( v ⃗ , l ⃗ ) f(\vec l,\vec v)=f(\vec v,\vec l) f(l,v)=f(v,l)
- 能量守恒:输出能量<=输入能量
directional-hemispherical reflectance R ( l ⃗ ) R(\vec l) R(l)
描述BRDF能量损失程度,也就是surface的粗糙度roughenss
R ( l ⃗ ) = ∫ v ⃗ ∈ Ω f ( l ⃗ , v ⃗ ) ( n ⃗ ⋅ v ⃗ ) d v ⃗ R(\vec l)=\int_{\vec v \in \Omega}f(\vec l,\vec v)(\vec n\cdot\vec v)d\vec v R(l)=∫v∈Ωf(l,v)(n⋅v)dv ∈ [ 0 , 1 ] \in[0,1] ∈[0,1]
放射方程中的 v ⃗ \vec v v、 l ⃗ \vec l l 是整个半球的。。
类似的
R ( v ⃗ ) = ∫ l ⃗ ∈ Ω f ( l ⃗ , v ⃗ ) ( n ⃗ ⋅ v ⃗ ) d l ⃗ R(\vec v)=\int_{\vec l \in \Omega}f(\vec l,\vec v)(\vec n\cdot\vec v)d\vec l R(v)=∫l∈Ωf(l,v)(n⋅v)dl
Lambertian BRDF
最简单的BRDF是Lambertian
其中 n ⃗ ⋅ l ⃗ \vec n\cdot\vec l n⋅l 项简化了
real-time rending常用
$f(\vec l,\vec v)是一个常数
R ( l ⃗ ) = π f ( l ⃗ , v ⃗ ) R(\vec l)=\pi f(\vec l,\vec v) R(l)=πf(l,v)
漫反射(constant relfectance) diffuse color c d i f f c_{diff} cdiff 或者albedo ρ \rho ρ,次表面subsurface albedo ρ s s \rho_ss ρss
f ( l ⃗ , v ⃗ ) = ρ s s π f(\vec l,\vec v)=\frac{\rho_{ss}}{\pi} f(l,v)=πρss
其中 1 π \frac{1}{\pi} π1时由于半球上积分余弦因子产生
这里抽象一个模型,假设入射光恒定
输出为:diffuse,specular lobe,
1上为Lambertian BRDF(简单球形)
2.上为Blinn-Phong highlighting+Lambertian term
3.上为Cook-Torrance BRDF
1.下a close-up of Ward’s anisotropic model。tilt the specular lobe
2.下Hapke/Lommel -Seeliger "Lunnar surface " BRDF
3.下Lommel-Seeliger scattering
9.5 Illumination
L i ( l ⃗ ) L_i(\vec l) Li(l) term 描述反射方程在shaded surface point的光
Global illumination(GI)通过光在整个场景的弹射等效果计算 L i ( l ⃗ ) L_i(\vec l) Li(l),这种策略将反射考虑进来了。
这一节,描述的时local illumination,也就是假设一直 L i ( l ⃗ ) L_i(\vec l) Li(l),计算每个点使用GI时该如何计算光照。
真实场景, L i ( l ⃗ ) L_i(\vec l) Li(l)计算了所有方向的来自光源或表面反射的非0辐射,真实世界的光为area lights。本节讨论的时虚拟的方向光或精确坐标的光源
将方向光的影响极限趋近为0时,可以积分方程可以简化为单个计算更少的BRDF方程
L 0 ( v ⃗ ) = π f ( l ⃗ c , v ⃗ ) c l i g h t ( n ⃗ ⋅ l ⃗ c ) L_0(\vec v)=\pi f(\vec l_c,\vec v)c_{light}(\vec n\cdot\vec l_c) L0(v)=πf(lc,v)clight(n⋅lc)
为了确保背面的光不被计算进来, ( n ⃗ , l ⃗ ) (\vec n,\vec l) (n,l)需要clamped to 0
L 0 ( v ⃗ ) = π f ( l ⃗ c , v ⃗ ) c l i g h t ( n ⃗ ⋅ l ⃗ c ) + L_0(\vec v)=\pi f(\vec l_c,\vec v)c_{light}(\vec n\cdot\vec l_c)^+ L0(v)=πf(lc,v)clight(n⋅lc)+
对于n个光源
L 0 ( v ⃗ ) = π ∑ i = 1 n f ( l ⃗ c i , v ⃗ ) c l i g h t i ( n ⃗ ⋅ l ⃗ c i ) + L_0(\vec v)=\pi \sum_{i=1}^n f(\vec l_{c_i},\vec v)c_{light_i}(\vec n \cdot \vec l_{c_i})^+ L0(v)=π∑i=1nf(lci,v)clighti(n⋅lci)+
其中 l ⃗ c i \vec l_{c_i} lci为光源方向, c l i g h t i c_{light_i} clighti为光源颜色
其中 π \pi π因子被BRDFs中出现的 1 π \frac{1}{\pi} π1抵消,但公式、论文中不能简化。
9.6 Fresnel Reflectance
物体的表面由其周围的介质和substance组成。光源在两个介质间相互作用遵守Fresnel equations(Augustin-Jean Fresnel).
菲涅尔对surface有几何假设:表面不含有光波波长的1~100倍的不规则
光与与表面作用后分成两部分:反射、折射
反射光用 r ⃗ i \vec r_i ri表示,它与 n ⃗ \vec n n夹角为 θ ⃗ i \vec \theta_i θi,根据入射光线 l ⃗ \vec l l和 n ⃗ \vec n n可以计算的到
r ⃗ i = 2 ( n ⃗ ⋅ l ⃗ ) n ⃗ − l ⃗ \vec r_i = 2(\vec n\cdot \vec l)\vec n - \vec l ri=2(n⋅l)n−l
反射的量由Fresnel reflectance F描述,该变量由 θ i \theta_i θi决定
F ( θ i ) F(\theta_i) F(θi) 当做RGB处理,规则
- 当 θ i = 0 o \theta_i = 0^o θi=0o,也就是光线垂直入射时,有 F 0 F_0 F0,也被认为是该物质的镜面反射颜色,也叫垂直入射
- 随着 θ i \theta_i θi上升, F ( θ i ) F(\theta_i) F(θi)也上升,当 θ i = 9 0 o \theta_i = 90^o θi=90o, F ( θ i ) = 1 F(\theta_i) = 1 F(θi)=1 (白色)
- 上升的曲线由物质决定,
上图依次为:玻璃、铜、铝的Fresnel reflectance.可以看到,不同波长的光的曲线不同,不同物质相同波长的曲线不同。波长由可以找到对应光颜色,也就是不同颜色的光的反射结果不同。玻璃这种物质的F与光颜色无光。
我们使用 F ( n ⃗ , l ⃗ ) F(\vec n,\vec l) F(n,l)而不用 θ i \theta_i θi,Fresnel function时BRDF的一部分。
F 0 F_0 F0由物质决定,在rough工作流,常简化
F F F项计算方法(Schlick):
F ( n ⃗ , l ⃗ ) ≈ F 0 + ( 1 − F 0 ) ( 1 − ( n ⃗ ⋅ l ⃗ ) + ) 5 F(\vec n,\vec l)\approx F_0+(1-F_0)(1-(\vec n\cdot\vec l)^+)^5 F(n,l)≈F0+(1−F0)(1−(n⋅l)+)5
这个公式时白色和 F 0 F_0 F0的非线性差值结果。
另一种计算的方案(Gulbrandsen),不能用来实时计算。这个曲线更拟合金属的Fresnel equations。
对于Schlick, F 0 F_0 F0只是一个参数,下面的方程介绍了如何通过两种介质的折射率计算 F 0 F_0 F0,这里用n代替了 n 2 n_2 n2,这里 n 1 = 1 n_1=1 n1=1(空气环境下)
F 0 = ( n − 1 n + 1 ) 2 F_0={(\frac{n-1}{n+1})}^2 F0=(n+1n−1)2
该值转化为RGB颜色的公式在8.1.3介绍颜色空间时提及
软件中常用公式为
F ( n ⃗ , l ⃗ ) ≈ F 0 + ( F 90 − F 0 ) ( 1 − ( n ⃗ ⋅ l ⃗ ) + ) 1 p F(\vec n,\vec l) \approx F_0 + (F_{90} - F_0)(1-(\vec n\cdot\vec l)^+)^{\frac{1}{p}} F(n,l)≈F0+(F90−F0)(1−(n⋅l)+)p1
设置 F 90 F_{90} F90为非白色可以描述Fresnel 方程无法描述的物质,比如覆盖物质上的灰尘
常见物质的 F 0 F_0 F0
主要分三类:绝缘体(insulators),半导体(semiconductor),导体(conductor)
Dielectrics 的 F 0 F_0 F0很低,通常<=0.06,菲涅尔效果明显
对于未知物质通常使用0.04
Dielectric | Linear | Texture(sRGB) | Color | Notes |
---|---|---|---|---|
Water | 0.02 | 39 | ||
Living tissue | 0.02-0.04 | 39-56 | Watery tissues are toward the lower bound, dry ones are higher | |
Skin | 0.028 | 47 | ||
Eyes | 0.025 | 44 | Dry cornea (tears have a similar value to water) | |
Hair | 0.046 | 61 | ||
Teeth | 0.058 | 68 | ||
Fabric | 0.04-0.056 | 53-67 | Polyester highest, most others under 0.05 | |
Stone | 0.035-0.056 | 53-67 | Values for the minerals most often found in stone | |
Plastics, glass | 0.04-0.05 | 56-63 | Not including crystal glass | |
Crystal glass | 0.05-0.07 | 63-75 | ||
Gems | 0.05-0.08 | 63-80 | Not including diamonds and diamond simulants | |
Diamond-like | 0.13-0.2 | 101-124 | Diamonds and diamond simulants(e.g., cubic zirconia, moissanite) |
金属的菲涅尔反射
金属的 F 0 F_0 F0很大,通常高于0.5
半导体的菲涅尔反射
介于导体和绝缘体之间,范围为[0.2,0.45]
水的菲涅尔反射
之前讨论的菲涅尔反射全是基于空气的,真空或者液体环境下值是不一样的,也就是不能假设 n 1 = 1 n_1 = 1 n1=1了,此时我们需要使用如下公式计算 F 0 F_0 F0
F 0 = ( n 1 − n 2 n 1 + n 2 ) 2 F_0=(\frac{n_1-n_2}{n_1+n_2})^2 F0=(n1+n2n1−n2)2
通常 n 1 ̸ = 1 n_1\not= 1 n1̸=1是水下场景。也有可能是其他情况,比如雾
参数化Fresnel Values
常用的参数化时将 F 0 F_0 F0和diffuse color ρ s s \rho_{ss} ρss合并,这种方法能是的金属这类无diffuse color和电解质具有一组受限的 F 0 F_0 F0.它包含一个RGB颜色 C s u r f C_{surf} Csurf和一个标量m–metallic/metalness
- 如果 m = 1 m=1 m=1, F 0 F_0 F0为 c s u r f c_{surf} csurf,$\rho_{ss}是black;
- 如果 m = 0 m=0 m=0, F 0 F_0 F0为电解质值(是一个常量(0.04)或被额外参数控制的值), c s u r f f = ρ s s c_{surff} = \rho_{ss} csurff=ρss
"metalness"最早被Brown University使用,电影 W a l l − E Wall-E Wall−E.迪士尼动画电影 W r e c k − I t Wreck-It Wreck−It中的 D i s n e y p r i n c i p l e d Disney principled Disneyprincipled光照模型中使用了一个额外的变量"specular"来控制 F 0 F_0 F0,这个参数化方法被Unreal Engine和Frostbite engine使用来描述非电解质的范围较广的 F 0 F_0 F0.游戏 C a l l o f D u t y : I n f i n i t e W a r f a r e Call of Duty:Infinite Warfare CallofDuty:InfiniteWarfare使用压缩算法将两个值压缩为一个值,节省内存。 O v e r w a t c h Overwatch Overwatch也是用了一种压缩算法:
mixed.rg为图片使用通道
m e t a l l i c = s a t u r a t e ( 2 ∗ m i x e d . r − 1 ) 2 ; metallic = saturate(2*mixed.r-1)^2; metallic=saturate(2∗mixed.r−1)2;
d i f f u s e = a l b e d o . r g b ∗ ( 1 − m e t a l l i c ) ; diffuse = albedo.rgb*(1-metallic); diffuse=albedo.rgb∗(1−metallic);
F 0 = s a t u r a t e ( m i x e d . r − 0.25 ) F_0=saturate(mixed.r-0.25) F0=saturate(mixed.r−0.25)
F 0 = F 0 ∗ 0.06 + 0.02 F_0=F_0*0.06+0.02 F0=F0∗0.06+0.02
s p e c u l a r = l e r p ( F 0 , a l b e d o , m e t a l l i c ) specular=lerp(F_0,albedo,metallic) specular=lerp(F0,albedo,metallic)
o n e m i u s r e f = ( 1 − m e t a l l i c ) ∗ ( 1 − F 0 ) onemiusref=(1-metallic)*(1-F_0) onemiusref=(1−metallic)∗(1−F0)
多数实时渲染引擎使用metalness值而不直接使用 F 0 F_0 F0和 ρ s s \rho_{ss} ρss是出于使用方便和节省G-buffer.在游戏Call of Duty: Infinite Warfare中,美术绘制 F 0 F_0 F0和 ρ s s \rho_{ss} ρss的纹理,再通过压缩算法存储到一个同道中。
metalness工作流有几个缺点:它不能描述有些种类的材质,比如具有着色 F 0 F_0 F0的电镀金属。美术可以手动调整得到中间值。
另一个被实时渲染引擎使用的参数化技巧:除了特种抗折射涂层,没有一个材质的 F 0 F_0 F0时小于0.02的。这个技巧用来高亮边缘。这里没有使用额外的occ纹理,而是将小于0.02部分用来“关闭”菲涅尔边缘增强。这项技术被Schuler发明,用于UE和Frostbite engiens.
Internal Reflection
次表面反射
当 n 1 > n 2 n_1>n_2 n1>n2会发生次表面反射
次表面只有绝缘体会有,
sin θ c = n 2 n 1 = 1 − F 0 1 + F 0 \sin_{\theta_c}=\frac{n_2}{n_1}=\frac{1-\sqrt F_0}{1+\sqrt F_0} sinθc=n1n2=1+F01−F0
Microgeometry
关于法线
9.7 Microfacet Theory
微表面理论
micro-BRDF $f_u(\vec l,\vec v,\vec m) $ 混合了所有微表面的反射光
左侧,我们看到积分项 D ( m ⃗ ) ( n ⃗ ⋅ m ⃗ ) D(\vec m)(\vec n\cdot \vec m) D(m)(n⋅m),
右侧,积分项 D ( m ⃗ ) ( v ⃗ ⋅ m ⃗ ) D(\vec m)(\vec v\cdot \vec m) D(m)(v⋅m), cos ( θ o ) = ( v ⃗ ⋅ n ⃗ ) \cos(\theta_o)=(\vec v\cdot\vec n) cos(θo)=(v⋅n)
称为*normal distribution function * or NDF,使用符号 D ( m ⃗ ) D(\vec m) D(m)表示,也称为D项,微表面法线的贡献,更有用的时积分 D ( m ⃗ ) ( n ⃗ ⋅ m ⃗ ) D(\vec m)(\vec n\cdot\vec m) D(m)(n⋅m), Θ \Theta Θ表示对以 n ⃗ \vec n n为中心的整个球面积分
∫ m ∈ Θ D ( m ⃗ ) ( n ⃗ ⋅ m ⃗ ) d m ⃗ = 1 \int_{m\in \Theta}D(\vec m)(\vec n\cdot\vec m)d\vec m = 1 ∫m∈ΘD(m)(n⋅m)dm=1
如果对以 n ⃗ \vec n n为中心的半球进行积分使用符号 Ω \Omega Ω表示
在经验表明,heightfields,所有位于 Ω \Omega Ω外的 m ⃗ \vec m m的 D ( m ⃗ ) = 0 D(\vec m)=0 D(m)=0,但non-heightfields它是合法的
更通用的,从任何视线方向,微表面在视线垂直方向的投影都满足如下公式
∫ m ∈ Θ D ( m ⃗ ) ( v ⃗ ⋅ m ⃗ ) d m ⃗ = v ⃗ ⋅ n ⃗ \int_{m\in\Theta}D(\vec m)(\vec v\cdot\vec m)d\vec m=\vec v\cdot\vec n ∫m∈ΘD(m)(v⋅m)dm=v⋅n
注意 ⋅ \cdot ⋅没有clamp(0,1),右侧展示了原因.
渲染时,我们只考虑可见的微表面,可见微表面的投影面积之和等于宏观表面投影面积,这里提出新的一项G项,masking function G 1 ( m ⃗ , v ⃗ ) G_1(\vec m,\vec v) G1(m,v)来描述微表面的法线 m ⃗ \vec m m和视线 v ⃗ \vec v v的可见性,此时积分项为球面的 G 1 ( m ⃗ , v ⃗ ) D ( m ⃗ ) ( v ⃗ ⋅ m ⃗ ) + G_1(\vec m,\vec v)D(\vec m)(\vec v\cdot\vec m)^+ G1(m,v)D(m)(v⋅m)+:
∫ Θ G 1 ( m ⃗ , v ⃗ ) D ( m ⃗ ) ( v ⃗ ⋅ m ⃗ ) + d m ⃗ = v ⃗ ⋅ m ⃗ \int_\Theta G_1(\vec m,\vec v)D(\vec m)(\vec v\cdot\vec m)^+d\vec m=\vec v\cdot\vec m ∫ΘG1(m,v)D(m)(v⋅m)+dm=v⋅m
G 1 ( m ⃗ , v ⃗ ) D ( m ⃗ ) G_1(\vec m,\vec v)D(\vec m) G1(m,v)D(m)时可见的normals的贡献,
Smith G 1 G_1 G1 function:
G 1 ( m ⃗ , v ⃗ ) = χ + ( m ⃗ ) ⋅ v ⃗ 1 + Λ ( v ⃗ ) G_1(\vec m,\vec v)=\frac{\chi^+(\vec m)\cdot\vec v}{1+\Lambda(\vec v)} G1(m,v)=1+Λ(v)χ+(m)⋅v
χ
+
(
x
)
=
\chi^+(x)=
χ+(x)=$
\left {
\begin{array}{c}
1,where x < 0\
0,where x \leq 0
\end{array}
\right.
$
Λ \Lambda Λ函数对每个NDF都不同,Smith masking目前是最好的一个G项函数,但并不是完美的,也就是还有更好的解决策略,但目前渲染器都用的它。
考虑了微表面法线的贡献后的micro-BRDF f μ ( l ⃗ , v ⃗ , m ⃗ ) f_\mu(\vec l,\vec v,\vec m) fμ(l,v,m),normal贡献 D ( m ⃗ ) D(\vec m) D(m),mask函数 G 1 ( m ⃗ , v ⃗ ) G_1(\vec m,\vec v) G1(m,v)后新的微表面BRDF为:
f ( l ⃗ , v ⃗ ) = ∫ m ∈ Ω f μ ( l ⃗ , v ⃗ , m ⃗ ) G 2 ( l ⃗ , v ⃗ , m ⃗ ) D ( m ⃗ ) ( m ⃗ ⋅ l ⃗ ) + ∣ n ⃗ ⋅ l ⃗ ∣ ( m ⃗ ⋅ v ⃗ ) + ∣ n ⃗ ⋅ v ⃗ ∣ d m ⃗ f(\vec l,\vec v)=\int_{m\in\Omega}f_\mu(\vec l,\vec v,\vec m)G_2(\vec l,\vec v,\vec m)D(\vec m)\frac{(\vec m\cdot\vec l)^+}{|\vec n\cdot \vec l|}\frac{(\vec m\cdot\vec v)^+}{|\vec n\cdot\vec v|}d\vec m f(l,v)=∫m∈Ωfμ(l,v,m)G2(l,v,m)D(m)∣n⋅l∣(m⋅l)+∣n⋅v∣(m⋅v)+dm
这里是对半球积分
这里使用joint masking-shadowing function G 2 ( l ⃗ , v ⃗ , m ⃗ ) G_2(\vec l,\vec v,\vec m) G2(l,v,m)而不是用 G 1 ( m ⃗ , v ⃗ ) G_1(\vec m,\vec v) G1(m,v),该方程式 G 1 G_1 G1的扩展,给出了根据从view vector v ⃗ \vec v v和light vector l ⃗ \vec l l可见的normal m ⃗ \vec m m的微表面微分。使得BRDF能够masking,也能shadowing.和所有BRDFs一样,都有一个太暗的缺点。
Heitz讨论了一些 G 2 G_2 G2的方程,最简单的是 G 2 ( l ⃗ , v ⃗ , m ⃗ ) = G 1 ( v ⃗ , m ⃗ ) G 1 ( l ⃗ , m ⃗ ) G_2(\vec l,\vec v,\vec m)=G_1(\vec v,\vec m)G_1(\vec l,\vec m) G2(l,v,m)=G1(v,m)G1(l,m),这里假设masking和shadowing是无关联的。事实上,不是。这会导致过暗。当光线和视线方向一致时,应该有 G 1 G_1 G1= G 2 G_2 G2,但是该方法仍然是 G 2 = G 1 2 G_2=G_1^2 G2=G12,假定 ϕ \phi ϕ为 v ⃗ , l ⃗ \vec v ,\vec l v,l之间的角度, G 2 ( l ⃗ , v ⃗ , m ⃗ ) G_2(\vec l,\vec v,\vec m) G2(l,v,m)= min ( G 1 ( v ⃗ , m ⃗ ) , G 1 ( l ⃗ , m ⃗ ) ) \min(G_1(\vec v,\vec m),G_1(\vec l,\vec m)) min(G1(v,m),G1(l,m)),这种条件下,对任何 G 1 G_1 G1有:
G
2
(
l
⃗
,
v
⃗
,
m
⃗
)
=
λ
(
ϕ
)
G
1
(
v
⃗
,
m
⃗
)
G
1
(
l
⃗
,
m
⃗
)
+
(
1
−
λ
(
ϕ
)
)
min
(
G
1
(
v
⃗
,
m
⃗
)
,
G
1
(
l
⃗
,
m
⃗
)
)
G_2(\vec l,\vec v,\vec m)=\lambda(\phi)G_1(\vec v,\vec m)G_1(\vec l,\vec m)+(1-\lambda(\phi))\min(G_1(\vec v,\vec m),G_1(\vec l,\vec m))
G2(l,v,m)=λ(ϕ)G1(v,m)G1(l,m)+(1−λ(ϕ))min(G1(v,m),G1(l,m))
其中
λ
(
ϕ
)
=
1
−
e
−
7.3
ϕ
2
∈
[
0
,
1
]
∝
ϕ
\lambda(\phi)=1-e^{-7.3\phi^2} \in [0,1] \propto \phi
λ(ϕ)=1−e−7.3ϕ2∈[0,1]∝ϕ
另一个 λ \lambda λ函数 λ ( ϕ ) = 4.41 ϕ 4.41 ϕ + 1 \lambda(\phi)=\frac{4.41\phi}{4.41\phi+1} λ(ϕ)=4.41ϕ+14.41ϕ
考虑光线和视线的相关性,Smith height-correlated masking-shadowing function:
G 2 ( l ⃗ , v ⃗ , m ⃗ ) = χ + ( m ⃗ ⋅ v ⃗ ) χ + ( m ⃗ ⋅ l ⃗ ) 1 + Λ ( v ⃗ ) + Λ ( l ⃗ ) G_2(\vec l,\vec v,\vec m)=\frac{\chi^+(\vec m\cdot\vec v)\chi^+(\vec m\cdot\vec l)}{1+\Lambda(\vec v)+\Lambda(\vec l)} G2(l,v,m)=1+Λ(v)+Λ(l)χ+(m⋅v)χ+(m⋅l)
Heitz也提出了一个混合direction和height的相关性的函数:
G 2 ( l ⃗ , v ⃗ , m ⃗ ) = χ + ( m ⃗ ⋅ v ⃗ ) χ + ( m ⃗ ⋅ l ⃗ ) 1 + m a x ( Λ ( v ⃗ ) , Λ ( l ⃗ ) ) + λ ( v ⃗ , l ⃗ ) min ( Λ ( v ⃗ ) , Λ ( l ⃗ ) ) G_2(\vec l,\vec v,\vec m)=\frac{\chi^+(\vec m\cdot\vec v)\chi^+(\vec m\cdot\vec l)}{1+max(\Lambda(\vec v),\Lambda(\vec l))+\lambda(\vec v,\vec l)\min(\Lambda(\vec v),\Lambda(\vec l))} G2(l,v,m)=1+max(Λ(v),Λ(l))+λ(v,l)min(Λ(v),Λ(l))χ+(m⋅v)χ+(m⋅l)
9.8 BRDF Models for Surface Reflection
specular term
这里假设微表面perfectly mooth fresnel mirror。这意味着,除非 l ⃗ \vec l l平行于 v ⃗ \vec v v, f μ ( l ⃗ , v ⃗ , m ⃗ ) = = 0 f_\mu(\vec l,\vec v,\vec m) == 0 fμ(l,v,m)==0
新增变量*half vector * h ⃗ = l ⃗ + v ⃗ ∣ ∣ l ⃗ + v ⃗ ∣ ∣ \vec h = \frac{\vec l+\vec v}{||\vec l+\vec v||} h=∣∣l+v∣∣l+v
对于specular微表面模型,对于所有 m ⃗ ≠ h ⃗ \vec m \neq \vec h m̸=h,菲涅尔项为0,
f s p e c ( l ⃗ , v ⃗ ) = F ( h ⃗ , l ⃗ ) G 2 ( l ⃗ , v ⃗ , h ⃗ ) D ( h ⃗ ) 4 ∣ n ⃗ ⋅ l ⃗ ∣ ∣ n ⃗ ⋅ v ⃗ ∣ f_{spec}(\vec l,\vec v)=\frac{F(\vec h,\vec l)G_2(\vec l,\vec v,\vec h)D(\vec h)}{4|\vec n\cdot\vec l||\vec n\cdot\vec v|} fspec(l,v)=4∣n⋅l∣∣n⋅v∣F(h,l)G2(l,v,h)D(h)
normal distribution functions(D项)
NDF
大多数渲染器用的NDF都是isotropic(各向同性),此时,NCF只是一个宏观法线 n ⃗ \vec n n和微表面法线 m ⃗ \vec m m之间的夹角 θ m \theta_m θm的函数,理想情况下,可使用 cos ( θ m ) \cos(\theta_m) cos(θm)简单计算。
Beckmann NDF最早被使用,它也被Cook-Torrance BRDF选用:
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) π α b 2 ( n ⃗ ⋅ m ) 4 exp ( ( n ⃗ ⋅ m ⃗ ) 2 − 1 α b 2 ( n ⃗ ⋅ m ⃗ ) 2 ) D(\vec m)=\frac{\chi^+(\vec n\cdot\vec m)}{\pi \alpha_b^2(\vec n\cdot m)^4}\exp(\frac{(\vec n\cdot\vec m)^2-1}{\alpha_b^2(\vec n\cdot\vec m)^2}) D(m)=παb2(n⋅m)4χ+(n⋅m)exp(αb2(n⋅m)2(n⋅m)2−1)
其中 χ + ( n ⃗ ⋅ m ⃗ ) \chi^+(\vec n\cdot\vec m) χ+(n⋅m)确保背面贡献为0,另外值得注意的是这里有个 1 π \frac{1}{\pi} π1在完整的BRDF中可以被约掉.如所有的NDFs一样,它描述了一个heightfield微表面. α b \alpha_b αb控制roughness,它与微表面的均方根成正比(RMS),当 α b = 0 \alpha_b=0 αb=0时,微表面绝对平滑.
当将Smith G 2 G_2 G2函数引入Beckmann NDF,需要相应的 Λ \Lambda Λ函数.Beckmann NDF是shape-invariant(形状不变的),可以简化 Λ \Lambda Λ函数,这种NDFs形式如下:
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) α 2 ( n ⃗ ⋅ m ⃗ ) 4 g ( ( 1 − ( n ⃗ ⋅ m ⃗ ) 2 ) α ( n ⃗ ⋅ m ⃗ ) ) D(\vec m)=\frac {\chi^+(\vec n\cdot \vec m)}{\alpha^2(\vec n\cdot\vec m)^4}g(\frac{\sqrt{(1-(\vec n\cdot \vec m)^2)}}{\alpha(\vec n\cdot\vec m)}) D(m)=α2(n⋅m)4χ+(n⋅m)g(α(n⋅m)(1−(n⋅m)2))
g g g是任意变量函数.对于各向同性的NDF, Λ \Lambda Λ依赖于两个变量:其一为roughness α \alpha α;其二为向量( v ⃗ \vec v v or l ⃗ \vec l l)的入射角。但对于shape-invariant NDF, Λ \Lambda Λ函数只依赖于变量 a a a:
a = n ⃗ ⋅ s ⃗ α 1 − ( n ⃗ ⋅ s ⃗ ) 2 a=\frac{\vec n\cdot\vec s}{\alpha\sqrt{1-(\vec n\cdot\vec s)^2}} a=α1−(n⋅s)2n⋅s
其中 s ⃗ \vec s s代指 v ⃗ \vec v v或 l ⃗ \vec l l.事实上,仅依赖于一个变量的 Λ \Lambda Λ实现是合适的.单变量函数更容易你和曲线,能用一维数组表示.
Beckmann NDF的 Λ \Lambda Λ: Λ ( α ) = e r f ( α ) − 1 2 + 1 2 α ( π ) exp ( − α 2 ) \Lambda(\alpha)=\frac{erf(\alpha)-1}{2}+\frac{1}{2\alpha\sqrt(\pi)}\exp(-\alpha^2) Λ(α)=2erf(α)−1+2α(π)1exp(−α2)
其中 e r f erf erf为错误处理函数,所以有待评价.作为近似解决:
Λ ( α ) \Lambda(\alpha) Λ(α)= { 1 − 1.259 α + 0.396 α 2 3.535 α + 2.181 α 2 , α < 1.6 0 , α ≤ 1.6 \begin{cases} \frac{1-1.259\alpha+0.396\alpha^2}{3.535\alpha+2.181\alpha^2}, \alpha < 1.6\\ 0,\alpha \leq 1.6\\ \end{cases} {3.535α+2.181α21−1.259α+0.396α2,α<1.60,α≤1.6
另一个NDF是Blinn-Phong NDF.是过去常用的,现在移动端常用,该NDF是对Phong shading model的推广.
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) α p + 2 2 π ( n ⃗ ⋅ m ⃗ ) α p D(\vec m)=\chi^+(\vec n\cdot\vec m)\frac{\alpha_p+2}{2\pi}(\vec n\cdot\vec m)^{\alpha_p} D(m)=χ+(n⋅m)2παp+2(n⋅m)αp
其中the power α p \alpha_p αp是Phong NDF中的roughness变量,越大约光滑,[0, ∞ \infty ∞], α p \alpha_p αp是一个非线性映射函数,比如 α p = m s \alpha_p=m^s αp=ms,其中m根据需要预设,比如8192, s ∈ [ 0 , 1 ] s\in[0,1] s∈[0,1].这种映射在非感觉一致的BRDF中有用。
α p = 2 α b − 2 − 2 \alpha_p=2\alpha_b^{-2}-2 αp=2αb−2−2为Beckmann 何Blinn-Phong的roughness参数等效值.Blinn-Phong NDF不是形状无关的.
GGX项
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) α g 2 π ( 1 + ( n ⃗ ⋅ m ⃗ ) 2 ( α g 2 − 1 ) ) 2 D(\vec m)=\frac{\chi^+(\vec n\cdot\vec m)\alpha_g^2}{\pi(1+(\vec n\cdot\vec m)^2(\alpha_g^2-1))^2} D(m)=π(1+(n⋅m)2(αg2−1))2χ+(n⋅m)αg2
α g \alpha_g αg控制roughness,与Beckmann α b \alpha_b αb类似
在Disney principled shading model中,Burley使用 α g = r 2 \alpha_g=r^2 αg=r2控制roughness,其中r是[0,1]的rouhenss.这种映射方式被i大多数软件使用。
GGX(红,下)与Beckmann(绿,上)对比
GGX是形状无关的,它的 Λ \Lambda Λ函数为 Λ ( a ) = − 1 + 1 + 1 a 2 2 \Lambda(a)=\frac{-1+\sqrt{1+\frac{1}{a^2}}}{2} Λ(a)=2−1+1+a21
a a a作为 a 2 a^2 a2存在减少平方开根次数.
GGX和Smith masking-shadowing函数都很流行,这有个合并二者的函数。Lagarde观察到,GGX的高度相关的 S m i t h G 2 Smith G_2 SmithG2有抵消的项。合并后为:
G 2 ( l ⃗ , v ⃗ ) 4 ∣ n ⃗ ⋅ l ⃗ ∣ ∣ n ⃗ ⋅ v ⃗ ∣ ⇒ 0.5 μ 0 α 2 + μ i ( μ i − α 2 μ i ) + μ i α 2 + μ 0 ( μ 0 − α 2 μ 0 ) \frac{G_2(\vec l,\vec v)}{4|\vec n\cdot\vec l||\vec n\cdot\vec v|}\Rightarrow\frac{0.5}{\mu_0\sqrt{\alpha^2+\mu_i(\mu_i-\alpha^2\mu_i)}+\mu_i\sqrt{\alpha^2+\mu_0(\mu_0-\alpha^2\mu_0)}} 4∣n⋅l∣∣n⋅v∣G2(l,v)⇒μ0α2+μi(μi−α2μi)+μiα2+μ0(μ0−α2μ0)0.5
简化方程: μ i = ( n ⃗ ⋅ l ⃗ ) + \mu_i=(\vec n\cdot\vec l)^+ μi=(n⋅l)+, μ 0 = ( n ⃗ ⋅ v ⃗ ) + \mu_0=(\vec n\cdot\vec v)^+ μ0=(n⋅v)+.
这里提到了一个叫MERL database的东西.
Karis得到一个GGX的Smith G 1 G_1 G1的近似方程: G 1 ( s ⃗ ) = 2 ( n ⃗ ⋅ s ⃗ ) ( n ⃗ ⋅ s ⃗ ) ( 2 − α ) + α G_1(\vec s )=\frac{2(\vec n\cdot \vec s)}{(\vec n\cdot \vec s)(2-\alpha)+\alpha} G1(s)=(n⋅s)(2−α)+α2(n⋅s)
其中 s ⃗ \vec s s可以被$\vec l o r or or \vec v$代替.
Hammon提出了一个混合了高度矫正的Smith G 2 G_2 G2函数和specular microfacet BRDF的 G 1 G_1 G1
G 2 ( l ⃗ , v ⃗ ) 4 ∣ n ⃗ ⋅ l ⃗ ∣ ∣ n ⃗ ⋅ v ⃗ ∣ ≈ 0.5 l e r p ( 2 ∣ n ⃗ ⋅ l ⃗ ∣ n ⃗ ⋅ v ⃗ ∣ , ∣ n ⃗ ⋅ l ⃗ ∣ + ∣ n ⃗ ⋅ v ⃗ ∣ , α ) \frac{G_2(\vec l,\vec v)}{4|\vec n\cdot\vec l||\vec n\cdot\vec v|}\approx \frac{0.5}{lerp{(2|\vec n\cdot \vec l|\vec n\cdot\vec v|,|\vec n\cdot\vec l|+|\vec n\cdot \vec v|,\alpha)}} 4∣n⋅l∣∣n⋅v∣G2(l,v)≈lerp(2∣n⋅l∣n⋅v∣,∣n⋅l∣+∣n⋅v∣,α)0.5
其中 l e r p ( x , y , s ) = x ( 1 − s ) + y s lerp(x,y,s)=x(1-s)+ys lerp(x,y,s)=x(1−s)+ys
比较GGX和Beckmann:GGX峰值更狭窄、尾更长.真实世界的高光的tails比GGX还长.在得到更好的方程前,GGX仍然会流行.
G T R \color{Red}GTR GTR
Burley处于更多的控制NDF的形状、明确控制其tails,提出了generalized Trowbridge-Reitz(GTR) NDF:
D ( m ⃗ ) = k ( α , γ ) π ( 1 + ( n ⃗ ⋅ m ⃗ ) 2 ( α g 2 − 1 ) ) γ D(\vec m)=\frac{k(\alpha,\gamma)}{\pi(1+(\vec n\cdot\vec m)^2(\alpha_g^2-1))^{\gamma}} D(m)=π(1+(n⋅m)2(αg2−1))γk(α,γ)
其中 γ \gamma γ控制tail的形状,当 γ = 2 \gamma=2 γ=2,GTR就与GGX一样.随着 γ \gamma γ减少,tails会更长,随着 γ \gamma γ增大,tails会变短,值足够大时,GTR就与Beckmann一样.其中 k ( α , γ ) k(\alpha,\gamma) k(α,γ)项是归一化因子:
k
(
α
,
γ
)
k(\alpha,\gamma)
k(α,γ)=$
\left {
\begin{array}{c}
\frac{(\gamma-1)(\alpha2-1)}{(1-(alpha2)^{(1-\gamma)})},\gamma\neq1 \and \alpha \neq 1\
{\frac{\alpha2-1}{\ln(\alpha2)},\gamma = 1\and\alpha\neq 1}\{1,\alpha=1}
\end{array}
\right.
$
GTR不是形状不变的,这让它的Smith G 2 G_2 G2 masking-shadowing函数的寻找变得复杂.该NDF发布3年后才找到其 G 2 G_2 G2函数,该函数非常复杂,另一个问题是GTR的参数 α \alpha α和 γ \gamma γ以非直觉的方式感知roughenss和发光.
Student’s t-distribution(STD)和exponential power distribution(EPD) NDFs包括形状控制参数,作为GTR的对比,这些函数形状无关,只关心roughness变量.
一个可行的能更好的匹配测量的材质的方法是使用multiple specular lobes,而不是提升NDF的复杂度.这个想法来自Cook和Torrance,经过Ngan测试,对许多材质,增加第二个lobe确能提高效果。Pixar’s PxrSurface材质有一个"roughspecular"lobe用于这个目的。额外的lobe是一个完整的specular微表面BRDF,混合了两个GGX NDFs,这里使用额外的NDF而不是一个完整的specular BRDF项.这种情况下,只需要额外的roughness和一个混合参数.
Anisotropic Normal Distribution Functions(各向异性函数)
这节讨论为各向异性材质渲染用到的BRDFs,尤其是其NDFs.
与各向同性NDFs不同,各向异性NDFs只有一个角度 θ m \theta_m θm已经不够了,还需要额外的信息.通常微表面法线 m ⃗ \vec m m需要变化到local frame或者通过normal、tangent、bitangent定义的tangent spece中,这种变化通过三个点乘表式: m ⃗ ⋅ n ⃗ \vec m\cdot\vec n m⋅n, m ⃗ ⋅ t ⃗ \vec m\cdot\vec t m⋅t, m ⃗ ⋅ b ⃗ \vec m\cdot\vec b m⋅b
当给各项同性BRDFs混合normal mapping时,确保normal map扰动tangent、bitangent、normal很重要,这个过程通常在modified Gram-Schmidt过程中处理.下面公式假设normal已经归一化.
t ⃗ ′ = t ⃗ 0 − ( t ⃗ 0 ⋅ n ⃗ ) ⇒ t ⃗ = t ⃗ ′ ∣ ∣ t ⃗ ′ ∣ ∣ \vec t'=\vec t_0-(\vec t_0\cdot\vec n) \Rightarrow \vec t = \frac{\vec t'}{||\vec t'||} t′=t0−(t0⋅n)⇒t=∣∣t′∣∣t′
由
b ⃗ ′ = b ⃗ 0 − ( b ⃗ 0 ⋅ n ⃗ ) n ⃗ \vec b'=\vec b_0-(\vec b_0\cdot\vec n)\vec n b′=b0−(b0⋅n)n
b ⃗ ′ ′ = b ⃗ ′ − ( b ⃗ ′ ⋅ t ⃗ ) t ⃗ \vec b''=\vec b'-(\vec b'\cdot\vec t)\vec t b′′=b′−(b′⋅t)t
有 b ⃗ = b ⃗ ′ ′ ∣ ∣ b ⃗ ′ ′ ∣ ∣ \vec b=\frac{\vec b''}{||\vec b''||} b=∣∣b′′∣∣b′′
再有第一个公式和 n ⃗ \vec n n可以直接得到 b ⃗ = n ⃗ × t ⃗ \vec b= {\vec n}\times{\vec t} b=n×t.
对于特殊材质比如腐蚀、头发,tangent direction需要逐像素modification,通常由tangent map提供.与normal map类似,这张纹理著像素存储了tangent值,tangent纹理通常只存储垂直于法线的平面的二维分量.这种方法方便采用类似normal map的压缩方法,有的软件直接存储了一个scalar值(绕着normal旋转)–但这种方法在从360到0度旋转时会产生伪影.
一种各向异性NDF的近似方法是推广各向同性的NDF,这种近似方法能用所有形状无关的各向同性的NDF,这也是为什么形状无关的NDFs更好.回顾形状无关的各项同性的NDFs形式:
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) α 2 ( n ⃗ ⋅ m ⃗ ) 4 g ( ( 1 − ( n ⃗ ⋅ m ⃗ ) 2 ) α ( n ⃗ ⋅ m ⃗ ) ) D(\vec m)=\frac {\chi^+(\vec n\cdot \vec m)}{\alpha^2(\vec n\cdot\vec m)^4}g(\frac{\sqrt{(1-(\vec n\cdot \vec m)^2)}}{\alpha(\vec n\cdot\vec m)}) D(m)=α2(n⋅m)4χ+(n⋅m)g(α(n⋅m)(1−(n⋅m)2))
g g g表示描述NDF的形状的一维函数,此时各向异常的版本为:
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) α x α y ( n ⃗ ⋅ m ⃗ ) 4 g ( ( ( t ⃗ ⋅ m ⃗ ) 2 α x 2 − ( b ⃗ ⋅ m ⃗ ) 2 α y 2 ) ( n ⃗ ⋅ m ⃗ ) ) D(\vec m)=\frac {\chi^+(\vec n\cdot \vec m)}{\alpha_x\alpha_y(\vec n\cdot\vec m)^4}g(\frac{\sqrt{(\frac{{(\vec t\cdot\vec m)}^2}{\alpha_x^2}-\frac{(\vec b\cdot \vec m)^2}{\alpha_y^2})}}{(\vec n\cdot\vec m)}) D(m)=αxαy(n⋅m)4χ+(n⋅m)g((n⋅m)(αx2(t⋅m)2−αy2(b⋅m)2))
α x \alpha_x αx和 α y \alpha_y αy分别表示 t ⃗ \vec t t和 b ⃗ \vec b b方向的roughness,特殊的当 α x = = α y \alpha_x==\alpha_y αx==αy,就是各项同性的形式.
除了变量a( Λ \Lambda Λ函数传入)计算不同,各向异性的NDF的 G 2 G_2 G2masking-shadowing函数与各向同性一致,其中 s ⃗ \vec s s表示 v ⃗ \vec v v或 l ⃗ \vec l l:
a = n ⃗ ⋅ s ⃗ α x 2 ( t ⃗ ⋅ s ⃗ ) 2 + α y 2 ( b ⃗ ⋅ s ⃗ ) 2 a=\frac{\vec n\cdot\vec s}{\sqrt{\alpha_x^2{(\vec t\cdot\vec s)}^2+\alpha_y^2{(\vec b\cdot\vec s)}^2}} a=αx2(t⋅s)2+αy2(b⋅s)2n⋅s
这种方式下,各项异性的Beckmann 扩展的NDF为:
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) π α x α y ( n ⃗ ⋅ m ⃗ ) 4 exp ( − ( t ⃗ ⋅ m ⃗ ) 2 α x 2 + ( b ⃗ ⋅ m ⃗ ) 2 α y 2 ( n ⃗ ⋅ m ⃗ ) 2 ) D(\vec m)=\frac{\chi^+(\vec n\cdot\vec m)}{\pi\alpha_x\alpha_y(\vec n\cdot\vec m)^4}\exp{(-\frac{{\frac{{(\vec t\cdot\vec m)}^2}{\alpha_x^2}}{}+\frac{(\vec b\cdot\vec m)^2}{\alpha_y^2}}{{(\vec n\cdot\vec m)}^2})} D(m)=παxαy(n⋅m)4χ+(n⋅m)exp(−(n⋅m)2αx2(t⋅m)2+αy2(b⋅m)2)
各向异性的GGX NDF:
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) π α x α y ( ( t ⃗ ⋅ m ⃗ ) 2 α x 2 + ( b ⃗ ⋅ m ⃗ ) 2 α y 2 + ( n ⃗ ⋅ m ⃗ ) 2 ) 2 D(\vec m)=\frac{\chi^+(\vec n\cdot\vec m)}{\pi\alpha_x\alpha_y({\frac{(\vec t\cdot\vec m)^2}{\alpha_x^2} + \frac{(\vec b\cdot\vec m)^2}{\alpha_y^2} + (\vec n\cdot\vec m)^2})^2} D(m)=παxαy(αx2(t⋅m)2+αy2(b⋅m)2+(n⋅m)2)2χ+(n⋅m)
然而最直接的方式是参数化各向异性NDFs,使用两次各向同性参数roughness,一次给 α x \alpha_x αx,一次给 α y \alpha_y αy,其他参数也又是也这样.在Disney pricipled shading model中,各向同性roughness 参数 r r r会与第二个scalar参数 k a n i s o ∈ [ 0 , 1 ] k_{aniso}\in[0,1] kaniso∈[0,1]混合,而 α x \alpha_x αx与 α y \alpha_y αy通过他们求得(0.9因子限制预期值范围为[10,1]):
k a s p e c t = ( 1 − 0.9 k a n i s o ) , k_{aspect}=\sqrt{(1-0.9k_{aniso})}, kaspect=(1−0.9kaniso),
α x = r 2 k a s p e c t , \alpha_x=\frac{r^2}{k_{aspect}}, αx=kaspectr2,
α y = r 2 k a s p e c t . \alpha_y=r^2k_{aspect}. αy=r2kaspect.
Imageworkds使用不同的参数化公式,允许任意程度的各向异性:
α x = r 2 ( 1 + k a n i s o ) , α y = r 2 ( 1 − k a n i s o ) . \alpha_x=r^2(1+k_{aniso}),\\\alpha_y=r^2(1-k_{aniso}). αx=r2(1+kaniso),αy=r2(1−kaniso).
Multiple-Bounce Surface Reflection
之前提到微表面BRDF框架没有考虑微表面的多次弹射的反射,造成了一些额外的能力损失,表现为偏黑–尤其是一些粗糙金属材质.
Imageworkds在之前的工作基础上增加了新的可以与BRDF相加的项来模拟多次弹射的反射:
f m s ( l ⃗ , v ⃗ ) = F ‾ R s F 1 ‾ π ( 1 − R s F 1 ‾ ) ( 1 − F ‾ ( 1 − R s F 1 ‾ ) ) ( 1 − R s F 1 ( l ⃗ ) ( 1 − R s F 1 ( v ⃗ ) ) ) f_{ms}(\vec l,\vec v)=\frac{\overline {F} \overline {R_{sF_1}}}{\pi(1-\overline {R_{sF_1}})(1-\overline{F}(1-\overline {R_{sF_1}}))}(1-R_{sF_1(\vec l)}{(1-R_{sF_1}(\vec v))}) fms(l,v)=π(1−RsF1)(1−F(1−RsF1))FRsF1(1−RsF1(l)(1−RsF1(v)))
其中, R s F 1 R_{sF_1} RsF1是specular BRDF项在 F 0 F_0 F0为1时的 f s F 1 f_{sF_1} fsF1的方向反射率, R s F 1 R_{sF_1} RsF1依赖于roughenss α \alpha α和 θ \theta θ.它能通过 预 计 算 \color{Red}预计算 预计算存储在二维纹理中.Imageworks发现32x32的纹理就够了. R ‾ s F 1 \overline R_{sF_1} RsF1是 R s F 1 R_{sF_1} RsF1在半球上的余弦加权(cosine-weighted).它只依赖于 α \alpha α,所以能存储在一维纹理或用一条拟合曲线表示. R s F 1 R_{sF_1} RsF1是绕着 n ⃗ \vec n n旋转的对称的值.
μ = cos θ \mu = \cos \theta μ=cosθ,
R s F 1 ‾ = ∫ s ⃗ ∈ Ω R s F 1 ( s ⃗ ) ( n ⃗ ⋅ s ⃗ ) d s ⃗ ∫ s ⃗ ∈ Ω ( n ⃗ ⋅ s ⃗ ) d s ⃗ = 1 π ∫ Φ = 0 2 π ∫ μ = 0 1 R s F 1 ( μ ) μ d μ d Φ \overline {R_{sF_1}}=\frac {\int_{\vec s\in\Omega}{R_{sF_1}(\vec s)(\vec n\cdot\vec s)d\vec s}}{\int_{\vec s\in\Omega}{(\vec n\cdot\vec s)d\vec s}}=\frac{1}{\pi}\int_{\Phi=0}^{2\pi}{\int_{\mu=0}^{1}{R_{sF_1}(\mu)\mu d \mu d\Phi}} RsF1=∫s∈Ω(n⋅s)ds∫s∈ΩRsF1(s)(n⋅s)ds=π1∫Φ=02π∫μ=01RsF1(μ)μdμdΦ= 2 ∫ μ = 0 1 R s F 1 ( μ ) μ d μ 2\int_{\mu=0}^{1}{R_{sF_1}(\mu)\mu d \mu} 2∫μ=01RsF1(μ)μdμ
F ‾ \overline {F} F是Fresnel项的余弦加权结果: F ‾ = 2 ∫ μ = 0 1 F ( μ ) μ d μ \overline {F}=2\int_{\mu=0}^1{F(\mu)\mu d \mu} F=2∫μ=01F(μ)μdμ
Imageworkds提出了使用了Schlick的与上面类似的公式: F ‾ = 2 p 2 F 90 + ( 3 p + 1 ) F 0 2 p 2 + 3 p + 1 \overline {F}=\frac{2p^2F_{90}+(3p+1)F_0}{2p^2+3p+1} F=2p2+3p+12p2F90+(3p+1)F0
如果使用原始的Schlick近似值,上述公式可以简化为: F ‾ = 20 21 F 0 + 1 21 \overline {F}=\frac{20}{21}F_0+\frac{1}{21} F=2120F0+211,在各向异性的情况下,Imageworkds使用从 α x \alpha_x αx到 α y \alpha_y αy之间的roughenss计算 f m s f_{ms} fms
9.9 BRDF Model for Subsurface Scattering(次表面散射)
本章讨论此表面散射或非透明电解质的多个表面弹射.半透或全球面散射的电解质材质在后续会讨论(14章).本章先讨论diffuse模型的diffuse属性在现实中的值,接着讨论表面的roughness在diffuse shading模型中的作用,以及针对选定材料选择smooth-surface或rough-surface shading模型的标准.最后专注这两个模型本身进行讨论.
9.9.1 Subsurface Albedo
次表面的albedo ρ s s ∈ [ 0 , 1 ] \rho_{ss}\in[0,1] ρss∈[0,1]是光入射到非半透电解质表面的能逃逸能量和吸收能量的比值( ρ s s = = 0 \rho_{ss}==0 ρss==0表示全被吸收), ρ s s \rho_{ss} ρss受光波长影响,渲染时 ρ s s \rho_{ss} ρss模型化为一个RGB值,与Fresnel F 0 F_0 F0影响specular color类似, ρ s s \rho_{ss} ρss影响diffuse color.
次表面的albedo ρ s s \rho_{ss} ρss比specular color F 0 F_0 F0更明亮也更重要,因为电解质传输多数为入射光而不是反射光. ρ s s \rho_{ss} ρss与 F 0 F_0 F0有不同的广布分布(导致RGB颜色不同),因为它来自不同的物理过程(吸收而不是反射).举例:嵌入半透颗粒的彩色塑料,镜面反射不会着色,但漫反射光被颗粒吸收时会被着色–比如一个红色塑料球有白色高光.
这有一个误解– ρ s s \rho_{ss} ρss绝不会小于0.015-0.03(30-50 in 8-bit sRGB)–即使是反射良好的材质.但这个限制是基于surface(specular)和次表面(diffuse) reflectance测量的,所以太高了.事实上,材质能有更低的值,比如“OSHA Black"的Y为0.35(超过100),给定的测量和表面高光, ρ s s \rho_{ss} ρss大概为)。0.0035(11in sRGB).
当根据真实表面获取 ρ s s \rho_{ss} ρss的值时,可以通过控制光照或使用偏振滤波器分离镜面反射.反射光谱比发射光谱更严格,对任何波长都不能超过1,通常都很smooth,是的 ρ s s \rho_{ss} ρss的RGB值失效,即使相对较小的sRGB色域也包含范围之外的颜色,需要小心设置 ρ s s \rho_{ss} ρss,避免不自然的明亮的颜色,在预计算GI中还可能导致二次反射过亮.
9.9.2 Scale of Subsurface Scattering and Roughness
次表面散射和粗糙度.一些BRDF模型(典型的diffuse micro-BRDF f μ f_\mu fμ)为局部此表面散射使用roughness,但决定因素不是表面多粗糙,而是微表面的不规则度和此表面散射的距离的相对大小.
当微表面不规则度(irregularities)比次表面散射距离大时,然后次表面散射会表现出与微观几何相关的影响,如反射,此时应该使用roughness-surface diffuse model.这种models基于微表面理论,将次表面散射看作是微表面的局部作用,只影响micro-BRDF f μ f_{\mu} fμ.
当次表面散射距离比微表面不规则度大时,此时应该考虑次表面模型不会出现反射现象,此表面散射不是微表面的local行为,此时使用smooth-surface diffuse model.
中间情况,当微表面roughness有的比散射距离大、有的小的时候,roughness-surface diffuse model可以适用.effective surface是指不规则度大于次表面散射距离的部分.diffuse 和specular 反射在微表面理论中有不同的roughness值,specular 项使用the actual surface的roughness,diffuse项使用一个更小的值–以来与effective surface.
观测距离也有作用,它决定了"微表面"的定义,比如月球,因为其明显的反射现象,通常使用rough-surface diffuse model.但当从地球看时,”微表面“定义的范围要大得多,不奇怪能看到反射现象.
这三个表面有相同的NDFs,但微表面不规则度和次表面散射的距离相对大小不同,左上,此次表面散射距离小于微表面不规则度;右上,反之,下面,展示了微表面有多个roughenss值,红色虚线表示仅包含较大微观结构的有效表面,比次表面散射距离远.
9.9.3 Smooth-Surface Subsurface Models
smooth-surface微表面模型,也就是讨论微表面的不规则度比次表面散射距离小的材质模型.这类材质的Diffuse Shading不被表面的roughness直接影响.如果diffuse和specular项耦合,roughness会间接影响diffuse shading.
在某些实时渲染应用中,此表面散射模型有一个Lambertian 项,但它不能解释光在表面的反射,不适用次表面散射.这类BRDF diffuse term为:
f d i f f ( l ⃗ , v ⃗ ) = ρ s s π f_{diff}(\vec l,\vec v)=\frac{\rho_{ss}}{\pi} fdiff(l,v)=πρss
为了提升这个模型,在微表面(specular)和次表面(diffuse)反射间需要增加一个能量trade-off(平衡、交换),菲涅尔效应意味着随着如何光的角度 θ \theta θ变化表面-次表面能进行量交换,入射角增大,diffuse反射随着specular反射增大而增大,一个基本的考虑平衡的方法是:diffuse乘以1-specular项的Fresnel部分.如果specular项是一个平面镜的一部分,diffuse term为:
f d i f f ( l ⃗ , v ⃗ ) = ( 1 − F ( n ⃗ , l ⃗ ) ) ρ s s π f_{diff}(\vec l,\vec v)=(1-F(\vec n,\vec l))\frac{\rho_{ss}}{\pi} fdiff(l,v)=(1−F(n,l))πρss
如果specular项是微表面BRDF的一部分,diffuse term为:
f d i f f ( l ⃗ , v ⃗ ) = ( 1 − F ( h ⃗ , l ⃗ ) ) ρ s s π f_{diff}(\vec l,\vec v)=(1-F(\vec h,\vec l))\frac{\rho_{ss}}{\pi} fdiff(l,v)=(1−F(h,l))πρss
上述两式输出结果为均匀分布,因为输出结果不依赖于 v ⃗ \vec v v,这是有意义的,因为光在发射前会经历多次散射,所以它的出射光会是随机的.但这有两个理由证明它的出射光不是完全均匀的,首先diffuse BRDF项随入射方向变化,根据Helmholtz reciprocity必定也随着出射方向变化;其二光线出射时必定经历折射,这意味着出射光会偏向些方向上.Shirley等人提出了一个在同时支持能量守恒和亥姆霍兹互易性的情况下,处理表面菲涅耳效应和表面-次表面散射平衡的耦合扩散项,该推导假设Schlick近似法用于菲涅耳折射率:
f d i f f ( l ⃗ , v ⃗ ) = 21 20 π ( 1 − F 0 ) ρ s s ( 1 − ( 1 − ( n ⃗ ⋅ l ⃗ ) + ) 5 ) ( 1 − ( 1 − ( n ⃗ ⋅ v ⃗ ) + ) 5 ) f_{diff}(\vec l,\vec v)=\frac{21}{20\pi}(1-F_0)\rho_{ss}(1-(1-(\vec n\cdot\vec l)^+)^5)(1-(1-(\vec n\cdot\vec v)^+)^5) fdiff(l,v)=20π21(1−F0)ρss(1−(1−(n⋅l)+)5)(1−(1−(n⋅v)+)5)
上式仅适用于完美菲涅尔镜.Ashikhmin和Shirley提出(Kelemen合Szirmay-Kalos进一步完善)了一个通用的可用于计算与任何镜面反射能量互换、扩散的diffuse项和specular项的公式:
f d i f f ( l ⃗ , v ⃗ ) = ρ s s ( 1 − R s p e c ( l ⃗ ) ) ( 1 − R s p e c ( v ⃗ ) ) π ( 1 − R s p e c ‾ ) f_{diff}(\vec l,\vec v)=\rho_{ss}\frac{(1-R_{spec(\vec l)})(1-R_{spec(\vec v)})}{\pi(1-\overline {R_{spec}})} fdiff(l,v)=ρssπ(1−Rspec)(1−Rspec(l))(1−Rspec(v))
其中 R s p e c R_{spec} Rspec是specular项的directional albedo, R s p e c ‾ \overline {R_{spec}} Rspec是它的球面上的加权平均值, R s p e c R_{spec} Rspec能被后文介绍的两个公式计算并且能存储到一个lut里(折射率为第三轴), R s p e c ‾ \overline {R_{spec}} Rspec与前文 R s F 1 ‾ \overline {R_{sF_1}} RsF1用相同的方式计算.与前文介绍的不同指出在于我们不适用 R s F 1 R_{sF_1} RsF1而用 R s p e c R_{spec} Rspec–包含Fresnel和多次弹射的specular项 f m s f_{ms} fms的full specular BRDF项的directional albedo,这提升了 R s p e c R_{spec} Rspec的lut的维数–不仅依赖于roughness α \alpha α和,仰角 θ \theta θ还以来于Fresnel 反射率.Imageworkds的Kelemen-Szirmay-Kalos的实现中结合diffuse term 他们用了三维的lut–折射率为第三轴,式的 R s p e c R_{spec} Rspec比 R s F 1 R_{sF_1} RsF1更平滑,且16x16x16就足够了.
如果BRDF使用Schlick Fresnel近似且不包含多次弹射的specular项, F 0 F_0 F0能从积分中分解出来,这样做能让 s p e c _{spec} spec的lut变成二维.
…一些论文介绍…352,353
9.9.4 Rough-Surface Subsurface Models
Burley将包含了roughness效果和匹配了测量材料的diffuse BRDF 项作为Disney principled shading 模型的一部:
f d i f f ( l ⃗ , v ⃗ ) = χ + ( n ⃗ ⋅ l ⃗ ) χ + ( n ⃗ ⋅ v ⃗ ) ρ s s π ( ( 1 − k s s ) f d ) + 1.25 k s s f s s ) f_{diff(\vec l,\vec v)}=\chi^+(\vec n\cdot\vec l)\chi^+(\vec n\cdot\vec v)\frac {\rho_{ss}}{\pi}((1-k_{ss})f_d)+1.25k_{ss}f_{ss}) fdiff(l,v)=χ+(n⋅l)χ+(n⋅v)πρss((1−kss)fd)+1.25kssfss)
其中:
f d = ( 1 + ( F D 90 − 1 ) ( 1 − n ⃗ ⋅ l ⃗ ) 5 ) ( 1 + ( F D 90 − 1 ) ( 1 − n ⃗ ⋅ v ⃗ ) 5 ) , f_d=(1+(F_{D90}-1)(1-\vec n\cdot\vec l)^5)(1+(F_{D90-1})(1-\vec n\cdot\vec v)^5), fd=(1+(FD90−1)(1−n⋅l)5)(1+(FD90−1)(1−n⋅v)5),
F D 90 = 0.5 + 2 α ( h ⃗ ⋅ l ⃗ ) 2 , F_{D90}=0.5+2\sqrt{\alpha}(\vec h\cdot\vec l)^2, FD90=0.5+2α(h⋅l)2,
f s s = ( 1 ( n ⃗ ⋅ l ⃗ ) ( n ⃗ ⋅ v ⃗ ) − 0.5 ) F S S + 0.5 , f_{ss}=(\frac {1}{(\vec n\cdot\vec l)(\vec n\cdot\vec v)} - 0.5)F_{SS}+0.5, fss=((n⋅l)(n⋅v)1−0.5)FSS+0.5,
F S S = ( 1 + ( F S S 90 − 1 ) ( 1 − n ⃗ ⋅ l ⃗ ) 5 ) ( 1 + ( F S S 90 − 1 ) ( 1 − n ⃗ ⋅ v ⃗ ) 5 ) , F_{SS} = (1+(F_{SS90} - 1)(1-\vec n\cdot\vec l)^5)(1+(F_{SS90}-1)(1-\vec n\cdot\vec v)^5), FSS=(1+(FSS90−1)(1−n⋅l)5)(1+(FSS90−1)(1−n⋅v)5),
F S S 90 = α ( h ⃗ ⋅ l ⃗ ) 2 , F_{SS90}=\sqrt\alpha(\vec h\cdot\vec l)^2, FSS90=α(h⋅l)2,
α \alpha α是specular roughness.在各向异性的情况下,使用 α x \alpha_x αx和 α y \alpha_y αy的中间值.这个公式常被成为Disney diffuse model.
次表面项 f s s f_{ss} fss受到Hanrahan-Krueger BRDF的影响且作为远离的物体的全局次表面散射的不费算力的替代方式.这个diffuse model 将依赖于用户控制的参数 k s s k_{ss} kss的 f s s f_{ss} fss和 f d f_d fd rough diffuse term混合.
Disney diffuse model已经被应用到电影中和游戏中(无次表面散射项).完整的Disney diffuse BRDF还包括一个sheen项–主要用于织物模型,也能补偿因为缺少多次反射specular项造成的能量损失.Disney sheen项会造9.10讨论.几年后,Burley提出了该模型全局次表面散射技术的更新.
因为Disney模型在specular BRDF项中使用了同样的roughness,这回导致一些材质的建模会变得困难,但可以使用不同的diffuse roughness值来简单修复.
大多数其他rough-surface diffuse BRDFs已经发展为使用微表面理论–NDF D,micro-BRDF f μ f_\mu fμ、masking-shadowing function G 2 G_2 G2有不同的选择.最著名的是Oren和Nayar提出的,Oren-Nayer BRDF,使用Lambertian micro-BRDF,a spherical Gaussian(球形高斯) NDF,Torrance-Sparrow “V-cavity” masking-shadowing function.完整的BRDF模拟了一次二次弹射,他们在论文中还提出一个简单的"定性(qualitative)"模型.之后又有各种研究提升定性模型和让BRDF更接近smooth-surface diffuse模型.
Oren-Nayer模型架设了一个微表面模型–有与当前的specular模型完全不同的normal distribution、masking-shadowing functions.两种微表面模型都继承自各向同性的GGX NDF和高度相关的Smith masking-shadowing function.
Gotanda’s BRDF:specular关联diffuse项,没考虑面的相互作用,函数复杂.
Hammon使用Gotanda一样的NDF,masking-shadowing、micro-BRDF,提出一种包括interreflections的BRDF,他展示相互作用对于这个微表面模型的整合是很重要的,表现为
粗糙表面的总反射率的一半,然而二次弹射能量几乎全部丢失,所以Hammon使用了来自两次弹跳的数据模拟.此外,可能是因为添加了相互反射消除了数据,Hammon能够对模拟结果生成一个相当简单的函数:
f d i f f ( l ⃗ , v ⃗ ) = χ + ( n ⃗ ⋅ l ⃗ ) χ + ( n ⃗ ⋅ v ⃗ ) ρ s s π ( ( 1 − α g ) f s m o o t h + α g f r o u g h + ρ s s f m u l t i ) , f_{diff}(\vec l,\vec v)=\chi^+(\vec n\cdot\vec l)\chi^+(\vec n\cdot\vec v)\frac {\rho_{ss}}{\pi}((1-\alpha_g)f_{smooth}+\alpha_g f_{rough}+\rho_{ss}f_{multi}), fdiff(l,v)=χ+(n⋅l)χ+(n⋅v)πρss((1−αg)fsmooth+αgfrough+ρssfmulti),
其中:
f s m o o t h = 21 20 ( 1 − F 0 ) ( 1 − ( 1 − n ⃗ ⋅ l ⃗ ) 5 ) ( 1 − ( 1 − n ⃗ ⋅ v ⃗ ) 5 ) , f_{smooth}=\frac {21}{20}(1-F_0)(1-(1-\vec n\cdot\vec l)^5)(1-(1-\vec n\cdot\vec v)^5), fsmooth=2021(1−F0)(1−(1−n⋅l)5)(1−(1−n⋅v)5),
f r o u g h = k f a c i n g ( 0.9 − 0.4 k f a c i n g ) ( 0.5 + n ⃗ ⋅ h ⃗ n ⃗ ⋅ h ⃗ ) , f_{rough}=k_{facing}(0.9-0.4k_{facing})(\frac {0.5+\vec n\cdot\vec h}{\vec n\cdot\vec h}), frough=kfacing(0.9−0.4kfacing)(n⋅h0.5+n⋅h),
f f a c i n g = 0.5 + 0.5 ( l ⃗ ⋅ v ⃗ ) , f_{facing}=0.5+0.5(\vec l\cdot\vec v), ffacing=0.5+0.5(l⋅v),
f m u l t i = 0.3641 α g f_{multi}=0.3641\alpha_g fmulti=0.3641αg
α g \alpha_g αg是GGX pecular roughness.注意 f s m o o t h f_{smooth} fsmooth与diffuse BRDF项约掉了 ρ s s π \frac {\rho_{ss}}{\pi} πρss因子.总之Hammon’s diffuse BRDF不费算力.这类BRDF适合表面辐射大于散射距离,对某些材质表现不好.
Lambertian 项仍被实时渲染程序使用,主因是其低消耗,再它对使用间接和烘焙光的diffuse模型友好,它与更复杂的模型的表现效果视觉上很细微.
9.10 BRDF Models for Cloth
游戏神秘海域4(Uncharted 4 )使用了织物系统,坐上的球使用了standard BRDF(GGX 微表面specular,Lambertian diffuse);上中为(织物)fabric BRDF;其他球体增加了一个不同不同的逐像素变量,从左往右从上往下依次为:编织细节(fabric weave details),织物年代(fabric aging),瑕疵细节(imperfection details),小划痕(small wrinkles).(UNCHARTED 4 A Thief 's End
c /TM 2016 SIE. Created & developed by Naughty Dog LLC.))
织物的微表面和其他材质不一样,根据织物类型,它可能有高度重复的微表面结构、从表面垂直凸出的圆柱体.因此布料表面由特定的风格需要特殊的shading模型,比如各向异性高亮(anisotropic specular highlights),粗糙散射(asperity scattering)(光通过半透的颗粒散射产生的亮边效应),甚至从视线方向的颜色偏移(color shafts)(不同颜色光穿过织物产生)(参考sun shaft效果).
撇开BRDF不看,足够仿真的织物要有频繁变化的外观.
Cloth BRDF模型有三种策略:根据观察得来的经验模型(empircal models created from observation),基于微表网理论的模型,维圆柱体模型(micro-cylinder models).后文回顾其中重要的几个例子.
9.10.1 Empirical Cloth Models
观察经验得来的布料模型.
在神秘海域2(https://blog.csdn.net/toughbro/article/details/84206686)中布料表面使用如下diffuse BRDF term:
f d i f f ( l ⃗ , v ⃗ ) = ρ s s π ( k r i m ( ( v ⃗ ⋅ n ⃗ ) + ) α r i m + k i n n e r ( 1 − ( v ⃗ ⋅ n ⃗ ) + ) α i n n e r + k d i f f ) , f_{diff}(\vec l,\vec v)=\frac {\rho_{ss}}{\pi} (k_{rim}((\vec v\cdot\vec n)^+)^{\alpha_{rim}}+k_{inner}(1-(\vec v\cdot\vec n)^+)^{\alpha_{inner}}+k_{diff}), fdiff(l,v)=πρss(krim((v⋅n)+)αrim+kinner(1−(v⋅n)+)αinner+kdiff),
其中 k r i m , k i n n e r , k d i f f k_{rim},k_{inner},k_{diff} krim,kinner,kdiff为用户控制的缩放因子,依次为:边缘照明项,照亮前向(内)表面的项,Lambertian 项. α r i m 、 α i n n e r \alpha_{rim}、\alpha_{inner} αrim、αinner控制边缘和内向(rim and inner)项,这些行为都是非物理的,与视线相关但与光线无关.
在神秘海域4里使用了微表面(微网,microfacet)和微圆柱模型(micro-cylinder model)–根据布料类型(具体细节为如下两项):specular term和一个diffuse term的"wrap lighting"经验的次表面散射近似:
f d i f f u s e ( l ⃗ , v ⃗ ) ( n ⃗ ⋅ , l ⃗ ) + ⇒ ρ s s π ( c s c a t t e r + ( n ⃗ ⋅ l ⃗ ) ) ∓ ( n ⃗ ⋅ l ⃗ + ω ) ∓ 1 + ω f_{diffuse}(\vec l,\vec v)(\vec n\cdot,\vec l)^+\Rightarrow \frac{\rho_{ss}}{\pi}(c_{scatter}+(\vec n\cdot\vec l))^{\mp}\frac {(\vec n\cdot\vec l+\omega)^{\mp}}{1+\omega} fdiffuse(l,v)(n⋅,l)+⇒πρss(cscatter+(n⋅l))∓1+ω(n⋅l+ω)∓
推到 f d i f f ( l ⃗ , v ⃗ ) ( n ⃗ ⋅ l ⃗ ) + . . f_{diff}(\vec l,\vec v)(\vec n\cdot\vec l)^+.. fdiff(l,v)(n⋅l)+..表明该模型既影响lighting也影响BRDF,箭头右边的项替换箭头左边的项.用户定义参数 c s c a t t e r c_{scatter} cscatter为散射颜色, ω ∈ [ 0 , 1 ] \omega\in[0,1] ω∈[0,1]控制缠绕光的宽度.
Disney在他们的diffuse BRDF中使用了一个光泽度(sheen)项来模拟粗糙度散射:
f s h e e n ( l ⃗ , v ⃗ ) = k s h e e n c s h e e n ( 1 − ( h ⃗ ⋅ l ⃗ ) + ) 5 f_{sheen}(\vec l,\vec v)=k_{sheen}c_{sheen}(1-(\vec h\cdot\vec l)^+)^5 fsheen(l,v)=ksheencsheen(1−(h⋅l)+)5,
c s h e e n c_{sheen} csheen是用户控制的广泽度项的强度值,光泽度颜色通过白色和 ρ s s \rho_{ss} ρss亮度归一化混合得到(通过其他参数控制).换句话说 ρ s s \rho_{ss} ρss通过除以它的亮度值隔离hue和saturation.
9.10.2 Microfacet Cloth Models
微网布料模型.
Ashikhmin等想用inverted Gaussian NDF去模拟天鹅绒(velvet),这个NDF在后续工作中稍作了修改,提出一种无masking-shadowing term和一个修正分母的一般材质的microfacet BRDF变体.
游戏教团1886(The Order:1886)中使用了修改的microfacet BRDF和一个Ashikhmin和Premoze的论文中的有diffuse项的天鹅绒(velvet)NDF:
velvet NDF: D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) π ( 1 + k a m p α 2 ) ∗ ( 1 + k a m p exp ( ( n ⃗ ⋅ m ⃗ ) 2 α 2 ( ( n ⃗ ⋅ m ⃗ ) 2 − 1 ) ) ( 1 − ( n ⃗ ⋅ m ⃗ ) 2 ) 2 ) D(\vec m)=\frac{\chi^+(\vec n\cdot\vec m)}{\pi(1+k_{amp}\alpha^2)}*({1+\frac{k_{amp}\exp(\frac{(\vec n\cdot\vec m)^2}{\alpha^2((\vec n\cdot\vec m)^2-1)})}{(1-(\vec n\cdot\vec m)^2)^2}}) D(m)=π(1+kampα2)χ+(n⋅m)∗(1+(1−(n⋅m)2)2kampexp(α2((n⋅m)2−1)(n⋅m)2))
α \alpha α控制inverted Gaussian的宽度, k a m p k_{amp} kamp控制振幅.完整的布料BRDF为:
f ( l ⃗ , v ⃗ ) = ( 1 − F ( h ⃗ , l ⃗ ) ) ρ s s π + F ( h ⃗ , l ⃗ ) D ( h ⃗ ) 4 ( n ⃗ ⋅ l ⃗ + n ⃗ ⋅ v ⃗ − ( n ⃗ ⋅ l ⃗ ) ( n ⃗ ⋅ v ⃗ ) ) f(\vec l,\vec v)=(1-F(\vec h,\vec l))\frac{\rho_{ss}}{\pi}+\frac{F(\vec h,\vec l)D(\vec h)}{4(\vec n\cdot\vec l+\vec n\cdot\vec v-(\vec n\cdot\vec l)(\vec n\cdot\vec v))} f(l,v)=(1−F(h,l))πρss+4(n⋅l+n⋅v−(n⋅l)(n⋅v))F(h,l)D(h)
这个BRDF的变体在神秘海域4(Uncharted 4)中的杨棉、棉花这类织物中被使用.
Imageworkds使用了一个添加了光泽度项(sheen)的不同的inverted NDF且可添加到任何BRDF中:
D ( m ⃗ ) = χ + ( n ⃗ ⋅ m ⃗ ) ( 2 + 1 α ) ( 1 − ( n ⃗ ⋅ m ⃗ ) 2 ) 1 2 α 2 π D(\vec m)=\frac{\chi^+(\vec n\cdot\vec m)(2+\frac {1}{\alpha})(1-(\vec n\cdot\vec m)^2)^{\frac {1}{2\alpha}}}{2\pi} D(m)=2πχ+(n⋅m)(2+α1)(1−(n⋅m)2)2α1
尽管这个NDF没有对Smith masking-shadowing函数的封闭解,Imageworkds能在数值上近似.Estevez和Kulla会继续讨论masking-shadowing函数和sheen项和BRDF其他部分的能量保存(conservation).
上述的cloth模型对于织物都有所不足,下一个模型会尝试讨论得到一个织物的通用模型形式.
9.10.3 Micro-Cylinder Cloth Models
微圆柱布料模型
布料得micro-cylinder models和给头发的models很像,14.7.2讨论的hair models会提供更多额外的内容.这类模型核心思路是的假设表面被一维线覆盖.Kajiya and Kay提出了一个简单的模型给Banks提供了见识的基础.名为Kajiya-Kay BRDF或Banks BRDF.这个概念以观察为基础:表面由在任何给定位置有一个正太数法线的一维线条组成–法线平面垂直于切向量.尽管该框架发展了很多新的micro-cylinder models,原始的Kajiya-Kay model因为简单仍有应用比如神秘海域4中Kajiya–Kay BRDF被用于丝绸和天鹅绒等闪光织物的specular term.
Dreamworks给织物使用了一个相对简单–艺术可控的micro-cylinder model.纹理控制roughness,color,螺纹方向(thread direction)–可以模拟天鹅绒和类似织物的表面.经纱和纬纱(the warp and weft threads)能设置不同的参数以模拟复杂的变色的织物–比如闪光丝绸.将模型归一化为节能模型。
Sadeghi等提出了一种基于测量单位织物样品和独立螺纹的micro-cylinder model,这个模型考虑了螺纹间的遮挡和阴影(inter-thread masking and shadowing).
由于某些原因hair BSDF模型也被用于cloth.Marschner等在RenderMan的PxrSurface材质使用了一个模糊(fuzz)lobe R R R项,其中之一是Wu 和Yuksel[1924, 1926][1924, 1926]继承Disney的动画电影[1525][1525]的hairmo model实现的一个实时布料模型系统.
9.11 Wave Optics BRDF Models
波光学BRDF模型,最后几节讨论将光视为光线而不是波的几何光学.在page303讨论的几何光学是基于夹花色–任何表面不规则都小于一个波长或大于大约100个波长.
真实材质不会这么巧,而是个各种不规则都都有–包括1-100倍波长范围内的.我们把这类不规则度称为纳米而之前讨论的区分开.纳米尺寸的反射率不能被几何光学模拟.需要光和波光学(物理光学)来模拟.
表面如果带厚度(surface layers,films)且厚度接近一个光波长会产生一些与光的波动性质有关的光学现象.
本节讨论光的衍射、干涉及他们对真实渲染的重要性.
9.11.1 Diffraction Models(衍射)
。。。
Holzschuch,Pacanowski
9.11.2 Models for Thin-Film Interface
薄膜干涉现象发生在薄介质层顶部和底部光路相互干涉(根据光波长和介质厚度的关系)时,
…
Smits ,Meyer,
游戏:(使命召唤)Call of Duty: In nite Warfare,
9.12 Layered Materials
材质分层.一个表面会覆盖腐蚀(dust),water,ice,snow等;也可能有涂层或复合材质层.一个最简单直观的分层是:透明涂层(clear coat)–一个光滑半透层覆盖在一个基地或其他材质上.比如一个光滑的油漆半透涂层覆盖在粗糙的木质表面.Disney principled shading model包括一个半透涂层项,UE,RenderMans’PxrSurface材质和Dreamworkds,Imageworks等也都有.
…
透明涂层也有颜色…考虑视线和光线方向.实现:Disney principled model,Unreal Engine并不能模拟这种视图依赖性。还有一些是这样的,比如在pxrsurface和imageworks和dreamworks着色模型中的实现.ImageWorks模型还允许连接任意数量的不同类型的层.
在一般情况下,不同的层可能有不同的表面等.比如消息穿过平坦的路面,凹凸土壤结冰,纸箱包裹褶皱的塑料.在电影领取大多数分层模型都有各自的normal,但在实时应用中通常不这么做–UE4将之作为了备选项.
Weidlich和Wilkie提出了一种分层微表面模型–假设层的厚度比微表面小.他们的模型支持任意数量的层,能跟踪从顶层到底层再向上返回的反射、折射事件,但不考虑多个层的连接.Jakob等全面准确的呈现了分层材质的框架,包括多个反射.虽然不适合实时运行,但改系统可用于地面真实性比较,所用的想法可能会对未来的实时技术有建设作用.
Call of Duty: In nite Warfare中使用分层系统需要注意.它允许用户合成任意数量的材质层,它支持折射、散射、层之间基于路径长度的吸收,每层有独立的normal.该系统是一个杰出的实时材质系统,支持60Hz实时运行[sig17]
9.13 Blending And Filtering Materials
材质的混合是混合诸如复合材质的BRDF参数这类属性的过程.比如模拟光滑金属表面的腐蚀斑点,可以绘制一张掩码图片控制腐蚀的位置并且用它混合腐蚀和金属材质属性(pecular color F 0 F_0 F0,diffuse color ρ s s \rho_{ss} ρss,roughness α \alpha α),依据纹理存储的参数每个混合的材质也能分开.混合能创建一个新的纹理,过程称为"baking",或者在shader里混合,尽管表面法线 n ⃗ \vec n n技术上不是BRDF参数,但它对材质外观非常重要,所以材质混合也包括normal map 混合.
实时渲染软件中材质混合已经很普遍,比如Order:1886的复杂的材质混合能从扩展库和多个独立掩码控制的参数让创作者随意创作.大多数材质混合是离线处理的,但某些操作需要延迟到实时渲染.
Substance Painter ,Substance Designer,Mari
动态混合纹理元素在保存内存的同时提供多种效果:
>- 显示建筑、车辆、活物上的动态破坏
>- 允许用户在游戏中自定义装备和衣服
>- 提升环境和角色的视觉多样性
有时一个材质需要混合到另一个非不透明材质上甚至完全不透明材质的混合都会有混合材质的边界过度部分需要特殊处理.任何一种情况都需要严格正确评估shading model和混合结果,但,如果shading会更快就需要考虑BRDF参数的混合.
当材质属性与最终着色颜色有linear或接近linear关系的时(比如diffuse和specular 颜色参数),内插法是没有问题的;当参数为非linear时(specular roughess),用mask插值计算是错误的.
混合法线贴图需要特殊对待,通常将至视为衍生normal map的height maps的混合过程可以得到较好的结果.但有时其他方案会更好,比如在基础材质上覆盖一层细节normal map.
材质滤波器(Material filtering)和材质混合类似.纹理属性(bilinear,filtering,mipmapping等GPU用到的采样属性)存储在textures上,但这个机制(mechanisms)建立在假设过滤的量(shading过程的input)和final color(shading输出颜色)有linear关系.normal maps或纹理上包含非线性关系的BRDF参数(比如roughness)使用linear mipmapping会造成问题,这些问题表现为镜面混淆(specular aliasing(flickering highlights))或预期外的gloss或brighness随着面与摄像机距离变化而变化的情况.解决这两个问题的方法称为specular antilaliasing(镜面抗锯齿).接下来讨论一些相关技术.
左侧为原图,中图为低分辨率normal map的结果,右图为低分辨率normal map但在ideal NDF中有normal 和gloss值适配方法.右图更好的表现了原图,在低分辨率情况下不易出现镜面分销.(Image courtesy of Patrick Conran,ILM.)
9.13.1 Filtering Normals and Normal Distributions
关于mipmao生成时的解决方案
之前分项的材质filtering技术多是包含了normals和normals distribution functions的specular aliasing,鉴于其(法线相关的Filtering)重要性,本文会更深入的讨论.
为了弄清异常出现原因和解决方法,需要回顾NDF.当摄像机和表面距离增大时,随着从bump maps领域移动到NDF领域,之前覆盖多个像素的表面结构(在RT上占的像素大小)可能减少到子像素大小(小于一个像素).这与mipmaps息息相关.
这部分请看原文,理解不到位.
通俗来讲,就是一张精度为A的normap匹配的是精度为A的纹理,当使用mipmaps时,normal map精度会丢失.
下侧为缩放后的情况,红色箭头为normal(平均值)–包围着的时Beckmann NDF,可以看到缩放后,一个texel使用的normal丢失了信息.
…
最好的情况.filtering操作–比如mipmapping需要考虑normal distribution–不是normals和roughness 值.思考一下NDFs和normals的关系.NDF通常定义下local tangent space空间下的normal maps的逐像素normal.但,当给nomrals filtering NDFs时,考虑normal map和roughness map的贡献值为一个几何面tangent space扭曲(不均匀、不平均)的NDF.
更早的时候尝试通过将一个或多个NDF lobes平均化来解决NDF filtering问题.但由于它健壮性和效率问题使用并不多.当前使用最多的技术是计算normal distribution的方差(variance),Toksving观察到normals是平均的而非再归一化的,normal 的平均长度与normal distribution反相关.也就是对于某个点不同方向的法线越多,他们的平均值越短.它展示了一种基于这个normal长度的修改NDF roughness参数的方法.调整具有修正roughness的BRDF模拟filtered normals的独立的效果.
Toksvig的最初的方程与Blinn-Phong NDF结合:
α p ′ = ∣ ∣ n ⃗ ‾ ] α p ∣ ∣ ∣ ∣ n ⃗ ‾ ∣ ∣ + α p ( 1 − ∣ ∣ n ⃗ ‾ ∣ ∣ ) \alpha_{p}^{'}=\frac {||\overline {\vec n}]\alpha_p||}{||\overline {\vec n}||+\alpha_p(1-||\overline {\vec n}||)} αp′=∣∣n∣∣+αp(1−∣∣n∣∣)∣∣n]αp∣∣
其中 α p \alpha_p αp是初始roughness值, α p ′ \alpha_{p}^{'} αp′是修改后的值, ∣ ∣ n ⃗ ‾ ∣ ∣ ||\overline{\vec n}|| ∣∣n∣∣是averaged normal的长度.由于Beckmann NDF跟Blinn-Phong NDF很接近,上式乘以 α p = 2 α b − 2 − 2 \alpha_p=2\alpha_{b}^{-2}-2 αp=2αb−2−2(Walter等)就可以用Beckmann NDF了.由于GGX和Blinn-Phong或Beckmann没有清晰的转换公式,结合GGX不是很容易.在高光(highlight)中心 α b \alpha_b αb和 α g \alpha_g αg等值,但hightlight模拟方式不一样.
。。。。
LEAN,LEADR,
引用
[1924]: Wu, Kui, and Cem Yuksel, “Real-Time Fiber-Level Cloth Rendering,” Symposium on Interactive 3D Graphics and Games, Mar. 2017. Cited on p. 359
[1525] Sadeghi, Iman, Heather Pritchett, Henrik Wann Jensen, and Rasmus Tamstorf, “An Artist Friendly Hair Shading System,” in ACM SIGGRAPH 2010 Papers, ACM, article no. 56, July
- Cited on p. 359, 644
[1926]: Wu, Kui, and Cem Yuksel, “Real-Time Cloth Rendering with Fiber-Level Detail,” IEEE
Transactions on Visualization and Computer Graphics, to appear. Cited on p. 359