欢迎来到NiceSpace!祝大家开心每一天!
  • C++
  • 图形学
3D图形学总结(八)—简单光照

游戏中通常会通过光照的原理来模拟计算光照,越逼真的光照需要的计算越复杂,但是在基于软件渲染的条件下只能模拟一些简单的基础光照,让游戏看起来更自然些。下面记录些简单光照模型。

一、环境光

环境光是世界中来自四面八方的光,它没有确切的来源,而是各种光经过各种物体反射后的结果,我们正常能看见物体就是因为环境光在物体上被反射到我们眼中,从而我们可以看到物体。

在游戏中,物体的颜色我们可以认为是材质或者纹理的颜色,光照在物体上,光照颜色与物体颜色进行调制后就是物体最终反射到我们眼中的颜色,如光照颜色Iambient = RGB(80, 80, 80), 物体某个像素点的颜色即物体表面的反射颜色Kambient = RGB(198,217,98),那么环境光经过物体反射后的最终颜色Ires = (80 * 198 / 255,80 * 217 / 255,80 * 98 / 255),光照只是对物体颜色进行调制,并不能真的让物体变得更亮,最大值1也只是显示物体的本来颜色,正常光照计算中颜色值都是用0-1之间的值来表示的,这里为了清晰表示为0-255的格式,所以我们有环境光照射物体的计算公式为:

Ires = Iambient * Kambient

颜色分量的格式为0-1,下面是分别在环境光(80,80,80)和蓝色环境光(0,0,255)条件下vs中的截图(gouraud着色下,光照颜色与物体纹理颜色作用后的结果):

很明显左侧的箱子比较暗因为光比较弱,右侧箱子呈蓝色因为蓝色光照射箱子后箱子表面只反射蓝色分量。

二、散射光

散射光是各种光照直接作用在物体身上后反射的结果,散射光与观察者的位置无关,沿所有方向均匀的散射,但是散射的强度取决于物体表面的面法线与光源向量之间的夹角,跟夹角的余弦呈正比。计算公式与环境光类似,只是乘以一个余弦值。公式为:

Ires = Idiffuse * Kdiffuse * (n·l)

Idiffuse为散射光强度,Kdiffuse 为物体反射散射光颜色,n为面法线向量,l为点到光源的向量,均为单位向量,所以n·l为n与l的夹角余弦值。

物体反射散射光源有几种:

直射光,直射光的光照强度跟距离无关,所以直射光照射到物体上后的光照强度(颜色)Idiffuse就是直射光源的初始颜色.

点光源,点光源的光照强度随距离递减,通常用3个因子来模拟,常量衰减因子kc,线性衰减因子kl,二次衰减因子kq,公式为:

Idiffuse = Ipoint / (kc + kl * d + kq * d^2),Ipoint为光源初始强度(颜色)

只存在直射光环境中的vs运行截图:

随机文章
3D图形学总结(八)—简单光照 破解图片防盗链 3D图形学总结(三)—相机坐标转换(UVN相机) 将C/C++注册到LUA环境中使用 3D图形学总结(九)—3D裁剪
推荐文章