【图形学】16 光照模型(一、理论与公式)

来源:《UNITY SHADER入门精要》

1、BRDF光照模型

  BRDF模型(Bidirectional Relfectance Distribution Function,双向反射分布函数),在图形学中,BRDF大多用一个参数方程来表示,并提供一些可以调整材质属性的参数。当给定入射光线的方向和辐照度后,BRDF可以给出在某个出射方向上光照能量分布。

2、自发光和环境光

  自发光和环境光都很好计算。环境光(ambient),自发光(emissive):
c a m b i e n t = g a m b i e n t c e m i s s i v e = m e m i s s i v e c_{ambient}=g_{ambient} \\ c_{emissive}=m_{emissive} cambient=gambientcemissive=memissive

3、漫反射

①兰伯特光照模型

  漫反射中,视角的位置不重要,因为反射是完全随机的,我们认为在任何反射方向上的分部都是一样的。视角的位置不重要,只有入射光线的角度很重要。
  漫反射光照符合 兰伯特定律(Lambet’s law):
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    ⋅    I ) \boldsymbol{c}_{diffuse}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{diffuse} \right) \max \left( 0, n\,\,\cdot \,\,I \right) cdiffuse=(clightmdiffuse)max(0,nI)
  其中,n 是表面法线,I 是只想广元的单位矢量,$\boldsymbol{m}{diffuse} , , \boldsymbol{c}{light}$ 是光源颜色。需要注意的是,我们需要防止法线和光源方向点乘的结果为负值,为此,我们使用取最大值的函数来将其截取到0,这可以防止物体被从后面来的光源照亮。

②半兰伯特光照模型

  相比之前的公式,多了 α \alpha α β \beta β 两个参数,绝大多数情况下,这两个参数值都是 0.5。所以被称为半兰伯特光照模型。
c d i f f u s e = ( c l i g h t ⋅ m d i f f u s e ) ( α ( 0 , n ^    ⋅    I ) + β ) \boldsymbol{c}_{diffuse}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{diffuse} \right) \left( \alpha \left( 0,\hat{n}\,\,\cdot \,\,\boldsymbol{I} \right) +\beta \right) cdiffuse=(clightmdiffuse)(α(0,n^I)+β)

4、镜面反射

①冯氏模型的镜面反射计算

  计算镜面反射我们需要知道的信息就比较多了,比如:表面法线 n ^ \hat{n} n^ 、视角方向 v ^ \hat{v} v^ 、光源方向 I \boldsymbol{I} I 、反射方向 r \boldsymbol{r} r
  只要眼睛(摄像机)在反射光线周围都可以看得到高光,越靠近 r ^ \hat{r} r^ 反射光照强度越大。我们可以得出一条结论:高光反射和观察角度有关。phong模型中认为,高光反射的强度与反射光线 r ^ \hat{r} r^ 和观察角度 v ^ \hat{v} v^ 之间夹角的余弦值成正比。
  我们知道其中三个矢量,我们需要计算的是第四个矢量——反射方向。
r = 2 ( n ^ ⋅ I ) n ^ − I \boldsymbol{r}=2\left( \hat{n}\cdot \boldsymbol{I} \right) \hat{n}-\boldsymbol{I} r=2(n^I)n^I
  然后,我们利用 冯氏光照模型 来计算镜面反射:
c s p 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 \boldsymbol{c}_{spcular}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{specular} \right) \max \left( 0, \hat{v}\,\,\cdot \,\,\boldsymbol{r} \right) ^{m_{gloss}} cspcular=(clightmspecular)max(0,v^r)mgloss
  其中 m g l o s s m_{gloss} mgloss 是材质的光泽度(gloss),也可称为反光度(shininess),它用于控制高光区域的“亮点”。 m g l o s s m_{gloss} mgloss 越大,亮点越小。
   m s p e c u l a r \boldsymbol{m}_{specular} mspecular 是材质的高光反射颜色,用于控制材质对高光反射的强度和颜色。
   c l i g h t \boldsymbol{c}_{light} clight 是光源的颜色和强度。
  同样,我们这里用 max() 来防止 v ^    ⋅    r \hat{v}\,\,\cdot \,\,\boldsymbol{r} v^r 为负。

②Blinn-Phong光照算法

  相比Phong模型,此算法引入了一个新的矢量 h ^ \boldsymbol{\hat{h}} h^,称之为半程向量(bisecoter)。它是对 v ^ \hat{v} v^ I ^ \hat{I} I^取平均,然后再归一化得到:
h ^ = v ^ + I ∣ v ^ + I ∣ \mathbf{\hat{h}}=\frac{\mathbf{\hat{v}}+\boldsymbol{I}}{|\mathbf{\hat{v}}+\boldsymbol{I}|} h^=v^+Iv^+I
  我们不再计算 v ^ \hat{v} v^ r ^ \hat{r} r^ 之间的夹角,转而计算 n ^ \hat{n} n^ h ^ \hat{h} h^ 之间的夹角:
c s p 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 \boldsymbol{c}_{spcular}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{specular} \right) \max \left( 0,\hat{n}\,\,\cdot \,\,\hat{h} \right) ^{m_{gloss}} cspcular=(clightmspecular)max(0,n^h^)mgloss
  在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型,这是因为,此时可以认为 v ^ \hat{v} v^ I I I 都是定值,因此 h ^ \hat{h} h^ 是一个常量。但是, v ^ \hat{v} v^ 当或者 I I I 不是定值时,Phong模型可能反而更快一些。

5、光线的计算方式

  我们有两种计算方式,交给 顶点着色器 或者 片元着色器。顶点着色器中计算的过程叫做逐顶点光照(per-vertex lighting);片元着色器中计算的过程称之为逐像素光照(per-pixel lighting)
  逐顶点光照,也被称之为高洛德着色(Gouraud shading)。我们计算每个顶点上的光照,然后再渲染图元的内部进行现行差值,最后输出成像素颜色。计算量会小于逐像素点光照。但是,因为是线性插值计算,所以图元的内部颜色总是暗于顶点处的最高颜色值,有可能产生明显的棱角分明的现象。
  逐像素光照,我们以每个像素为基础,得到它的法线(可以对顶点法线插值得到,也可以从法线纹理中采样得到),然后通过每个像素的法线值来计算光照。

6、Blinn-Phong模型

  我们现在所采用的光照模型被称为Phong光照模型,因为是裴祥风(Bui Tuong Phong)首次使用 漫反射 和 镜面反射 来对光照进行建模。后面,由于Blinn的方法简化了计算,我们将这种模型称为Blinn-Phong光照模型
  当然,这种模型也有很多局限性。 比如,**菲涅尔反射(Fresnel reflection)无法展现出来。其次,Blinn-Phong模型是各项同性(isotropic)的,也就是说,当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。但有些表面是具有各向异性(anisotropic)**反射性质的,例如拉丝金属、毛发等。

猜你喜欢

转载自blog.csdn.net/qq_40891541/article/details/126157678