第三次实验
1. 实验目的
实现用 Phong 光照明模型显示网格模型(*.smf)。分别实现不使用/使用增量式光强/法
向插值算法,比较三种不同的显示效果和效率。 Phong模型中各参数可调,观察它们的作用。
与用户的交互方式为图形用户界面,操作简单,界面友好。
2. 算法描述
2.1. 基于扫描线算法的Phong 模型实现
上一次大作业中我没有完成扫描线 ZBuffer 算法,使得程序的效率很低,这次作业考虑
到各种计算对时间的消耗会更大, 所以我首先完成了扫描线算法再进行这次作业代码的编写。
对扫描线Z-Buffer算法这里不作详细描述,主要介绍 Phong模型的实现。基于扫描线算
法的 Phong 模型实现是非常方便的,因为最基本的 Phong 模型中每个面的颜色是法向量的
函数,因此每个面的颜色是相同的,这样在扫描线算法之前我首先初始化了一个数组,将各
个面的颜色根据用户提供的参数以及 Phong 模型公式计算出来保存在这个数组里,每一项
对应一个面, 这样在具体扫描线算法的执行过程中每一个点颜色的获取都仅仅是对数组的读
取操作,是O(1)的复杂度,不会消耗太多时间。
算法如下:
1. 对物体表面上的每个点P,均需计算光线L的反射方向R,R=2N(N·L)-L。
为了减少计算量,假设:
2. 光源在无穷远处,L为常向量
3. 视点在无穷远处,V为常向量
4. 用(H•N)近似(R•V),H为L与V的平分向量
5. Phong光照明模型的RGB颜色模型形式
2.2. 双线性光强差值算法
考虑到双线性光强差值算法的核心思想是由顶点的光强插值计算各边的光强,然后由各
边的光强插值计算出多边形内部点的光强,结合之前实现的扫描线 ZBuffer 算法,我使用了
增量的方式实现这个算法,也就是将它和扫描线算法结合起来,在扫描线算法每个面的边表
中多加几个个域来表示当前的光强、光强在X 方向的单位增量和光强在 Y 方向的单位增量,
这样在扫描到每个点的时候就可以根据前一个点的光强以及光强增量获得该点的光强, 另外
在扫描线改变的时候光强也需要根据Y方向的增量来进行相应的修改。
2.3. 双线性法向差值算法
基本思想和双线性光强差值算法相同,也是利用扫描线 ZBuffer 算法作为基础,将一些
数据结构做一些相应修改即可方便实现这个算法。
3. 体会:两种差值算法的比较
双线性差值光强算法和双线性法向算法得到的结果差别不是很大, 相对而言比较明显的
区别是法向算法得到的模型镜面反射效果比较会聚,区域没有光强算法那么大。
5. 交互方式
Model——模型选项,可以进行缩放和旋转;
Illuminant——光源选项,可以选择光源的颜色和位置;
Ambient——环境光选项,可以选择环境光的颜色;
Reflectance——反射参数,可以设置各种参数;
Rendering Algorithm——渲染算法,可以选择三种算法中的一种。
展开阅读全文