(个人笔记,由于刚开始学习再加上英语不太好,所以有的地理解的可能不太对,望指正)
Chapter 9 Physically Based Shading
Physics of Light
在光物理中,光被认为是一种电磁横波,垂直于它传播方向震荡电和磁场的波。
该图描述的是一种偏振光,而自然光通常是非偏振光。为了理解非偏振光,对于理解单色光和偏振光是非常重要的,因为任何光都可以由多个单色光组成。
如果追踪波上的一点在一个给定的相位,它会以相同的速度移动,这个速度称为相速度(phase velocity)
光是携带能量的,它携带的能量包含磁场和电场的能量,这两部分是成比例的,电场的能量要比磁场的能量大的多,所以通常只关注电场的能量。平均能量流的密度就是辐照度(irradiance E)。
光波组合是线性的。但是辐照度是跟幅度的平方成比例的,这会导致一个矛盾,为了解释这个问题看以下例子。
比如计算除了相位不同的单色光的和,n个波的幅度都是a,那么 E 1 = k a 2 E_1=ka^2 E1=ka2,它们的情况如图所示。
左图为相长干涉(constructive interference),中图为相消干涉(destructive interference),右图为非相干加法(incoherent addition),前两种为coherent addition的特例。
物体中电荷震荡会产生光波,光波产生后在空间中传播直到碰到相互作用的物质。电场的震动反过来导致电子的移动,之后电子产生新的光波导致入射光波能量方向的转变,称为散射(scattering)。散射光波与入射光波的频率相同。通常来说入射光波是由多个频率的光波构成,某一频率的光波一般不影响其他频率光波的发射的能量,除了荧光(fluorescene)和磷光(phosphorescence)。
一个分子会将光散射到各个方向,不同的方向强度不同。短波光比长波光散射效率高。
在渲染中我们关注很多分子的集合,光与分子集合的交互和与单个分子的交互行为是不同的。通过很多临近分子的散射光是有一致性的,并表现出干涉效果。
Particales
在理想气体中,分子的位置是完全随机的,它们之间也没有相互作用,空气在标准气压下可以认为是这种效果,在这种情况下,不同相位的波对于不同分子的散射是随机的且不断变化,效果如9-2右图所示。如果是分子被压缩,它们之间的距离小于光波的波长,此时光波之间会产生相长干涉如9-2左图,这表明增加分子的密度会增加散射光的效果。Making the clusters larger, while still keeping the overall molecular density constant, will further increase scattered light intensity, until the cluster diameter becomes close to a light wavelength. Beyond that point, additional increases in cluster size will not further increase the scattered light intensity(为啥保证密度不变,不知道咋翻译)。
在多分子粒子中,如果粒子直径小于波长,那么散射效果将被增强,当直径超过波长将不会影响散射的行为。
Media
在均匀介质中除了传播方向的散射光,其它方向的散射光会相互产生相消干涉,之后的光波除了相速度与振幅其余属性与原光波相同。原光波与新光波的相速度的比值称为折射率(index of refraction, IOR),用n表示。不同波长的光波的衰减率(attenuation index, κ \kappa κ)和折射率不同。媒介对于给定波长的光波的影响可以通过复数 n + i κ n+i\kappa n+iκ表示。相速度不影响光波的表现,而影响它的是速度的变化。
非均匀介质通常可以认为是均匀介质加上散射粒子的混合效果。
散射跟吸收效果都是体积相关的。通常情况下,媒介的表现是散射与吸收效果的结合。
Surface
当光波从一个媒介进入另一个媒介时,相速度根据两种介质的折射率的比值 ( n 1 / n 2 ) (n_1/n_2) (n1/n2)发生变化,频率不变,波长也根据 ( n 1 / n 2 ) (n_1/n_2) (n1/n2)的比值进行变化。
折射导致光波的传播方向发生改变:
s i n ( θ t ) = n 1 n 2 s i n ( θ i ) sin(\theta_t) = \frac{n_1}{n_2}sin(\theta_i) sin(θt)=n2n1sin(θi)
折射公式被称为Snell’s law。金属不会发生折射。
如果表面的不规则比一个波长小,那么它不会对光波产生影响,如果比光波大很多,那么它被认为不影响它局部的不规则性,只有位于1-100倍波长之间的不规则性才会影响光传播的行为。
在渲染中,一般使用几何光学的概念,这个概念忽略干涉和衍射的效果,也就是说其表面的不规则性比一个波长小过着比100个波长大。
在渲染中,对待微观几何(microgeometry),不是直接将其看做是具体的微观表面,而是使用统计学来计算表面法线分布的方式体现。
Subsurface Scattering
折射光在物体内部也会发生反射。
次表面散射光离开表面的位置距离光纤进入表面的位置会有不同的分布,这个分布受媒介材质的散射粒子的密度和属性的影响。这个距离值对于着色的规模(像素大小,或者是着色样本的距离)会有影响,如果比着色规模小,那么就可以认为是0,否则就需要单独的处理次表面反射光离开表面的位置。两种类型被称为local subsurface scattering和global subsurface scattering。
Camera
BRDF
知乎:https://zhuanlan.zhihu.com/p/21376124
要计算进入观察点的辐射率,也就是计算 L i ( c , − v ) L_i(c, -v) Li(c,−v)的值,其中c为观察点camera的位置,-v表示视线方向。使用-v有两个好处:首先 L i ( ) L_i() Li()总是从给顶点指出,camera的位置就是这个意义;第二视线向量总是指向camera。
在本章中认为离开表面的辐射率等于camera接收到的辐射率。
L
i
(
c
,
−
v
)
=
L
o
(
p
,
v
)
L_i(c, -v) = L_o(p, v)
Li(c,−v)=Lo(p,v)
其中p是视线经过最近平面的交点。
如果只关注局部的反射现象,包括了表面反射和次表面散射,它只依赖于入射光线方向和观察方向,这个结果被描述为bidirectional reflectance distribution function (BRDF),表示为 f ( l , v ) f(l, v) f(l,v)。
入射光线和反射光线都有两个自由维度:与法线n的夹角
θ
\theta
θ,水平旋转角度
ϕ
\phi
ϕ。通常情况下BRDF包含四个变量,但是对于Isotropic BRDF来说,只需要记录光线向量和摄像机向量的夹角
ϕ
\phi
ϕ,不需要单独记录每个向量的旋转角度。
在当前情况下,可以认为入射光波长和反射光波长是相通的。不同波长的光反射量是不同的,要么将波长作为BRDF的输入值之一要么认为BRDF返回的是一个频谱分布值(spectral distribution),第一种方法通常用于离线渲染,在实时渲染中通常使用第二种方法,在实时渲染中通常将频谱分布值表示为RGB三元数。为了计算 L o ( p , v ) L_o(p,v) Lo(p,v)可以将BRDF结合反射公式:
L
o
(
p
,
v
)
=
∫
Ω
f
(
l
,
v
)
L
i
(
p
,
l
)
(
n
,
l
)
d
l
(
1
)
L_o(p,v)=\int_{\Omega}f(l,v)L_i(p,l)(n,l)dl \ \ \ (1)
Lo(p,v)=∫Ωf(l,v)Li(p,l)(n,l)dl (1)
可以省略为
L
o
(
p
,
v
)
=
∫
Ω
f
(
l
,
v
)
L
i
(
l
)
(
n
,
l
)
d
l
(
2
)
L_o(p,v)=\int_{\Omega}f(l,v)L_i(l)(n,l)dl \ \ \ (2)
Lo(p,v)=∫Ωf(l,v)Li(l)(n,l)dl (2)
物理规律需要BRDF满足两个条件:一是Helmholtz reciprocity,即满足 f ( l , v ) = f ( v , l ) f(l, v)=f(v, l) f(l,v)=f(v,l);第二是反射光线的能量不能比入射能量大。
directional-hemispherical reflectance描述了BRDF的能量转换程度,特别是它测量了入射光的能量消耗。
R
(
l
)
=
∫
v
∈
Ω
f
(
l
,
v
)
(
n
∙
v
)
d
v
R(l) = \int_{v\in \Omega}f(l, v)(n\bullet v)dv
R(l)=∫v∈Ωf(l,v)(n∙v)dv
v不代表单一的视线方向,而是扫描整个半球。它的范围是[0,1]表示能量保留的比例,0表示所有入射光线都被吸收或者以其他形式损失,1表示所有入射光都被反射。不同波长的光波的值不同,所以在渲染中通常R(l)表示为一个向量。
一个类似的但用于不同场景的方法hemispherical-directional reflectance
R
(
v
)
=
∫
l
∈
Ω
f
(
l
,
v
)
(
n
∙
l
)
d
l
R(v) = \int_{l\in \Omega}f(l, v)(n\bullet l)dl
R(v)=∫l∈Ωf(l,v)(n∙l)dl
最简单的BRDF的可行方法是Lambertian,他常用作次表面散射的计算。Lambertian表面的directional-hemispherical reflectance也是一个常量。
R ( l ) = π f ( l , v ) R(l) = \pi f(l,v) R(l)=πf(l,v)
Lambertian的常量反射值通常被称为 d i f f u s e c o l o r c d i f f diffuse \ color \ c_{diff} diffuse color cdiff或者 a l b e d o ρ albedo \ \rho albedo ρ,本章中为了强调它与次表面散射之间的关系,将其称为 s u b s u r f a c e a l b e d o ρ s s subsurface \ albedo \ \rho_{ss} subsurface albedo ρss,从上式中可以得到
f ( l , v ) = ρ s s π f(l,v)=\frac{\rho_{ss}}{\pi} f(l,v)=πρss
1 π \frac{1}{\pi} π1是由于对于cosin因子在半球上积分的结果 π \pi π而来的
Illumination
在局部光照中, L i ( l ) L_i(l) Li(l)是给定的,不需要单独计算。
全局光照计算场景中的光线是如何传播和反射的,本章中描述的是局部光照,也就是表面上某点处的着色结果。在真实世界中,光源都是区域光,它覆盖了一个非0的立体角,在本章中使用的光源都是方向光和精确光(punctual light),他们可以扩展成物理光源的近似:取一个很小的很远的区域光,定义 l c l_c lc为区域光的中心方向, c l i g h t c_{light} clight表示光的颜色,根据这个定义,方向光可以认为是当区域光范围收缩至0但保持 c l i g h t c_{light} clight不变,在这种情况下公式(2)中的积分可以被简化成
L o ( v ) = π f ( l c , v ) c l i g h t ( n ∙ l c ) + L_o(v)=\pi f(l_c, v)c_{light}(n \bullet l_c)^+ Lo(v)=πf(lc,v)clight(n∙lc)+
精确光的定义类似,唯一的区别是光源不需要是在很远的地方, c l i g h t c_{light} clight与距离的平方倒数成比例。在这种前提下对于多光源的情况可以使用:
L o ( v ) = π ∑ i = 1 n f ( l c i , v ) c l i g h t i ( n ∙ l c i ) + L_o(v)=\pi \sum_{i=1}^n f(l_{c_i}, v)c_{light_i}(n \bullet l_{c_i})^+ Lo(v)=πi=1∑nf(lci,v)clighti(n∙lci)+
注意 π \pi π会被BRDF中的 1 π \frac{1}{\pi} π1抵消,在使用学术文章中的方法时需要注意 π \pi π的问题。
Fresnel Reflectance
Fresnel 等式需要一个几何光学下的平面,也就是不包含任何位于1到100个波长范围的内的不规则。
入射光线会被分成反射与折射两部分,反射光线计算公式为
r i = 2 ( n ∙ l ) n − l r_i = 2(n \bullet l)n - l ri=2(n∙l)n−l
如图所示
折射受到接触面两面的物质的折射率影响,表面以上的折射率是 n 1 n_1 n1,表面以下的折射率是 n 2 n_2 n2
External Reflection
外反射是当 n 1 < n 2 n_1<n_2 n1<n2时的情况,也就是从空气进入物体的情况,与之相法内反射是从物体进入空气的情况。
对于给定的介质,Fresnel等式可以被定义为 F ( θ i ) F(\theta_i) F(θi),也就是只依赖于入射角度,不同波长的光波的值不同,因此在渲染中通常表示为一个向量。 F ( θ i ) F(\theta_i) F(θi)含有以下特性:
∙ \bullet ∙当 θ i \theta_i θi为0时,入射光线垂直射到表面上,此时的 F ( θ i ) F(\theta_i) F(θi)表示介质的镜面颜色,简写为 F 0 F_0 F0
∙ \bullet ∙随着 θ i \theta_i θi增加, F ( θ i ) F(\theta_i) F(θi)会增加,当 θ i \theta_i θi到达90时到达1。
在统计时,通常使用
s
i
n
(
θ
i
)
sin(\theta_i)
sin(θi)的变化替代
θ
i
\theta_i
θi的变化,原因如图所示:
因此在Fresnel中可以使用 F ( n , l ) F(n, l) F(n,l)来替代 F ( θ i ) F(\theta_i) F(θi)。
在渲染中通常使用Schlick公式来替代Fresnel方程:
F ( n , l ) ≈ F 0 + ( 1 − F 0 ) ( 1 − ( n ∙ l ) + ) 5 F(n,l)\approx F_0 + (1 - F_0)(1 - (n \bullet l)^+)^5 F(n,l)≈F0+(1−F0)(1−(n∙l)+)5
近似结果如图:
对于一些材质,Schlick的模拟结果会有偏差,一种简单的调整方式是修改指数值。
当使用Schlick公式时, F 0 F_0 F0是惟一的参数值,由于 F 0 F_0 F0是一个[0,1]区间内的值,所以很容易通过表面颜色提取来获得,并通过纹理保存,也可以通过近似计算得到:
F 0 = ( n − 1 n + 1 ) 2 F_0 = (\frac{n - 1}{n + 1})^2 F0=(n+1n−1)2
其中n是材质的折射指数,并近似将空气的折射指数认为是1。如果渲染表面不在空气中那么使用:
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
另一种更加普遍的Schlick近似公式:
F ( n , l ) ≈ F 0 + ( F 90 − F 0 ) ( 1 − ( n ∙ l ) + ) 1 p F(n,l)\approx F_0 + (F_{90} - F_0)(1 - (n \bullet l)^+)^\frac{1}{p} F(n,l)≈F0+(F90−F0)(1−(n∙l)+)p1
Typical Fresnel Reflectance Values
根据光学性质的不同,可以将介质分为三种类型:
- 电介质
- 金属
- 半导体
Fresnel Reflectance Values for Dielectrics
Fresnel Reflectance Values for Metals
Fresnel Reflectance Values for Semiconductors
Fresnel Reflectance Values in Water
Parameterizing Fresnel Values
一种常用的参数化包含了高光 F 0 F_0 F0和漫反射 ρ s s \rho_{ss} ρss。根据金属没有漫反射和电介质的 F 0 F_0 F0包含有限的可能值的事实,所以参数化包含了一个RGB表面颜色 c s u r f c_surf csurf和一个参数 m m m,称为"metalness"或"metallic"。当 m = 1 m = 1 m=1时 F 0 F_0 F0设置为 c s u r f c_surf csurf, ρ s s \rho_{ss} ρss设置为黑色,当 m = 0 m = 0 m=0时 F 0 F_0 F0设置为电介质值 ρ s s \rho_{ss} ρss设置为 c s u r f c_surf csurf
Internal Reflection
内部反射发生于
n
1
>
n
2
n_1>n_2
n1>n2的情况。
根据Snell法则, s i n θ t > s i n θ i sin\theta_t>sin\theta_i sinθt>sinθi。
在外部反射中,对于任意
s
i
n
θ
t
sin\theta_t
sinθt都有一个位与0到1范围内的
s
i
n
θ
i
sin\theta_i
sinθi与之对应。但是在内部反射中,当
θ
i
\theta_i
θi大于临界值
θ
c
\theta_c
θc时,
s
i
n
θ
t
>
1
sin\theta_t>1
sinθt>1,这是不可能的,因此当
θ
i
>
θ
c
\theta_i>\theta_c
θi>θc时不存在
θ
t
\theta_t
θt与之对应,此时所有入射光线都被反射,该现象称为完全内反射(total internal reflection)。
内部反射只发生于电介质中,因为金属和半导体会吸收在它们中传播的光线。电介质的 θ c \theta_c θc的计算方式如下:
s i n θ 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
当表面的不规则小于一个像素时,它不能够被直接显示,BRDF使用统计的方法来表示。
除了法线的分布,还有其他的因素影响微观几何的反射:
微观几何的高度有时会影响反射的结果:
对于所有的表面,随着 θ i \theta_i θi与表面法线的夹角增大,表面的不规则程度都会降低。
在某些情况下微观表面细节也会影响次表面反射结果,比如说回射现象:
Microfacet Theory
每一个微面都是平滑的,它们都一个微面法线m,每一个微面都单独使用微面BRDF f μ ( l , v , m ) f_\mu(l,v,m) fμ(l,v,m)进行光的反射。
微面的一个重要性质是微面法向量的统计分布(normal distribution function, NDF),使用 D ( m ) D(m) D(m)表示。在整个微面法向量球面上对 D ( m ) D(m) D(m)进行积分可以得到微面的面积,如果对于 D ( m ) ( n ∙ m ) D(m)(n\bullet m) D(m)(n∙m)进行积分,也就是将 D ( m ) D(m) D(m)投影到宏观表面(macrosurface)平面上,可以得到宏观表面面片的面积,按照惯例来说为1:
∫ m ∈ Θ D ( m ) ( n ∙ m ) d m = 1 \int_{m\in \Theta}D(m)(n\bullet m)dm = 1 ∫m∈ΘD(m)(n∙m)dm=1
积分对于整个球面进行,用 Θ \Theta Θ表示。
In practice, most microstructure models used in graphics are heightfields, which means that D(m) = 0 for all directions m outside Ω \Omega Ω。但是上式对于非高度场微观结构是适用的。
如果将微面和宏观表面都投影到垂直于视线的平面上:
∫ m ∈ Θ D ( m ) ( v ∙ m ) d m = v ∙ n \int_{m\in \Theta}D(m)(v\bullet m)dm = v\bullet n ∫m∈ΘD(m)(v∙m)dm=v∙n
以上两个公式都不需要截断到0。
直观上来看NDF类似于微面法线的直方图。
由于微面之间的遮挡,只需要计算可见的微面部分,可以根据:可见微面投影面积的和等于投影到宏观面上的面积。它定义为 m a s k i n g f u n c t i o n G 1 ( m , v ) masking function G_1(m, v) maskingfunctionG1(m,v),表示具有法向量m的微面在视线向量v方向的可见部分,结合这些定义可以得到:
∫ m ∈ Θ G 1 ( m , v ) D ( m ) ( v ∙ m ) + d m = v ∙ n \int_{m\in \Theta}G_1(m,v)D(m)(v\bullet m)^{+}dm = v\bullet n ∫m∈ΘG1(m,v)D(m)(v∙m)+dm=v∙n
该积分表示宏观面投影到垂直于视线平面上的面积,在该式中使用了截断操作,是因为背面是不可见得所以不计入计算。 G 1 ( m , v ) D ( m ) G_1(m, v)D(m) G1(m,v)D(m)称为distribution of visible normals。 G 1 ( m , v ) G_1(m, v) G1(m,v)不是唯一的,因为 D ( m ) D(m) D(m)只描述了某个方向法线的比例,而不是确切的分布。
根据Heitz的研究只有Smitch function和Torrance-Sparrow “V-cavity” function符合上式的有效性,他的进一步证明Smitch function更加符合,并且具有normal-masking independence的性质,也就是说 G 1 ( m , v ) G_1(m,v) G1(m,v)的结果只要满足m不是背面,它的结果就不依赖于m。Smith function的表示为:
G 1 ( m , v ) = χ + ( m ∙ v ) 1 + Λ ( v ) G_1(m, v) = \frac{\chi^{+}(m\bullet v)}{1 + \Lambda(v)} \\ G1(m,v)=1+Λ(v)χ+(m∙v)
其中
χ + ( x ) = { 1 , w h e r e x > 0 0 , w h e r e x ≤ 0 \chi^{+}(x) = \begin{cases} 1, where x > 0\\ 0, where x \le 0 \end{cases} χ+(x)={1,wherex>00,wherex≤0
Λ ( v ) \Lambda(v) Λ(v)对于不同的NDF都有不同的表示。
Smitch function的缺点:从理论上说它的需求与实际表面结构是不一致的并且可能无法实现;从实践上说它需要完全随机的表面,当表面法线方向和遮蔽有关联时,特别是表面有一些重复的结构时,它的准确性会降低。
根据之前关于微观几何各种影响元素的描述,整体宏观表面的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 ( 公 式 1 ) f(l,v) = \int_{m\in \Omega}f_{\mu}(l,v,m)G_2(l,v,m)D(m)\frac{(m\bullet l)^+}{|n\bullet l|}\frac{(m\bullet v)^+}{|n\bullet v|}dm \ \ (公式1) f(l,v)=∫m∈Ωfμ(l,v,m)G2(l,v,m)D(m)∣n∙l∣(m∙l)+∣n∙v∣(m∙v)+dm (公式1)
公式中使用了joint masking-shadowing function G 2 ( l , v , m ) G_2(l,v,m) G2(l,v,m)替代了 G 1 ( m , v ) G_1(m,v) G1(m,v),它添加了l的可见性需求,也即是同时考虑了masking和shadowing的共同作用。
G 2 ( l , v , m ) G_2(l,v,m) G2(l,v,m)的最简单的表示方式:
G 2 ( l , v , m ) = G 1 ( v , m ) G 1 ( l , m ) G_2(l,v,m) = G_1(v,m)G_1(l,m) G2(l,v,m)=G1(v,m)G1(l,m)
这种计算方式认为masking和shadowing是无关的,但是实际中是相关的,使用这种计算会导致显示过暗。
G 2 ( l , v , m ) = λ ( ϕ ) G 1 ( v , m ) G 1 ( l , m ) + ( 1 − λ ( ϕ ) ) m i n ( G 1 ( v , m ) G 1 ( l , m ) ) G_2(l,v,m) = \lambda(\phi)G_1(v,m)G_1(l,m) + (1-\lambda(\phi))min(G_1(v,m)G_1(l,m)) G2(l,v,m)=λ(ϕ)G1(v,m)G1(l,m)+(1−λ(ϕ))min(G1(v,m)G1(l,m))
其中 λ ( ϕ ) \lambda(\phi) λ(ϕ)的值随着角度 ϕ \phi ϕ增加时从0增长到1。
两种 λ ( ϕ ) \lambda(\phi) λ(ϕ)的表达方式:
λ ( ϕ ) = 1 − e − 7.3 ϕ 2 λ ( ϕ ) = 4.41 ϕ 4.41 ϕ + 1 \lambda(\phi) = 1 - e^{-7.3\phi^2} \\ \lambda(\phi) = \frac{4.41\phi}{4.41\phi + 1} λ(ϕ)=1−e−7.3ϕ2λ(ϕ)=4.41ϕ+14.41ϕ
公式1不能直接用于渲染,It is used to derive a closed-form solution (exact or approximate) given a specific choice of micro-BRDF f μ f_{\mu} fμ
如果关联masking和shadowing的效果可以使用Smith height-correlated masking-shadowing function:
G 2 ( l , v , m ) = χ + ( m ∙ v ) χ + ( m ∙ l ) 1 + Λ ( v ) + Λ ( l ) G_2(l,v,m)=\frac{\chi^{+}(m\bullet v)\chi^{+}(m\bullet l)}{1+\Lambda(v)+\Lambda(l)} G2(l,v,m)=1+Λ(v)+Λ(l)χ+(m∙v)χ+(m∙l)
BRDF Models for Surface Reflection
half vector:
h = l + v ∣ ∣ l + v ∣ ∣ h = \frac{l + v}{||l + v||} h=∣∣l+v∣∣l+v
根据公式1来建立镜面微面反射模型时,考虑到当 m ≠ h m\neq h m=h时, f μ ( l , v , m ) f_{\mu}(l,v,m) fμ(l,v,m)等于0,所以可以将求积分简化为求 m = h m=h m=h时的值:
f s p e c ( l , v ) = F ( h , l ) G 2 ( l , v , h ) D ( h ) 4 ∣ n ∙ l ∣ ∣ n ∙ v ∣ f_{spec}(l,v) = \frac{F(h,l)G_2(l,v,h)D(h)}{4|n\bullet l||n\bullet v|} fspec(l,v)=4∣n∙l∣∣n∙v∣F(h,l)G2(l,v,h)D(h)
使用half vector的一个好处是,对于 G 2 G_2 G2函数来说,它的夹角不会大于90因此可以移除公式中的 χ + \chi^{+} χ+。
Normal Distribution Functions
specular lobe的形状不仅仅是由NDF的形状决定的,它还受表面曲率和观察角度的影响。
Isotropic Normal Distribution Functions
如果NDF对于宏观表面法线旋转对称,那么它就是isotropic,在这种情况下NDF的唯一变量就是 n n n和 m m m之间的夹角 θ m \theta_{m} θm。
Beckmann Distribution:
D ( m ) = χ + ( n ∙ m ) π α b 2 ( n ∙ m ) 4 e x p ( ( n ∙ m ) 2 − 1 α b 2 ( n ∙ m ) 2 ) D(m) = \frac{\chi^{+}(n\bullet m)}{\pi \alpha_b^2(n\bullet m)^4}exp(\frac{(n\bullet m)^2 - 1}{\alpha_b^2(n\bullet m)^2}) D(m)=παb2(n∙m)4χ+(n∙m)exp(αb2(n∙m)2(n∙m)2−1)
其中 α b \alpha_b αb用来控制表面的粗糙程度,它和微观几何表面均方根(root mean square, RMS)斜率成比例,所以当 α b = 0 \alpha_b=0 αb=0时表面为完全平滑表面。
如果要求Beckmann NDF的Smith G 2 G_2 G2函数,需要对应的 Λ \Lambda Λ函数。由于Beckmann NDF是shape-invariant的,所以可以简化求 Λ \Lambda Λ的过程。根据Heitz的研究,当一个isotropic的NDF满足如果它的粗糙度参数的效果等同于缩放微面时,那么它是shape-invariant的,一个shape-invariant的NDF可以表示为:
D ( m ) = χ + ( n ∙ m ) α 2 ( n ∙ m ) 4 g ( 1 − ( n ∙ m ) 2 α ( n ∙ m ) ) ( 公 式 2 ) D(m)=\frac{\chi^{+}(n\bullet m)}{\alpha^2(n\bullet m)^4}g(\frac{\sqrt{1-(n\bullet m)^2}}{\alpha(n\bullet m)}) \ \ \ (公式2) D(m)=α2(n∙m)4χ+(n∙m)g(α(n∙m)1−(n∙m)2) (公式2)
其中g为任意单变量函数。对于任意isotropic NDF来说,它只依赖于两个变量,一个是粗糙度 α \alpha α,另一个是 Λ \Lambda Λ计算基于的向量(v或l)的入射角度,但是对于shape-invariant的NDF,它的 Λ \Lambda Λ只依赖于变量 a a a:
a = n ∙ s α 1 − ( n ∙ s ) 2 a = \frac{n\bullet s}{\alpha\sqrt{1-(n\bullet s)^2}} a=α1−(n∙s)2n∙s
其中s表示基于计算的v或l。
Beckmann NDF的 Λ \Lambda Λ函数为:
Λ ( a ) = e r f ( a ) − 1 2 + 1 2 a π e x p ( − a 2 ) \Lambda(a)=\frac{erf(a)-1}{2}+\frac{1}{2a\sqrt{\pi}}exp(-a^2) Λ(a)=2erf(a)−1+2aπ1exp(−a2)
其中erf是错误函数。但是由于它的计算很复杂,所以实际使用中可以使用近似值:
Λ ( a ) ≈ { 1 − 1.259 a + 0.396 a 2 3.535 a + 2.181 a 2 , w h e r e a < 1.6 0 , w h e r e a ≥ 1.6 \Lambda(a) \approx \begin{cases} \frac{1-1.259a+0.396a^2}{3.535a+2.181a^2}, where a < 1.6 \\ 0, where a \ge 1.6 \end{cases} Λ(a)≈{3.535a+2.181a21−1.259a+0.396a2,wherea<1.60,wherea≥1.6
Blinn-Phong Distribution:
Blinn-Phong NDF现在逐渐被其他分部所取代,现一般用于计算资源较差的硬件平台上。
D ( m ) = χ + ( n ∙ m ) α p + 2 2 π ( n ∙ m ) α p D(m) = \chi^{+}(n\bullet m)\frac{\alpha_p+2}{2\pi}(n\bullet m)^{\alpha_p} D(m)=χ+(n∙m)2παp+2(n∙m)αp
其中 α p \alpha_p αp为粗糙度参数,值越大表明平面越平滑,由于 α p \alpha_p αp对于实际效果的影响随着数值增大而减小,因此不好计算,因此在实际使用中通常通过改变一个非线性映射中的人工操作参数来获取,例如使用 α p = m s \alpha_p=m^s αp=ms其中 s s s是位于0到1的一个参数, m m m是根据具体应用确定的 α p \alpha_p αp的上限。
α b \alpha_b αb和 α p \alpha_p αp之间的关系:
α p = 2 α b − 2 − 2 \alpha_p=2\alpha_b^{-2}-2 αp=2αb−2−2
Blinn-Phong NDF不是shape-invariant的,所以可以通过该关系使用Beckmann Λ \Lambda Λ进行求解。
GGX Distribution
D ( m ) = χ + ( n ∙ m ) α g 2 π ( 1 + ( n ∙ m ) 2 ( α g 2 − 1 ) ) 2 D(m)=\frac{\chi^{+}(n\bullet m)\alpha_g^2}{\pi(1+(n\bullet m)^2(\alpha_g^2-1))^2} D(m)=π(1+(n∙m)2(αg2−1))2χ+(n∙m)αg2
α g \alpha_g αg对于粗糙度的影响与 α b \alpha_b αb相似。
GGX是shape-invariant,它的 Λ \Lambda Λ函数为:
Λ ( a ) = − 1 + 1 + 1 a 2 2 \Lambda(a) = \frac{-1+\sqrt{1+\frac{1}{a^2}}}{2} Λ(a)=2−1+1+a21
结合GGX和Smith masking-shadowing函数:
G 2 ( l , v ) 4 ∣ n ∙ l ∣ ∣ n ∙ v ∣ ⇒ 0.5 μ o α 2 + μ i ( μ i − α 2 μ i ) + μ i α 2 + μ o ( μ o − α 2 μ o ) \frac{G_2(l,v)}{4|n\bullet l||n\bullet v|} \Rightarrow \frac{0.5}{\mu_o\sqrt{\alpha^2+\mu_i(\mu_i-\alpha^2\mu_i)}+\mu_i\sqrt{\alpha^2+\mu_o(\mu_o-\alpha^2\mu_o)}} 4∣n∙l∣∣n∙v∣G2(l,v)⇒μoα2+μi(μi−α2μi)+μiα2+μo(μo−α2μo)0.5
其中 μ i = ( n ∙ l ) + , μ o = ( n ∙ v ) + \mu_i=(n\bullet l)^{+},\mu_o=(n\bullet v)^{+} μi=(n∙l)+,μo=(n∙v)+
三种分布方式的对比:
GGX对于很多材质的模拟效果比Beckmann和Blinn-Phong更精确。
Generalized Trowbridge-Reitz(GTR) NDF:
D ( m ) = k ( α , γ ) π ( 1 + ( n ∙ m ) 2 ( α g 2 − 1 ) ) γ D(m) = \frac{k(\alpha,\gamma)}{\pi(1+(n\bullet m)^2(\alpha_g^2-1))^\gamma} D(m)=π(1+(n∙m)2(αg2−1))γk(α,γ)
这种分布方式增加了对于NDF形状的控制方式,其中 γ \gamma γ控制了尾部的形状, k ( α , γ ) k(\alpha,\gamma) k(α,γ)是标准化系数,它是一个分段函数:
k ( α , γ ) = { ( γ − 1 ) ( α 2 − 1 ) ( 1 − ( α 2 ) 1 − γ ) , w h e r e γ ≠ 1 a n d α ≠ 1 ( α 2 − 1 ) l n ( α 2 ) , w h e r e γ = 1 a n d α ≠ 1 1 , w h e r e α = 1 k(\alpha,\gamma)=\begin{cases} \frac{(\gamma-1)(\alpha^2-1)}{(1-(\alpha^2)^{1-\gamma})},\ where\ \gamma \neq 1\ and\ \alpha \neq 1 \\ \frac{(\alpha^2-1)}{ln(\alpha^2)},\ where\ \gamma = 1\ and\ \alpha \neq 1 \\ 1,\ where\ \alpha = 1 \\ \end{cases} k(α,γ)=⎩⎪⎪⎨⎪⎪⎧(1−(α2)1−γ)(γ−1)(α2−1), where γ=1 and α=1ln(α2)(α2−1), where γ=1 and α=11, where α=1
GTR不是shape-invariant。
其他NDF:
Student’s t-distribution(STD)和exponential power distribution(EPD)都是shape-invariant
Anisotropic Normal Distribution Functions
与各向同性NDF不同的是,各向异性NDF不能够仅依赖于 θ m \theta_m θm,它需要额外的方向信息,通常情况下需要将m转换到切线空间中,可以使用切线贴图来保存切线。
根据公式2,可以得到shape-invariantNDF的各向异性版本:
D ( m ) = χ + ( n ∙ m ) α x α y ( n ∙ m ) 4 g ( ( t ∙ m ) 2 α x 2 + ( b ∙ m ) 2 α y 2 ( n ∙ m ) ) D(m)=\frac{\chi^{+}(n\bullet m)}{\alpha_x\alpha_y(n\bullet m)^4}g(\frac{\sqrt{\frac{(t\bullet m)^2}{\alpha_x^2}+\frac{(b\bullet m)^2}{\alpha_y^2}}}{(n\bullet 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 t t和 b b b方向上的粗糙度。
各项异性NDF的 G 2 G_2 G2函数与各向同性的相同, Λ \Lambda Λ函数的参数a的计算:
a = n ∙ s α x 2 ( t ∙ s ) 2 + α y 2 ( b ∙ s ) 2 a = \frac{n\bullet s}{\sqrt{\alpha_x^2(t\bullet s)^2 + \alpha_y^2(b\bullet s)^2}} a=αx2(t∙s)2+αy2(b∙s)2n∙s
Beckmann NDF的各向异性版本:
D ( m ) = χ + ( n ∙ m ) π α x α y ( n ∙ m ) 4 e x p ( − ( t ∙ m ) 2 α x 2 + ( b ∙ m ) 2 α y 2 ( n ∙ m ) 2 ) D(m)=\frac{\chi^{+}(n\bullet m)}{\pi\alpha_x\alpha_y(n\bullet m)^4}exp(-\frac{\frac{(t\bullet m)^2}{\alpha_x^2}+\frac{(b\bullet m)^2}{\alpha_y^2}}{(n\bullet 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(m)=\frac{\chi^{+}(n\bullet m)}{\pi\alpha_x\alpha_y(\frac{(t\bullet m)^2}{\alpha_x^2}+\frac{(b\bullet m)^2}{\alpha_y^2}+(n\bullet m)^2)^2} D(m)=παxαy(αx2(t∙m)2+αy2(b∙m)2+(n∙m)2)2χ+(n∙m)
Multiple-Bounce Surface Reflection
BRDF Models for Subsurface Scattering
Subsurface Albedo
Scale of Subsurface Scattering and Roughness
一些BRDF模型考虑了表面的粗糙度有些没有,确定使用何种模型的因素不能简单的只考虑表面的粗糙度,正确的确定因素是表面不规则和次表面散射距离之间的相对大小比例。
如果表面不规则大于次表面散射距离时,需要考虑表面的粗糙度。当次表面散射距离大于表面不规则时,可以将表面当成平滑的,不考虑表面的粗糙度。当处于中间情况时,也就是有的表面不规则度有的比次表面散射距离大有的比它小时,需要考虑粗糙度,但是需要结合只包含大于部分表面的effective surface。并且漫反射和镜面反射需要使用不同的粗糙程度参数。同时观察距离也需要考虑。
Smooth-Surface Subsurface Models
根据BRDF一节中描述,实时渲染中通常使用Lambertian来描述局部次表面散射:
f d i f f ( l , v ) = ρ s s π f_{diff}(l,v)=\frac{\rho_{ss}}{\pi} fdiff(l,v)=πρss
Lambertian模型无法说明表面反射的光不可用于次表面散射的事实,改进公式:
f d i f f ( l , v ) = ( 1 − F ( h , l ) ) ρ s s π f_{diff}(l,v)=(1-F(h,l))\frac{\rho_{ss}}{\pi} fdiff(l,v)=(1−F(h,l))πρss
其中Fresnel部分会随着入射角度的变化而变化,对于该公式的微面BRDF形式只需将 n n n换成 h h h。
Rough-Surface Subsurface Models
Burley提出的BRDF,考虑了表面粗糙影响并且符合测量的材质:
f d i f f = χ + ( n ∙ l ) χ + ( n ∙ v ) ρ s s π ( ( 1 − k s s ) f d + 1.25 k s s f s s ) f_{diff}=\chi^{+}(n\bullet l)\chi^{+}(n\bullet v)\frac{\rho_{ss}}{\pi}((1-k_{ss})f_d+1.25k_{ss}f_{ss}) fdiff=χ+(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 90 = 0.5 + 2 α ( h ∙ l ) 2 f s s = ( 1 ( n ∙ l ) ( n ∙ v ) − 0.5 ) F S S + 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 S S 90 = α ( h ∙ l ) 2 k s s 是 人 为 控 制 变 量 f_d=(1+(F_{D90}-1)(1-n\bullet l)^5)(1+(F_{D90-1})(1-n\bullet v)^5) \\ F_{D90}=0.5+2\sqrt{\alpha}(h\bullet l)^2 \\ f_{ss}=(\frac{1}{(n\bullet l)(n\bullet v)-0.5})F_{SS}+0.5 \\ F_{SS}=(1+(F_{SS90}-1)(1-n\bullet l)^5)(1+(F_{SS90}-1)(1-n\bullet v)^5) \\ F_{SS90}=\sqrt{\alpha}(h\bullet l)^2 \\ k_{ss}是人为控制变量 fd=(1+(FD90−1)(1−n∙l)5)(1+(FD90−1)(1−n∙v)5)FD90=0.5+2α(h∙l)2fss=((n∙l)(n∙v)−0.51)FSS+0.5FSS=(1+(FSS90−1)(1−n∙l)5)(1+(FSS90−1)(1−n∙v)5)FSS90=α(h∙l)2kss是人为控制变量
该等式被称为Disney diffuse model。
BRDF Models for Cloth
Empirical Cloth Models
Microfacet Cloth Models
Micro-Cylinder Cloth Models
Wave Optics BRDF Models
Layered Material
Blending and Filtering Materials
材质的混合可能是空间位置相关的,虽然法线不是一个BRDF参数,但是在混合材质时,是需要考虑的。
混合材质时,严格的做法应该是计算每个材质的着色结果,然后混合,但是为了提高效率,可以先混合BRDF参数再进行着色,对于线性属性或者近似线性的属性来说是没有问题的,对于某些非线性的属性结果也是可以接受的,但是混合法线是需要特殊注意的。
材质滤波对于材质混合也是也是有关联的,因为材质参数通常都保存到纹理当中,GPU常规的双线性滤波和mipmap都是基于属性是线性的基础进行操作的,对于非线性属性可能导致结果出现走样。
Filtering Normals and Normal Distributions
材质滤波中出现的走样和解决它们的方法大多都与法线的处理有关。为了理解走样产生的原因以及如何解决需要首先明白NDF是一个亚像素表面结构的统计描述。当观察点和表面的距离增加时,表面结构从覆盖几个像素减少到亚像素级别,从凹凸贴图转换到NDF中,这个过程与mipmap链紧密相关,它将纹理细节的减少压缩到亚像素大小。
Toksvig,LEAN,CLEAN通过保存非归一化的法线,来表示各个法线的分布情况,也可以使用方差贴图来进行滤波操作。