首页 > 代码库 > 光照计算

光照计算

1.Lambert模型(漫反射)

环境光:

Iambdiff = Kd*Ia

其中Ia 表示环境光强度,Kd(0<K<1)为材质对环境光的反射系数,Iambdiff是漫反射体与环境光交互反射的光强。

方向光:

Ildiff = Kd * Il * Cos(θ)

其中Il是点光源强度,θ是入射光方向与顶点法线的夹角,称入射角(0<=A<=90°),Ildiff是漫反射体与方向光交互反射的光强,若 N为顶点单位法向量,L表示从顶点指向光源的单位向量(注意顶点指向光源),则Cos(θ)等价于dot(N,L),故又有:

Ildiff = Kd * Il * dot(N,L)

最后综合环境光和方向光源,Lambert光照模型可以写成:

Idiff = Iambdiff + Ildiff = Kd * Ia + Kd * Il * dot(N,L)

2.Phong模型(镜面反射)

Phong模型认为镜面反射的光强与反射光线和视线的夹角相关:

Ispec = Ks * Il * ( dot(V,R) )^Ns

其中Ks 为镜面反射系数,Ns是高光指数,V表示从顶点到视点的观察方向,R代表反射光方向。由于反射光的方向R可以通过入射光方向L(从顶点指向光源)和物体的法向量求出,
R + L = 2 * dot(N, L) * N  即 R = 2 * dot(N,L) * N - L

所以最终的计算式为:

Ispec = Ks * Il * ( dot(V, (2 * dot(N,L) * N – L ) )^Ns

3.Blinn-Phong光照模型(修正镜面光)

Blinn-Phong是一个基于Phong模型修正的模型,其公式为:

Ispec = Ks * Il * ( dot(N,H) )^Ns

其中N是入射点的单位法向量,H是光入射方向L和视点方向V的中间向量,通常也称之为半角向量(半角向量被广泛用于各类光照模型,原因不但在于半角向量蕴含的信息价值,也在于半角向量是很简单的计算:H = (L + V) / |L + V|  )

光照计算