众所周知世界是由颜色组成的,我们要渲染一个虚拟的世界,主要就是对颜色的渲染。对于一个模型上面的颜色,主要由两部分组成:静态的颜色(模型自带颜色,纹理贴图的颜色)动态计算出的颜色(光照,阴影以及一些特殊渲染),静态的颜色实现起来比较简单,它是一个物体的本质色彩,但是想要描述一个精彩的世界重点还是对动态颜色的渲染,这样更真实。为了模拟动态的颜色,各路人才把各种数学物理上的知识都用上了,其中最基础的就是光照模型,不可否认光是产生颜色的根源。这里说的简单光照是对光的最简单模拟,它不考虑物体的透明度,也不考虑光的二次反射折射散射带来的影响。
光的类型:这里说的是能给物体颜色带来影响的光线的类型,不是光源。
物体表面的颜色由自发射光(emissive)、环境光(ambient)、漫反射光(diffuse)以及镜面高光(specular)四部分组:
surfaceColor(体现在物体上的光照颜色) = emissive + ambient + diffuse + specular
1.自发射光(emissive) :类似荧光只影响物体本身,几乎不对周围造成影响,所以它不属于光源。
emissive = Ke
ke :为一个简单的颜色
2.环境光(ambient) :按常理来说,光都是有光源的,但是环境光没有。这是因为简单光照模型没有考虑光的二次反射折射散射等效果,既然没有考虑就用一个恒定值来模拟它们影响的结果。
ambient = Ka x globalAmbient
ka:为材质的反射系数
globalAmbient :为一个常量颜色
3.漫反射光 :是指光向各个方向的反射
diffuse = Kd x lightColor x max(N · L, 0)
Kd :物体的漫反射系数
N :顶点法向量
L :光的入射向量
lightColor :光在此顶点的值
![](http://www.jujindao.com/data/attachment/forum/201208/11/1054110w0069hheo20aaoh.png)
4.高光反射:物体表面的镜面反射
specular = Ks x lightColor x facing x (max(N · H, 0)) shininess
Ks :是材质的高光系数, lightColor是光源颜色
N :是归一化的物体表面法向
V :是归一化的视点向量
L :是归一化的光源方向向量
H :等于归一化的向量(V+L)/2
P :是着色的顶点位置
shininess :为物体表面的发射指数
facing :如果N · L > 0,facing 是 1 ,否则是0。(这个其实就是判断夹角超过)
![](https://i-blog.csdnimg.cn/blog_migrate/7223cc4215cfc3d537c2033783bdfb41.png)
光源类型:这里说光源的时候,只描述光源到空间特定位置时的光照强度。
1.平行光:
平行光源(Directional Light)也被称为方向光源,用来表示一个距离被照物体无穷远的光源,由光源发出的光线平行通过整个场景。平行光只有颜色和方向,没有发光位置,光源发出的光线互相平行地通过整个场景,此外平行光无衰减。
![](http://www.jujindao.com/data/attachment/forum/201208/11/140939fwcoybf0s0fs0bqy.png)
2.点光源:
点光源(Point Light)也被称为泛光灯(omni)或者球形光源(spherical light)。它具有特定的位置和颜色亮度,向四周所有的方向发出光线。
![](http://www.jujindao.com/data/attachment/forum/201208/11/140940pptopc6uvgvumjgr.png)
计算公式:衰减=1/(att0+ ATT1* D+ ATT2* D* D),D是距离 (有了衰减因子就能知道光照强度值)
3.聚光灯:
聚光灯(Spot Light)表示从空间的一个固定位置向特定的方向放射光子,它与点光源类似,都具有明确位置属性,区别是聚光灯的光线沿着一个方向成圆锥形散发。
![](http://hi.csdn.net/attachment/201102/14/0_12976624504LbJ.gif)
![](http://hi.csdn.net/attachment/201102/14/0_12976624504LbJ.gif)
图中α为光源指向像素的向量和聚光灯方向向量的夹角,这个夹角的余弦值可通过点乘这两个向量获得。聚光灯光照角度衰减因子的公式如下:
1.若α>φ,即位于半影之外,根本照不到,此时角度衰减因子为0。
2.若α<θ,即位于本影内,则只有距离衰减,角度衰减因子为1。
3.若θ<α<φ,即位于半影内,则角度衰减因子为:((cosα-cosφ)/(cosθ-cosφ))falloff
此种光源关键是要判断半影区的衰减因子。
顶点着色模型:顶点着色涉及三角形面上颜色计算的问题,分为以下三种:Flat着色、Gouraud着色和Phong着色。
1.Flat着色:
Flat着色也被称为平面着色,它以三角形为单位进行颜色计算,然后用这种颜色对三角形进行填充,整个图元的像素颜色由第一个顶点的颜色值决定。
2.Gouraud着色:
Gouraud着色也叫顶点着色。Gouraud着色处理首先计算三角形每个顶点的颜色,然后使用这些顶点的颜色通过插值来计算三角形内部各个点(像素点)的颜色。
![](http://www.jujindao.com/data/attachment/forum/201208/11/134657z7noheeoio8i5plf.png)
P是由E和F这两个点的颜色算出来的,公式就不用说了,什么比例什么的计算一下就行了。
3.Phong着色:
Phong着色不是对三角形中各点的颜色进行插值计算,而是对三角形上各个点的法线向量进行插值计算,最终在每个像素点上都根据插值所得到法线向量按光照模型计算颜色值。
(很明显这种方式计算出来的结果比较好)
![](http://www.jujindao.com/data/attachment/forum/201208/11/135047545e89j15p657b6w.png)