`
bcyy
  • 浏览: 1809796 次
文章分类
社区版块
存档分类
最新评论

图形学思考 - 高亮反射光 Specular Light

 
阅读更多

高亮反射光 Specular Light

就是平时我们看到的一个光滑球面会发射的耀眼光。

那么为什么很多球面会有这种效果呢?这个是不是球面的特性,还是某些表面的特性, 如镜面?

从图形学的角度解答:不是球面的特性,也不是镜面的特性。

为什么呢?

因为根据公式:C = pow(max(v*r, 0), p)*L*M;

这个公式好像跟漫射光是一样的,不过模式一样,其实含义却不一样。

这里的v是平面点P到眼睛所在点E的单位向量 v = (P-E)/||P-E||

而r代表反射光线的传播方向,如下图:


其实vr = cosø;就是v和r的夹角的大小,夹角越小,自然接受到更强的光线,而超出一定角度,就看不到高亮光了。

而这里图中的n就是严格垂直于平面的单位法线向量,注意:并不是漫射光中所说的微观的法向量,两者具有严格不同的意义。

区分这点很重要,这是理解漫射光和高亮反射光的主要不同点。

这个时候我们知道眼睛改变的时候v会改变,而垂直法向量是不变的,所以高亮反射光的强度就和我们的眼睛位置相关了。

其中公式还有个高亮因子p。这也是这个公式最巧妙的地方,这样可以让高亮光慢慢fade out淡出。这也是数学巧妙的地方,一般人还真的无法创造出如此巧妙的方法。

下图是光强度(intensity)的分布图,可以看到是平滑的向两边淡出的。

结论:

1 球面容易看到高亮光,是因为球面的法线向外扩散,让看到高亮光的区域更大,那么就更加容易看到高亮光了。

2 镜面表面很平滑,那么高亮光就会很集中,虽然看到的区域小,但是因为高亮的强度很大,那么就可以很清晰的看到高亮光了。

3 其实高亮光可以发生在任何物体和任何表面上。

那么我们怎么设计粗糙的表面高亮光效果很弱或者甚至看不到高亮光呢?这个时候可以控制公式中的L和M,如果设置这两个数值都很小或者直接设置为零,那么高亮效果就很弱甚至看不到了。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics