Scan Line Z-Buffer 算法实现功能介绍

内容及要求

开发环境

软件使用说明

程序启动

运行Win32 Release工程(双击Release目录下的ScanLineZBuffer.exe),程序启动,默认加载解决方案下models路径中的al.obj模型文件,并使用扫描线Z-Buffer算法对所加载模型进行绘制,其结果如图1所示。并在命令窗口中输出模型加载、绘制所消耗的时间,所加载模型的面片数量和顶点数量。

图1 al.obj模型的绘制结果

模型加载

如果需要加载其他模型,可以将需要加载的模型的obj文件放置到models路径下,并且在窗口中右击,窗口会弹出菜单,如图2所示。

图2 模型选择菜单栏

菜单中出现的选项为models路径下的obj文件。左击菜单中,对应的菜单项即可加载对应的obj模型。例如,点击bunny.obj菜单项,即可加载bunny.obj模型,得到结果如图3所示。

图3 bunny.obj模型的绘制结果

模型的伸缩旋转

点击窗口右上方的放大按钮,窗口适应屏幕的大小,所绘制的模型也相应的增大。在窗口为屏幕大小的情况下,点击窗口右上方的缩小按钮,窗口缩小到原来的默认大小(800×600)。在窗口的缩放过程中,模型都需要进行重新绘制。

本程序支持鼠标拖动旋转和键盘按键旋转。鼠标拖动旋转可以比较灵活的旋转模型,同时键盘按键旋转可以实现比较精准的旋转。这里对键盘按键旋转功能进行详细说明。键盘上对应快捷键的功能:

说明:鼠标拖动转动和键盘按键转动的转动轴都是通过对应模型的中心点的。

通过旋转,用户可以根据需要,拖动三维模型或者键盘按钮来查看三维模型的不同部分,实现了三维模型的完全可视化。例如,转动图3中bunny模型,可以得到如图4的结果。

图4 bunny 转动结果

f-16.obj模型的转动结果如图5所示。

图5 f-16模型的旋转结果

模型着色

为了使程序绘制得到的模型具有一定的三维感,程序中增加了简单的点光源着色。在窗口大小为800×600的情况下,点光源位于窗口上方中间的前面(屏幕外面),以窗口左下角为坐标原点(0,0,0),光源的位置为(400,600,500),这样刚好能够照亮模型的正面。如图6所示为未使用点光源着色的bunny模型,与图3中使用点光源着色的bunny模型对比,明显未使用点光源着色的bunny模型完全没有三维层次感,无法验证扫描线Z-Buffer算法是否正确处理了遮挡关系。

图6 未使用点光源着色的bunny模型

软件特点

数据结构说明

为了使得程序具有良好的层次性,采用了C++面向对象的编程。程序根据不同阶段的需求,设计了如下类,并对其需要完成的功能和特点进行了说明:

加速说明

扫描线Z-Buffer算法本身充分利用了多边形区域、扫描线和边的连贯性,避免了大量的反复求交,消影的效率较高。在这个基础上,本文将活化边表不保存为一对,而是分别保存,这样避免了大量对当前活化多边形是否结束的判断,提高了程序的运行效率。

同时,扫描线Z-Buffer算法具有一定的平行性,在分类多边形表和分类边表的构建、扫描线填充的过程中都具有良好的并行性。因此,利用OpenMP可以有效地对扫描线Z-Buffer具有良好的加速作用,充分利用了计算机的CPU资源。另外在模型旋转的过程中,模型各个点的旋转相互独立,也可以利用OpenMP进行并行加速。

性能表现

在配置为主频 3.4GHz 的Intel i7-6700 CPU,内存为DDR4 8G的台式机上,本文程序的表现如下所示:


表1 模型加载绘制耗时
模型 顶点数 面元数 加载耗时/ms 绘制耗时/ms
Al 3618 3340 249 25
Bunny 34834 69451 10822 426
Desk 2296 2438 196 12
Dolphins 855 1692 64 17
F-16 2344 2366 189 18
Flowers 7608 4061 591 41
Porsche 4099 4740 398 36
Rose+Vase 2184 3360 230 27
Soccerball 1760 1992 131 20
Teapot 530 992 38 10

从表1中可以看出,本程序可以满足一般模型(顶点数和面元数较少)的查看。对于较复杂的模型,如Bunny模型的加载速度较慢,大概需要10秒,但是绘制的速度还行,大概需要0.5秒。同样,在其他模型中,模型的加载时间远长于模型绘制所消耗的时间,因此如何加载模型算法的加速是提高程序性能的突破口。程序较快的绘制速度可以有效地满足一个模型的旋转查看。

Table of Contents