计算机图形学当中的光照模型

2016-12-10 10:44:29来源:oschina作者:dada0526人点击

在计算机图形学当中,我们的最终目的就是在屏幕上画出我们所希望的图案,而这些图案的展示方式就是色彩,这跟现实生活中,我们真实的视觉感觉的道理是一样的,我们双眼最后反馈给我们的,也就是这五彩缤纷的世界,而计算机图形学要做的,就是尽可能的模拟物理现象,为我们在计算机上模拟出更加接近现实的图案


计算机成像的基本单位就是像素,数以千计的像素点连在一起,就组成了我们所看到的计算机画面,当然,像素成像本质上只是二维成像,即使有我们现在玩的3D游戏,或者在计算机中随处可见的三维物体,但这也仅仅是计算机通过模拟现实中的物理现象,给我们的双眼创造出的“假象“”而已,比如在一个游戏画面中,看似近大远小的三维场景,其实是计算机事先计算好各个物体距离一台虚拟的“照相机”的位置,距离近的画小一点,距离远的画大一点,从而欺骗了我们的双眼,让我们以为这是一个三维的场景。而这个用2D图像来表示3D场景的过程,就是所谓的Rendering Pipline的粗略概念。关于Rendering Pipeline,以后有机会我会为大家详细讲解。


而今天我们要讲的,就是使这个‘’骗局‘’”锦上添花‘’的一笔,就是光照模型(当然,虽说是光照,其实并没有什么灯,所有的一切,都是通过数学运算,再用计算机懂的语言翻译给计算机,然后计算机为我们渲染出来的),有了光照,我们就可以看得见计算机为我们呈现的物体,就能在计算机上呈现出更加多彩图案,更能使逼真的物体显得更加逼真。


前面提到,计算机成像的核心就是填充像素,每一个像素的颜色都是由光源类型,所渲染物体的表面材质,顶点法向量,以及观察者的观察角度来决定的。


当然刚才所讲的这些其实并没有真是存在,也许说到这儿你想抱怨了,我花时间看你的文章就是为了听废话?好吧,请先放下手中的西瓜刀,听我慢慢讲,您说,一个电脑,一台计算机,屏幕里当然不会出现什么光源,什么么表面材质,什么观察者,所有的这些,都是我们事先用计算机编程语言,将现实的物理现象通过公式传达给计算机,在结合计算机本身的成像原理,最终创造出来的,通俗一点讲,那些光源什么的,其实仅仅是一个坐标点而已,我们把物理公式翻译成计算机语言,然后告诉计算机,这个点按照这个物公式渲染,那个点按照那个公式渲染,然后把结果汇总,计算机就会为每个像素填充好相应的颜色,然后,我们就能看到图像了。


而这些光照模型,正是模拟现实的成功范例,然后一直被人沿用,发展,变成了几乎是定律的东西,也就是说,只要遵循这些定律,进行编程,就可以模拟出特定的效果。


好,现在我们正式开始介绍光照模型。


1.光源:

光源主要分成三类:点光源(Point light),平行光源(Direction light),聚光灯(或叫局部光源spot light)


下面这张图是他们的详细介绍



这里要为大家特别解释一下局部光源,它的模型在下图:




这幅图中的θ1就是所谓角限位,也就是圆锥的中轴线与圆锥母线的夹角,而图中的α


角,则是中轴线与定点和物体连线的夹角。


2.如何定义灯光颜色:

在计算机图形中,光源的颜色被分成三个部分:Ambient color(环境色),Diffuse color(漫射颜色,或叫做固有色),以及Specular color(高光色)所组成。



当然有了光照,决定物体颜色的另一个重要因素——物体材质,就不得不提了:


每一个物体都有它独特的物体材质,比如说,光滑的玻璃,粗糙的木头,坚硬的岩石等等,我们知道,自然界中,物体的颜色是靠他所反射的太阳光的颜色决定的,比如,红色物体只反射光线中的红色部分(写这部分时我真的不知道自己在说什么,博主的物理知识实在匮乏(*___*)),总之,在计算机中,我们不可能将所有的材质特性全部都表示出来,比如,在OpenGL中,我们用reflection coefficient(反射系数,这里是用物体对R,G,B颜色的反射率来定义物体材质的)来表示材质属性,而一种材质对于不同种颜色(R,G,B)的反射率也是不同的。下图就展示了三种反射对于不同种颜色的反射率:



到此为止,产生光反射现象的两大要素已经完备,下面就为大家介绍光照反应,博主的物理知识水平还停留在高中(其实也用不着什么物理知识,美术知识就行*____*~~,博主的物理就是美术老师教的),知到反射现象一共分为三种,Ambient effect(环境影响,环境光),Diffuse effect(漫反射影响),Specular effect(高光现象),由上述三种现象构成的光照模型是:



大家先不用着急去记忆公式,我会为大家逐一解释公式的各个部分:


3.光照模型:

(1)Ambient Light Model:


(注意这里的“*”表示普通的乘法运算,不是叉乘运算)


(2)Diffuse Reflection Model:增加了入射光与法向量的夹角,将这个值(实际上是)与Ambient Light Model的输出值相乘:



(这里的N●L表示点乘)


(其中,L为光源方向,N为法向量)


(3)Specular Reflection Model:增加了反射光线与观察者的视角:


其中R是反射光线向量,V是观察者的观察视线向量。ns是高光指数,是一个常量。


之后,我们就可以将这三种模型结合起来,构成我们的终极模型,也就是大家在刚刚开始看见的这个公式:



其中:



到此为止,我们所要介绍的光照模型就介绍完成了,但是,这里的光照模型仅仅是解决了顶点的着色方法,


如图,这是在3DSMAX中完成的模型的网格渲染:



将细节放大来看:



发现其组成表面的基本单位是三角形,而我们刚刚讲过的光线模型,仅仅是对于这些三角形的(或者其他多边形)顶点的渲染,接下来,我们就要利用Suface rendering(表面渲染),来对物体表面的颜色进行填充了。在进行表面渲染时,所应用的算法也都是基于刚刚讲的顶点着色方法。


4.表面渲染:


Flat

Shading


Gouraud Shading


Phong Shading


定义


组成物体表面的每一个多边形的颜色,都是由这个多边形各个顶点的颜色的平均值所决定的。


每一个多边形的颜色都是由多边形顶点的颜色的插值决定,具体的差值方法见下图:


在Gouraud Shading的基础之上加入了各个顶点的光线强度,计算每个顶点的法向量,然后计算每个点的光强值.与Gouraud Shading不同的是,Phone Shading是对每个点的法向量进行差值计算的,而Gouraud Shading,前面说过是对颜色进行差值计算的:




特点


简单,快速,但是渲染出来的结果会在面面之间产生明显的“断层感”


解决了Flat Shading的断层感


补色渲染(Phong Shading): 这是目前最好、最复杂的着色方法,效果也要优于GouraudShading。它的优势在于对"镜面反光"的处理,通过对模型上每一个点都赋予投射光线的总强度值,因此能实现极高的表面亮度,以达到"镜面反光"的效果。

(来自百度百科)




示例






到此为止,光照模型的知识就为大家介绍完成了,光照模型的基本概念对于我们接下来要进行的光线追踪渲染法起到了一定的作用,在接下来的讲义中,我将为大家从数理基础(反射光,折射光的计算)到用C++语言编程,全方位的介绍光线追踪渲染法的一系列知识。博主自已也喜欢把知识嚼碎了给大家,我会尽量讲得很详细。争取即使你不是计算机专业出身都能够看得懂。

上面如果有图片看不清楚,可以尝试放大来看看。在上面的表中有几幅图片不清楚,我为大家再贴一下:





这些主要是Gouraud Shading在计算颜色插值时的计算方法:

看过·许多博主的博文之后,发现大家习惯把interpolated (插值)翻译为(差值),博主个人认为还是(插值)比较准确一些。

由于博主自己也是经验不足,犯错误也是难免的,如果在我的文章中发现错误,欢迎指正,如果·有任何问题,请加QQ852170906,我会尽我所能为您解答。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台