unity3D里使用的PBR公式
PBR即为基于物理的光照、材质和摄像机。这里只讨论材质以及unity里如何实现基于PBR的BRDF。
这里提一下BRDF,意指反射函数。由于人眼看到物体都是通过反射光,所以BRDF就实际上表现了一个物体的材质。
一个BRDF的基本组成部分为漫反射(diffuse),大部分还要加上环境光(ambient)+ 高光反射(specular),还有可能会有自发光(emissve)、此表面散射等等。
BRDF可大概的分为基于经验模型和基于真实物理(还有测量模型之类的不讨论)。
经验模式主要为
lambert漫反射
C d i f f u s e = ( c l i g h t ⋅ m d i f f u s e ) max ( 0 , n ^ ⋅ l ^ ) , C_{diffuse} = (c_{light} \cdot m_{diffuse})\max(0,\hat{n} \cdot \hat{l}), Cdiffuse=(clight⋅mdiffuse)max(0,n^⋅l^),
其中c为光源颜色,m为漫反射颜色,n为表面法线,l是指向光源的单位矢量。
高光反射
主要分为 Phone 和 Blinn-Phone ,后者使用半角向量避免计算反射向量,要比前者省大概1/3的性能。
Phone高光模型为
C s p e c u l a r = ( c l i g h t ⋅ m s p e c u l a r ) max ( 0 , v ^ ⋅ r ^ ) m g l o s s , C_{specular} = (c_{light} \cdot m_{specular})\max(0,\hat{v} \cdot \hat{r})^{m_{gloss}}, Cspecular=(clight⋅mspecular)max(0,v^⋅r^)mgloss,
其中v为视线方向的单位矢量,r为反射反射矢量。r可由如下公式计算得到:
r ^ = 2 ( n ^ ⋅ l ^ ) n ^ − l ^ , \hat r= 2(\hat n \cdot \hat l)\hat n - \hat l, r^=2(n^⋅l^)n^−l^,
与上面的 Phone 模型相比,Blinn 提出了一个更节省计算性能的公式,引入一个新的向量h,避免计算反射向量 r。Blinn-Phone 高光模型如下所示:
C s p e c u l a r = ( c l i g h t ⋅ m s p e c u l a r ) max ( 0 , n ^ ⋅ h ^ ) m g l o s s , C_{specular} = (c_{light} \cdot m_{specular})\max(0,\hat{n} \cdot \hat{h})^{m_{gloss}}, Cspecular=(clight⋅mspecular)max(0,n^⋅h^)mgloss,
其中h为半角向量,可由如下公式计算:
h ^ = v ^ + l ^ ∣ v ^