楊世旺,蔣 林,蘇 誠
(1.西安郵電大學(xué) 計(jì)算機(jī)學(xué)院,陜西 西安 710061;2.西安郵電大學(xué) 研究生院,陜西 西安 710061)
隨著計(jì)算機(jī)科學(xué)的快速發(fā)展,人們對于圖形處理的要求也越來越高,而三維圖形顯示是圖形處理的核心[1]。三維圖形顯示的基礎(chǔ)是圖形變換,即將幾何對象的三維坐標(biāo)轉(zhuǎn)換到屏幕上所需要進(jìn)行的一系列坐標(biāo)變換,包括幾何變換、投影變換、裁剪和視窗變換。投影變換是在世界坐標(biāo)系中建立的,而計(jì)算機(jī)屏幕所顯示的圖形是在給定視點(diǎn)和視線方向下的二維屏幕投影[2],所以投影變換是整個(gè)圖形處理的關(guān)鍵部分。
投影變換完成圖元由世界空間到相機(jī)空間的轉(zhuǎn)換,然后再經(jīng)過映射得到二維屏幕上的圖形。因此,投影變換的效率極大地影響了圖元的轉(zhuǎn)換速度。本文所設(shè)計(jì)的硬件結(jié)構(gòu)能加快轉(zhuǎn)換的速度,從而使整個(gè)圖形處理流水線的效率也得到提高。
圖形處理采用流水線結(jié)構(gòu)實(shí)現(xiàn),其命令流程是:首先將每條命令送入命令處理器,然后按照流水線依次流入后續(xù)單元,每個(gè)單元按照需求,將相關(guān)命令內(nèi)容存入當(dāng)前參數(shù)存儲器,每條命令可能在某個(gè)單元終止。其處理過程是:當(dāng)一條命令到達(dá)某個(gè)單元,如果是本單元要執(zhí)行的操作,則執(zhí)行命令,然后將結(jié)果送入下一單元或者緩存;如果有本級所需的信息,則抽取信息,存入當(dāng)前狀態(tài)存儲器或者緩存;如果命令在后續(xù)單元還要進(jìn)行計(jì)算,則將命令傳送到下一單元。圖形處理流水線如圖1所示。
本文針對圖形處理流水線結(jié)構(gòu),設(shè)計(jì)了其中的投影變換單元。該流水線從命令處理開始,首先從客戶端讀取命令,將頂點(diǎn)進(jìn)行幾何變換并染色,當(dāng)有光照的情況下用phong模型染色,圖元生成將經(jīng)過上述變換的頂點(diǎn)裝配成指定的點(diǎn)、線或三角形,通過投影變換將頂點(diǎn)變換到規(guī)范的立方體中;然后剪裁掉位于立方體外的圖形,只顯示立方體內(nèi)的圖形,并且重新裝配剪裁后的圖形;再通過視窗變換把用戶坐標(biāo)系中的點(diǎn)變換到屏幕坐標(biāo)系中,計(jì)算圖形中的坐標(biāo)和像素;最后把每個(gè)點(diǎn)的顏色和坐標(biāo)等數(shù)據(jù)送給幀緩存,由幀緩存輸出到屏幕上,得到最終要顯示的圖形。本文將著重介紹投影變換部分。
在圖形學(xué)中,根據(jù)投影中心與投影平面之間的距離不同,可將投影分為透視投影和正投影。透視投影類似于人對客觀世界的觀察方式,它的特點(diǎn)是距離觀察點(diǎn)近的物體比較大,而距離遠(yuǎn)的物體相對比較?。徽队笆俏矬w直接映射到屏幕上,它實(shí)際上是透視投影的一種特例,即觀察點(diǎn)在無窮遠(yuǎn)或者觀察點(diǎn)由一個(gè)點(diǎn)變?yōu)橐粋€(gè)面[3]。
投影變換就是要確定一個(gè)視景體,其作用有兩個(gè):(1)確定物體投影到屏幕的方式,即是透視投影還是正投影;(2)確定從圖像上裁剪掉哪些物體或物體的哪部分。
透視投影的示意圖[4]如圖2所示,其視景體是一個(gè)平截頭體,在這個(gè)體積內(nèi)的物體投影到錐的頂點(diǎn),平截頭體外的圖元被裁剪掉[5]。
由 glFrustum(left,right,bottom,top,near,far)命令定義這個(gè)視景體,計(jì)算透視矩陣M,并乘以當(dāng)前矩陣C,使C′=CM。這個(gè)視景體可以是不對稱的[5]。由glFrustum命令計(jì)算的透視矩陣為:
正投影的示意圖如圖3所示,其視景體是一個(gè)長方體,它同透視投影一樣,只保留視景體內(nèi)的圖元。由 glOrtho(left,right,bottom,top,near,far)命 令[5]定 義 正投影視景體,由它計(jì)算得到的正投影矩陣為:
投影變換主要是通過矩陣與矩陣相乘、矩陣與向量相乘來實(shí)現(xiàn)的。其主要操作包括:輸入一個(gè)矩陣,完成當(dāng)前矩陣與該矩陣的乘積,并將其結(jié)果保存為投影矩陣;輸入一個(gè)頂點(diǎn)向量,把投影矩陣與該頂點(diǎn)向量相乘并把得到的結(jié)果(即新的頂點(diǎn)向量)送到輸出端。具體的運(yùn)算公式為:
其中C′是最新的當(dāng)前矩陣,V0是輸入的頂點(diǎn)向量。本設(shè)計(jì)采用流水線結(jié)構(gòu)的浮點(diǎn)運(yùn)算器,可以提高運(yùn)算速度并保證數(shù)據(jù)的精度。
為了更加全面地驗(yàn)證投影變換的功能,本文采用SystemVerilog語言搭建了投影變換的行為模型,在模型中實(shí)現(xiàn)了投影變換的功能,為硬件電路的設(shè)計(jì)提供參考,并以行為模型作為驗(yàn)證硬件電路時(shí)的參考設(shè)計(jì),從而能夠全面驗(yàn)證電路功能的正確性。
根據(jù)投影變換的功能,行為模型的設(shè)計(jì)流程如圖4所示。首先接收命令,如果需要修改的是投影矩陣,則根據(jù)收到的命令設(shè)置當(dāng)前矩陣為單位矩陣或指定矩陣,然后根據(jù)投影類型對圖元進(jìn)行透視投影或平行投影,結(jié)束后發(fā)送到流水線的下一級;如果需要修改的不是投影矩陣,則將命令透傳到下一級。
圖4 投影變換行為模型流程圖
投影變換的整體框圖如圖 5所示,其中 din、dout為輸入/輸出命令信號,vin、vout為輸入/輸出有效信號,rin、rout為輸入/輸出反饋信號。浮點(diǎn)乘法和加法主要用來完成矩陣與矩陣的運(yùn)算和矩陣與向量的計(jì)算,控制器主要用于控制上下級之間的握手信號,并控制數(shù)據(jù)有序地向浮點(diǎn)運(yùn)算器發(fā)送。
圖5 投影變換整體框圖
控制器的設(shè)計(jì)可以采用微程序式設(shè)計(jì)或硬件連接式設(shè)計(jì),本文采用硬件連接的設(shè)計(jì),同時(shí)采用狀態(tài)機(jī)來控制。具體的狀態(tài)轉(zhuǎn)移圖如圖6所示。
本文基于SystemVerilog語言對投影變換單元構(gòu)建了驗(yàn)證平臺,通過產(chǎn)生輸入激勵對其功能進(jìn)行驗(yàn)證,驗(yàn)證平臺結(jié)構(gòu)如圖7所示。對于投影變換功能的測試采用固定測試的方法,根據(jù)所列出的測試點(diǎn)編寫對應(yīng)的測試激勵,驗(yàn)證各種圖元經(jīng)過投影變換之后結(jié)果是否正確。
輸入激勵分為透視投影的測試、平行投影的測試和其他透傳類命令的測試,其目的是產(chǎn)生待測數(shù)據(jù)。這里,待測設(shè)計(jì)指本設(shè)計(jì)的硬件電路。采用自動化比較機(jī)制,實(shí)現(xiàn)硬件電路和行為模型的聯(lián)合仿真。將輸出結(jié)果進(jìn)行對比,如果兩者的結(jié)果相同,則表示功能正確;否則,報(bào)錯(cuò)。
本設(shè)計(jì)采用Verilog語言實(shí)現(xiàn)投影變換的功能,通過ModelSim 6.5進(jìn)行仿真,以驗(yàn)證功能的正確性,仿真結(jié)果如圖8所示。首先輸入glLoadIdentity命令,把當(dāng)前矩陣變?yōu)閱挝痪仃?;然后輸入一個(gè)投影矩陣,將單位矩陣與該矩陣相乘得到新的當(dāng)前矩陣;最后輸入一組頂點(diǎn)向量,經(jīng)過計(jì)算得到新的頂點(diǎn)向量并將其輸出到下一級。通過仿真波形可知,電路能夠?qū)崿F(xiàn)投影變換的功能。
使用Xilinx的ISE綜合工具進(jìn)行邏輯綜合,選用xc6-vlx550t的開發(fā)板,綜合的最大時(shí)鐘頻率可以達(dá)到250 MHz,而參考文獻(xiàn)[6]中的工作頻率只能達(dá)到 101 MHz,且其計(jì)算精度也比較低。因此,采用硬件設(shè)計(jì)可以極大地提高運(yùn)算速度和精度。
本文通過對圖形處理流水線的介紹,提出了投影變換的硬件實(shí)現(xiàn)方法,詳細(xì)描述了電路的內(nèi)部模塊,并對電路進(jìn)行了功能仿真和行為建模驗(yàn)證,從而使電路更加準(zhǔn)確。通過對圖形處理流水線中投影變換模塊的設(shè)計(jì)實(shí)現(xiàn),為以后圖形處理的研究工作提供了有力的依據(jù)。
[1]MOLLER T A,HAINCS E,HOFFMAN N.Real-time rendering,3rd edition[M].A.K.Peters,Wellesley,MA,2008.
[2]陳超.用OpenGL生成三維投影模型的研究[J].電子商務(wù),2011(11):68-69.
[3]梁柳青.OpenGL中的投影變換[J].天津成人高等學(xué)校聯(lián)合學(xué)報(bào),2000,2(3):50-54.
[4]黃章進(jìn).高級計(jì)算機(jī)圖形學(xué)[Z].中國科學(xué)技術(shù)大學(xué)計(jì)算機(jī)學(xué)院,2008.
[5]SHREINER D,the Khronos OpenGL ARB Working Group.OpenGL programming guide[M].Seventh Edition.北京:機(jī)械工業(yè)出版社,2010.
[6]林炎光,孫紅勝,王志民.基于 FPGA的透視投影變換算法的設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2009,35(5):47-51.