实验目的及要求:
|
软硬件环境:
|
算法或原理分析(实验内容): 1.Phong算法中影响光照的三个因素: 环境光(Ambient):可以理解为现实中的白天的室内,白天在室内我们能看的见物体,但是并没有感知光线的方向,其实是因为太阳离我们太远了,导致我们周围的光线强度都是一样的。 漫反射(Diffuse):面向光源的表面更亮。 镜面反射(Specular):模拟光在抛光或金属表面的反射 其实最终我们就是要计算出一个影响颜色的因子,在执行片段着色器程序时用这个变量fragColor去乘以该因子,进而根据接收的光线将颜色设置得更亮或更暗。将场景中对其他光的影响因素环境光、漫反射、镜面反射分别叫做A、D、S,则计算那个影响颜色的因子可以用下面公式来表示。 如果模型没有纹理,将按照下面这个公式去算: 有纹理,将按照下面这个公式去算: 环境光(Ambient)对光线的影响 它只是一个常数因素,可以使我们所有的物体更亮或更暗。环境光是最容易计算一种影响因素。我们只需要传递一种颜色,用它乘以模型的基色,它只是调制基色。所以我们只需要一个矢量来调制环境光强度和颜色。 漫反射(Diffuse)对光的影响 以点光源为例:假设有一个光源照在一个物体上,面向光源的一面整体会比背向光源的一面更亮 对于漫反射的计算,首先在上图中的物体上取几个顶点位置P1、P2、P3,相应的顶点法向量为N1、N2、N3。顶点法向量是垂直于每个点的切平面的矢量。如下: 在上图中可以很明显的看出来,P1位置一定比P2更亮,P3基本不会受到该光源的影响。而P1位置比P2更亮是因为,P1受到的光照是从该顶点的正上方照射过来的,而P2受到的光线是比正上方稍微偏了一些。所以我们在计算每个顶点的漫反射影响因子时,顶点的法向量与该点受到光线的夹角是影响明暗的一个因素。 镜面反射对光的影响 当光线照射到表面时,它的某些部分被吸收而另一部分被反射,反射就是光线从物体上反射回来。镜面反射如下: 将空间中的观察点,比作相机(Camera)对于镜面反射,最重要的是要注意,只有当相机处于适当的位置时,反射光才会可见。 2.光源位置改变: 光源位置对光照方向的影响:光源的位置决定了光线的方向。当光源位于球体的左侧时,光线从左侧照射到球体,球体左侧会更加明亮。当光源位于球体的上方时,光线从上方照射到球体,球体上方会更加明亮。同理,当光源位于球体的下方或后方时,球体的下方或后方会更加明亮。 光源距离对光照强度的影响:光源距离球体的远近也会影响光照的强度。当光源距离球体较近时,球体上的光照强度会更强,反之则较弱。 光源颜色对光照颜色的影响:光源的颜色也会影响球体被照亮的颜色。例如,当使用红色光源时,球体被照亮的部分会呈现红色。 |
程序代码或实现过程: 1.[x, y, z] = sphere(50); % 创建一个球体模型? figure h = surf(x, y, z);?% 设置光照属性 set(h, 'AmbientCoefficient', 500); % 环境光系数 set(h, 'DiffuseCoefficient', 5); % 漫反射系数 set(h, 'SpecularCoefficient', 500); % 镜面反射系数 set(h, 'SpecularPower', 200); % 镜面反射光的模糊程度 lighting gouraud; camlight right; colormap('gray'); % 调整光照方向和颜色 shading interp; axis off; view(3);?% 显示图形 2.close all [x,y,z] = sphere(40); colormap(jet) subplot(1,2,1); surf(x,y,z),shading interp light('position',[2,-2,2],'style','local') lighting phong title('phong') subplot(1,2,2) surf(x,y,z,-z),shading flat lighting flat light('position',[-1,0.5,1],'style','local','color','w') title('flat') % 更改光源位置? camlight left;?% 将光源移到左侧 camlight above;?% 将光源移到上方 camlight below; % 将光源移到下方 camlight behind; % 将光源移到后方 |
结果分析: 简单光照模型 改变光源位置 |