关于光照的一些概念

关于光照的一些概念
光照就是通过计算让面对以及靠近光源的三角形看起来比较亮。正对光源的三角形可以反射出比较强的光线,而比较靠近光源的物体,光线的衰减程度会比较低。
在Fixed Function Pipeline中,光照都是在模型的顶点上计算的,再通过内插把光照结果散播到三角形内部,这种以顶点为单位来计算的方法叫做per-vertex lighting。如果使用Shader就可以把光照计算放到像素中去做,这样可以得到比较精确的光照结果,这种方法叫per-pixel lighting。
Normal,即法线,用来指定模型上每个顶点所面对的方向。
在Fixed Function Pipeline中支持四种不同的光源:方向光(Directional Light)、电光源(Point Light)、聚光灯(Spot Light)、环境光(Ambient Light)。
方向光(Directional Light),只有方向和颜色属性的光源,长用来模拟太阳。不具有位置属性,无法计算出光源随距离的衰减值,被定义成与距离无关。
点光源(point Light),具有位置和颜色的属性,在空间中占据一个点,并向四面八方散射。光线照到某个物体后,反射光的强度与物体表面的法线和入射光线的夹角有关。光源随着到物体的距离增大而衰减。
聚光灯(Spot Light),具有方向、位置、颜色这些属性,还需要指定光柱圆锥的发射角度。落在光柱中偏外侧的物体所得到的光线强度会比较弱,完全落在光柱外的物体接受不到光线。光线会随着距离的增大而衰减,反射强度会随着光线入射角的改变而改变。
环境光(Ambient Light),没有位置,没有方向,仅仅提供一个基本的光源强度。环境光用来模拟通过反射得到的间接光源,否则有些物体可能会因为太暗而看不到。
在3D绘图中通过反射所得到的光源称为Global Illumination;不是通过反射,而是直接照射的光源称为Direct Illumination。Ambient Light是解决Global Illumination的最简单方法。Directional、Point、Spot照射得到的光是Direct Illumination。
Directional、Point、Spot照射到得物体表面会吸收到部分光线,也会反射部分光线。物体表面的纹理就是用来设置物体反射光线的能力。
物体表面的反射光有两种。一种是Diffuse Light,它会均等的向四面八方反射出同样强度的光线;另一种是Specular Light,它是物体表面直接反射的光线。反射光线是有方向的,如果镜头越接近反射后的光线路径,那么就可以看到越强的Specular Light。
一个相当重要而且很简单的观念,光源强度是可以累加的。可以先计算第1个光源的结果,再把第2个、第3个、...... 、第n个光源的强度累加上去。


光线衰减公式:1/(a*1 + b*d +c*d*d)
// vDistance用来计算光线随距离衰减公式中分母的(1, d, d*d)
Vector4 vDistance(1.0f, light_distance, light_distance*light_distance);
// g_vLightAttenuation里记录了计算衰减公式中分母的(a,b,c)
g_vLightAttenuation.Set(1.0f. 1.0f, 0.0f);
// Vector3Dot(vDistance, g_vLightAttenuation) = (1,d,d*d) dot (a,b,c) = (a*1 + b*d + c*d*d)
Vector4 vAttenuation = Vector3Dot(vDistance, g_vLightAttenuation);
----摘自《3D绘图程序设计》

你可能感兴趣的:(关于光照的一些概念)