更常用的BRDF--------Phong光照方程

 Phong光照方程:


相对于物理的BRDF使用较多的反射计算方程为Phone光照方程如下,

 其中v是从表面点p到视点的向量,r是光线l对法线n的反射光线,mshi是参数因子用于不同材质的不同反射强度。如下图:


更常用的BRDF--------Phong光照方程_第1张图片由公式可知向量r和向量v越接近反射亮越大,图中也可以很好理解两个向量越接近反射到眼睛的光线越多。

关于反射向量r的计算方式根据数学知识可简单求出 r = 2(n·l)n - l 计算方式如下:


更常用的BRDF--------Phong光照方程_第2张图片



将反射向量传入光照方程可以得出反射光强度为ispec = ((2(n·l)n - l )·v)mshi该方程可以直接用于图形学计算反射光。


还有phong光照方程还有另一种常见形式:


其中h= (l+v)/(||l+v||) 也就相当于光照方向与视线方向的中心向量 如下图:


更常用的BRDF--------Phong光照方程_第3张图片

当向量n和向量h夹角大于90°时n·h < 0此时没有反射光线因此公式就变为 ispec = max(n · h,0)mshi;

在已光线颜色衰减因子(根据材质不同而不同)最终得出公式为 ispec = ms * Sspec * max(n · h,0)mshi;

其中ms为衰减因子 Sspec为光线颜色。 而此公式被DX OPENGL AWAY3D等在计算反射光线是广为使用。


在利用Phong光照方程计算反射时,会将整个模型全部计算反射,如果某一材质只有部分位置需要计算反射,其他部位没有反射(如一件布料衣服上镶嵌了几块金属挡板,只需要金属部位有高光反射布料无反射)又该如何绘制呢?这就需要用到高光贴图SpecularMap。  


高光贴图SpecularMap的主要左右是表示材质的高光反射强度。计算高光时从SpecularMap中读取颜色数据作为影响反射的参数,进而由高光贴图决定反射系数。 Away3D 中对高光贴图的使用是将其像素(r g b或者x y z)的g /y数据作为计算反射方程中的指数因子mshi,  r/x作为明暗因子与最终结果ispec相乘。代码如下:


tex ft4, v0, fs0 <2d,linear,clamp> // 对SpecularMap采样
dp3 ft5.w, ft0, ft5 // n·h
sat ft5.w, ft5.w // 将n·h限定在0~1
mul ft4.w, ft4.y, fc1.w // 将SpecularMap采样数据与常量FC1相乘得出最终指数因子
pow ft5.w, ft5.w, ft4.w // max(n · h,0)的mshi次方

mul ft5.xyz, ft5, ft4.x // 将计算结果与采样数据中的x分量相乘最为最终反射结果

你可能感兴趣的:(Away3D,DirectX学习,图形学理论)