文献标识码: A
文章编号: 0258-7998(2015)02-0051-04
0 引言
计算机处理图形信息时,会遇到存储的图形较大,而屏幕只能显示部分图形的情况。比如把整幅地图显示在屏幕上,由于不能看到局部的细节,使用缩放技术便可以把地图中的局部区域放大显示[1]。在放大指定区域时,必须确定图形中哪些部分落在范围之内,哪些部分落在显示范围之外,以便显示落在显示范围内的图形。裁剪的目的正是判断某个图形元素是否落在窗口之内,如落在窗口之内则进一步求得位于窗口内的部分。
平面剪裁是OpenGL经典的图形流水线的重要部件之一,也是最为复杂的部件之一。高性能的图形处理必须通过高性能的硬件加速器来实现平面剪裁功能,本裁剪器最多支持6个裁剪面,客户指定裁剪平面对世界空间中的物体进行裁剪,将图元在给定平面外的部分裁剪掉,保留面内的部分,以实现特殊效果。比如,在三维视图中标示可见面[2]、对部分图形进行复制、移动或删除操作防止图形边界混淆、从特定场景中抽取指定部分等。它在计算机图形处理中具有重要的意义。
1 可编程裁剪器硬件设计
作为3D图形加速器的重要组成部分,平面剪裁在计算机图形处理中具有十分重要的意义。本剪裁器由命令解析(CMD Unit)模块、控制电路(Ctrl Unit)模块、装配电路(Assemb Unit)模块及微控制器(MCU)模块构成,总体结构如图1所示。可编程设计体现在用底层汇编在微控制器上运行,已完成平面裁剪功能,其余的3个模块为外围电路,对微控制器完成图元裁剪起辅助加速作用,以便高效实时地完成裁剪功能。MCU采用自主研发的支持90位双发射指令、4级流水线RSIC结构,含有4片独立的32×256RAM数据存储(BANK)单元,完成并行存储的功能,即一个时钟沿可对4块存储体进行读或写,寻址范围是1k,应用于裁剪过程中所用数据的读写。本微控制器可直接在BANK中进行数据读写操作,避免了通过寄存器来对BANK读写,大大减少的读写数据周期,提高了运算效率。
各模块功能如下:
(1)CMD Unit:接受GPU内部管线上一级传来的GPU内部148位命令,如果是与平面裁剪无关的命令,则不做任何处理,将其透传给下一级,如果与平面裁剪有关,则对命令进行解析,将矩阵和图元信息、参数个数及属性个数等信息存入微控制器中的数据BANK中。
(2)Ctrl Unit:利用数字电路设计常用的有限状态机(Finite State Machine,FSM)原理控制命令解析、命令装配模块和微控制器间的通信,并采用双轨握手协议完成GPU内部管线上下级间的信号交互,图2为其状态转移图。
(3)MCU:本RISC处理器具有超长指令字(VLIW)结构,由指令读取、指令解码、执行和前馈4级流水线等组成。超长指令字的宽度为两条RISC指令,即能够同时解析两条RISC指令,并将译码的结果发送到相应的两条处理流水线中。将平面裁剪汇编指令固化到指令ROM,并通过数据存储、取指单元、译码单元、地址流水线单元、整数和浮点数运算流水线等11个模块实现可编程裁剪的功能。MCU结构如图3。
(4)Assemb Unit:该模块读出在MCU完成平面裁剪后存储在微控单元BANK中的图元信息,并对裁剪后新的顶点重新装配为148位GPU内部命令,发送到管线的下一级。
2可编程裁剪器算法和软件设计
2.1 平面裁剪算法
与三维剪裁不同,平面裁剪通过图元在给定的任意平面内外进行判别,对每个点只要它的视觉坐标(x,y,z,w)满足(A,B,C,D)M-1(x,y,z,w)T≥0就于此平面内侧,否则都将被裁剪掉。其中,(A,B,C,D)为平面系数,M是在调用裁剪平面时当前的模型视图矩阵。
平面裁剪采用经典的Sutherland-Hodgman[3]多边形裁剪算法,利用给定的平面与世界坐标系下的图元间的位置关系,计算直线与平面的交点,并结合线性插值计算交点的属性传至流水线下一级,完成对图元的剪裁。
当定义的一个裁剪面依次裁剪多边形的每一条边后,组成新的多边形,再经下一个裁剪面处理,步骤相同。在所有裁剪面完成后,将保留的多边形信息存储在MCU的BANK中,最后重新装配成图元发送给管线的下一级。下面是一段基于SH裁剪算法的伪代码。
If(the specified plane is enable) {
SutherlandHodgman(clipped primitive);
for(i=0;i<outlength;i++) {
InVertex[i] = outVertex[i];
outVertex[i].x = 0;
outVertex[i].y = 0;
outVertex[i].z = 0;
}
inlength = outlength;
}
2.2 平面裁剪软件设计
在计算机图形学中,基本图元只有点、线和三角形,其他任何复杂图元均由这3种图元构成,平面裁剪就是采用SH算法对这3种基本图元进行裁剪,丢弃位于裁剪面之外的图元信息,采用线性插值的算法,算出位于裁剪面内的图元信息,并将其发给GPU管线下一级。平面裁剪软件设计流程如图4。
3 功能仿真验证与原型开发
采用SystemVerilog编写顶层测试文件,搭建相应的平面裁剪软硬件协同验证平台[4],仿真使用Mentor公司的QuestaSim 6.5(Linux环境)工具,综合使用Xilinx公司的ISE14.2工具,并选用Dini Group最新的DNV6_F2PCIE开发板进行原型开发。
3.1 功能仿真验证
该平台采用软件自动比较的方法进行自动化验证[5]。每一个测试点同时在Visual Studio 2008环境、SystemVerilog模型和HDL描述的硬件系统中运行,比较绘制结果,将模型和硬件系统作模块级输出比较,以确保所有功能的仿真是正确的。
根据测试点编写的点、线和三角形的激励,产生待测数据。将预先得到的参考结果存入FIFO中用于验证模型的正确性。经过待测模型(DUV)进行相应的处理后生成输出响应,与参考结果中的值进行比较,如果两者的值相同,表示功能正确;否则标识错误位置,及时修改错误点,加速了硬件开发。图5所示为该平台的架构。
经过自动对比,硬件结果与仿真模型的误差在可控范围之内,基本完成功能验证。
3.2 原型开发
基于上述设计方案,根据电路规模和性能要求,选择Xilinx公司的XC6VLX550T进行原型开发。选用Xilinx公司提供的综合工具[6]ISE14.2,单独综合平面裁剪模块频率为232.504 MHz,所占Slice为14%。采用DNV6_F2PCIE FPGA开发板进行功能验证,启动6个裁剪面对世界空间中的物体进行裁剪前后如图6所示。
由图6可以看出,本裁剪器能完成基于OpenGL 1.3标准的裁剪功能,能够高效、实时地将图元在给定平面外的部分裁剪掉,保留面内的部分,以实现特殊效果。
4 结论
本文对可编程裁剪器的设计与实现进行深入分析,完成可编程平面裁剪器的设计与实现。通过采用SystemVerilog搭建相应的软硬件协同仿真验证平台,完成了模型和HDL描述的硬件自动化验证,加速了软硬件开发过程,并最终在FPGA上完成原型开发与功能验证。从中得出了以下结论:
(1)计算机和信息技术的快速发展使人们对微处理器的性能要求越来越高。可编程处理器具有高度的灵活性和成熟性,而性能也可能接近ASIC。本文所设计的裁剪器充分利用了处理器的灵活性,并采用底层汇编实现了裁剪功能,完成了实时高效裁剪图形的目的。
(2)为提高处理数据效率,处理器还采用前馈机制,将执行后的数据和地址返回给解码控制端。除执行本地指令流外,流水线还可执行MIMD数据流。MIMD被普遍引用于当前CPU中,本裁剪器的核心模块微控制器就采用了MIMD的方式,提升了数据吞吐量。
(3)为了加速裁剪过程,给处理器配套外围电路,完成命令解析,状态控制和命令装配。
(4)使用汇编语言描实现可编程剪裁器的图元裁剪部分,同样可以用汇编程序代替前后端接收(译码)和发送(装配)电路,完成基于该处理器的通用剪裁器的设计工作,使其灵活性大大增强。
参考文献
[1] 王浩鹏.二维图形的裁剪算法研究与改进[D].西安:西安电子科技大学,2011.
[2] 孙杨.计算机辅助隐形牙齿正畸功能实现[D].杭州:浙江大学,2010.
[3] SULAND I E,HODGMAN G W.Reentrant polygon clipping[J].Communication of ACM,1974,17(1):32-42.
[4] 山蕊.基于System Verilog的可重用验证平台[J].电子技术应用,2013(5):38-40.
[5] 陈永光.RTL层次之系统互连线及系统电路的软件自动化验证方法研究[D].成都:电子科技大学,2012.
[6] 田耕,许文波.Xilinx ISE design suite 10.x FPGA 开发指南[M].北京:人民邮电出版社,2008.