问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)

 和diffuse reflection对应的是specular reflection。一直以来,本人都将“specular reflection”理解为“镜面反射”。但是,现在来写总结时,发现牵涉到一个叫做“perfect specular reflection”的东东,这下有点乱了。两个都是“镜面反射”么?还是一个“理想镜面反射”,一个“镜面反射”?为了避免混淆,特此声明:

“perfect specular reflection”:等价于“mirror-likereflection”,译为“镜面反射”;

“specular reflection”:现在译为“高光反射”。

 

“镜面反射”发生在非常非常非常平的像镜子一样的物体表面。但是,现实中的物体表面都不是如此理想,表面都是粗糙的。比如这样一个球:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第1张图片

如果撤掉这个球的漫反射光,剩余的光呈现的是这样一张图:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第2张图片

这一团亮光是什么鬼?这个就是“高光反射”,对应的光被称为“高光”。

 

尽管现实的表面是粗糙的,但是粗糙的表面可以认为是由无数细微的mirror-like的微表面。所以,我们要先看看镜面反射(mirror-like reflection or perfect specular reflection)。


68.1.2.2.1 镜面反射(perfect specular reflection)

 

以前在“问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal)”(http://blog.csdn.net/libing_zeng/article/details/54428494)中有求反射光线的方向向量F。重复贴图如下:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第3张图片

计算过程中用到的是入射光线和法线的方向向量的单位向量,这样求出的反射光线的方向向量也是单位向量。

 

对于“镜面反射”,就了解这么多吧。(入射角=反射角,知道怎么求得反射光线的方向向量)。

 

68.1.2.2.2 高光反射(specular reflection)


先前挖了这么一个坑:下图的高光反射光线为什么是三条,而不是一条?

当时的简单回答是:因为表面的上表面不是理想光学镜面(不是特别特别特别平)。

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第4张图片

表面是粗糙的,夸张一点的示意图应该是这样的:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第5张图片

表面再粗糙点。表面越粗糙,高光则越是发散:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第6张图片

相比与“漫反射光”,这种反射光线(高光)强度要大很多,但是方向不像漫反射光线那么分散,而是聚集在某个方向周围。这样就可以解释之前那一团亮光了。(重复贴图如下)

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第7张图片

很亮;但是为什只有这么一小团,而不是整个球面呢?原因就是“高光的方向聚集在某个方向周围”。之所以球面的其他位置上没有呈现高光,是因为这个位置的高光是聚集在其对应的某个方向周围,而这个方向范围的光没能进入相机(眼睛)。如果改变相机的位置,图片中高光的位置也会随之改变。

 

68.1.2.2.2.1 Phong反射模型


在包含高光的反射模型提出之前,生成的图形只有漫反射光。图形基本是这样的:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第8张图片

 

时间到了1975年,Bui Tuong Phong在他的论文[3]中提出了一个包含高光的反射的经验模型,这个模型后来被称为Phong反射模型(Phong Reflection Model)。Phong反射模型中高光部分是这个样子:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第9张图片

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第10张图片


问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第11张图片

对应的高光部分大概是这个样子:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第12张图片

 

68.1.2.2.2.2 Blinn-Phong反射模型



问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第13张图片

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第14张图片

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第15张图片  问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第16张图片

 

对应的高光部分大概是这个样子:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第17张图片  问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第18张图片

 

Blinn-Phong相比Phong,在观察方向趋向平行于表面时,高光形状会拉长,更接近真实情况。

 

我们编程使用的是Phong反射模型和Blinn-Phong反射模型。后面“68.1.2.2.2.3 基于物理的反射模型——Cook-Torrance反射模型”章节算是理论延伸,没有编程实践。

 

68.1.2.2.2.3 基于物理的反射模型——Cook-Torrance反射模型


Blinn-Phong模型运算简单,适合早期硬件实现,在显卡只支持固定管线(Fixed Pipeline)的年代,Blinn-Phong模型是设计在显卡硬件中的,OpenGL/Direct3D固定管线的光照模型就是Blinn-Phong模型。但是Blinn-Phong模型毕竟只是一个经验模型,表现力有限,看起来有较重的塑料感。要想模拟各种不同材质的质感,得从光照的物理模型入手。

 

早在1967年,K. E. Torrance 和E. M. Sparrow在他们的论文[2]中提出了物理领域中粗糙表面的高光反射模型。到了1982年,Robert L. Cook 和K. E. Torrance在他们的论文[5]中将Torrance-Sparrow的高光反射模型引入计算机图形领域。计算机图形领域的该模型被称为“Cook-Torrance反射模型”。现在无论是CG电影,还是3D游戏,基于物理着色都是使用的这个模型。(该模型的详细推导,参考原论文[5]。)

反射示意图和Blinn-Phong模型是的是一样的。重复贴图如下:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第19张图片

原论文中的示意图是这个样子,也贴出来:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第20张图片

 

Cook-Torrance反射模型中高光部分如下:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第21张图片

上式中三个主要参数G、D、F。这三个参数的求解/建模一般都是很复杂的。当然,前人已经这三个参数提出各种求解模型。

 

D:微法向量分布函数

 

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第22张图片

粗糙表面是由很多微镜面(micro mirror)组成,每个微镜面都有自己的法向量H。当入射光L照射在微镜面上时,反射光V能进入相机的条件是:H刚好是L和V的中间向量。也就是说,只有法向量刚好是L、V的中间向量的微镜面才可能是此次反射的“法向量有效的微镜面”。

上图中,整个表面如蓝色折线,但是“法向量有效的微镜面”(能够使得反射光进入相机)只有图中的红色线段表示的微镜面。也就是说“法向量有效的微镜面”(红色线段)只占所有微镜面(蓝色折线)的一部分。这个部分到底是多少比例呢???为了求这个比例/概率,有人就对各种粗糙表面进行了测试,然后建立分布模型(不要问我是怎么做的,我不知道,我也不管)。市面上比较流行的有这样两个分布模型:Gaussian分布模型Beckmann分布模型

 

Gaussian分布模型:


 

Beckmann分布模型:


 

这两个分布模型中的参数a是入射光线L和微镜面法向量H的夹角。(在前面的示意图中有标记),m是用户自行设置的参数。

 

我们不用管这些分布模型是怎么建立的,只要知道:求得D是“法向量有效的微镜面”在所有微镜面中所占的比例;D相当于一个概率值。



G:几何衰减因子

 

前面D求出了“法向量有效的微镜面”在所有微镜面中所占的比例。但是,这些“法向量有效的微镜面”并不能保证对应的反射光是沿着观测方向的,但是并不能保证反射光进入相机。也就是说,方向对了,但是还是不能到达目的地。为什么呢?中途遇到问题了。可能出现下图示意的两类问题:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第23张图片

问题a:“法向量有效的微镜面”的入射光被其他微镜面挡住了。这种入射光被遮蔽的情况称为“shadowing”

 

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第24张图片

问题b:“法向量有效的微镜面”的反射光被其他微镜面挡住了。这种反射光被遮蔽的情况称为“masking”

 

不管是入射光被遮蔽了,还是反射光被遮蔽了。这两类遮蔽情况对应的“法向量有效的微镜面”被称为“被遮蔽的法向量有效的微镜面”

 

所以,“真正有效的微镜面”=“法向量有效的微镜面”-“被遮蔽的法向量有效的微镜面”。

“真正有效的微镜面”占“法向量有效的微镜面”的比例是多少呢??? James F. Blinn在他的论文[4]中有详细的计算过程。这里直接列出结果:

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第25张图片

式子中:

第一项表示没有遮蔽时,“真正有效的微镜面”占“法向量有效的微镜面”的比例=1;

第二项表示(a)情况发生之后,“真正有效的微镜面”占“法向量有效的微镜面”的比例;

第三项表示(b)情况发生之后,“真正有效的微镜面”占“法向量有效的微镜面”的比例;

 

我们先不管G具体是怎么计算的,只要知道:求得G是“真正有效的微镜面”在“法向量有效的微镜面”中所占的比例;GD一样,也相当于一个概率值。


所以,D*G则表示:“真正有效的微镜面”在“所有微镜面”中所占的比例

 

 

F:菲涅尔项(Fresnel Term

 

通过前面的计算,我们已经直到“真正有效的微镜面”所占比例,所以,我们现在考虑的环境是“真正有效的微镜面”,相当于已经将“粗糙表面”转化为“镜面”了。

 

所以,下面我们考虑的是最简单的反射——镜面反射(mirror-like reflection)。

 问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第26张图片

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第27张图片

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第28张图片

问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)_第29张图片


 

书上接下来是对计算过程进行加速。

(略)

 

 

Reference:

[1]. Andrew S. Glassner, An Introduction toRay Tracing, Xerox PARC, 1989.

[2]. K. E. Torrance and E. M. Sparrow,Theory for Off-Specular Reflection From Roughened Surfaces, Jouunal of theOptical Society of America, Vol. 57, No. 9, 1105-1114, September 1967.

[3]. Bui Tuong Phong, Illumination for ComputerGenerated Images, Communications of the ACM, V. 18, No. 6, pp. 311- 317, 1975.

[4]. James F. Blinn, Models of LightReflection for Computer Synthesized Pictures, Siggraph ’77.

[5]. Robert L. Cook and K. E. Torrance, AReflectance Models for Computer Graphics, ACM Transactions on Graphics, Vol. 1,No. 1, Janunary 1982.

[6]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.

[7]. Tomas Akenine-Moller, Eric Haines,Naty Hoffman, Real-Time Rendering, A K Peters Ltd, 2008.

[8]. https://en.wikipedia.org/wiki/Phong_reflection_model

[9]. http://www.raytracegroundup.com/

[10]. http://www.realtimerendering.com/

[11]. https://zhuanlan.zhihu.com/p/21376124


你可能感兴趣的:(C++,ray,trace,computer,graphics)