??? 摘 要: 針對低端嵌入式設備運算速度較低,存儲空間較小且不支持通用3D圖形庫的局限性,通過分析常規(guī)3D渲染管線和算法,對次要功能實施裁減,設計出一個簡化的3D圖形庫。經(jīng)在低性能手機上測試,此方案渲染效果良好,切實可行。
??? 關鍵詞: 3D圖形庫;渲染管線;嵌入式設備
?
?? 隨著計算機硬件技術的迅速發(fā)展與圖形渲染技術的不斷革新,工業(yè)控制與消費電子領域的嵌入式設備都已經(jīng)引入了3D顯示的功能。嵌入式設備在具有體積小、功耗低、適應性強的優(yōu)勢的同時,也存在處理器運算速度低,存儲空間小等諸多局限性,而且部分低端設備并不支持通用的嵌入式3D圖形庫(如通用的OpenGL ES與手機平臺的Mobile 3D Graphics)。為了在此類設備上實現(xiàn)3D渲染與顯示,需要深入分析常規(guī)3D渲染管線的實現(xiàn)過程,在此基礎上去掉一些次要的效果或功能,最后設計簡化后的3D圖形庫。
??? 與2D圖形顯示相比,3D渲染更為形象更接近現(xiàn)實,因為后者加入了透視效果與光影效果。在有限的條件下,設備用戶往往對透視效果(如物體的縱深與遮擋)的需求遠遠大于光影效果(如光照與霧化處理)。因此,簡化后的3D圖形庫需要保留最基本的透視效果,而去除表現(xiàn)光影效果的相關功能。
1 3D渲染管線的裁減
??? 盡管3D渲染的具體流程隨圖形處理器與用戶需求的不同存在相當?shù)牟町?,但大體上都要經(jīng)過坐標變換、頂點與片段著色、光照計算、Alpha混合以及相關的剔除裁剪處理。OpenGL是目前應用最為廣泛的底層3D圖形庫,并已經(jīng)作為一個工業(yè)級的標準,它采用的渲染管線如圖1所示[1]。
?
1.1 頂點變換
??? 頂點變換的功能有:(1)頂點位置的坐標變換;(2)頂點光照的計算;(3)頂點紋理坐標的生成與變換。
??? OpenGL有2種坐標變換矩陣:透視變換矩陣與模型視圖變換矩陣,分別由2個獨立的堆棧維護[2]。由于3D坐標變換是用矩陣相乘完成的,其時間復雜度為O(n3)且參與運算的為浮點數(shù),開銷較大,所以將透視變換矩陣去掉,保留模型視圖變換矩陣。在模型視圖變換以后,對每個頂點P(x,y,z)進行以下處理,以模擬透視變換的縱深效果(距離越遠的物體顯示越小):
??? x=Kx×y/z? y=Ky×y/z
??? 式中,Kx、Ky是可調整的縮放參數(shù),可以根據(jù)顯示屏幕的長寬進行調整。
??? 根據(jù)前面的分析,直接去掉光照計算;保留紋理坐標的生成,去掉紋理坐標的變換(因為后者主要用于紋理動畫)。
1.2 圖元裝配
??? 這個階段需要計算片段在幀緩沖區(qū)的坐標以及對片段各點進行屬性插值。片段各頂點的原始坐標一般是浮點數(shù)表示的,而在幀緩沖區(qū)內(nèi),像素坐標是離散的整數(shù),這是由顯示設備光柵的物理構造決定的。對此可以簡單地通過將浮點坐標取整的方式獲得幀緩沖區(qū)坐標,下面主要討論插值算法。
??? 插值算法有很多種,常用的有線性插值、Hermite插值、最小曲率插值等,其中線性插值執(zhí)行效率最高,在精度要求較低的場合使用較為廣泛。
??? 在較高性能的系統(tǒng)中(如PC機),插值運算是由硬件(GPU)完成的,插值運算后還要經(jīng)過各種平滑濾波處理,速度快且效果好。而對于嵌入式設備,可以采用2次線性插值的方法來達到較為理想的效果:先由構成片段的頂點屬性(位置坐標、紋理坐標、顏色等)計算片段邊界線上各點的屬性值,同時用行掃描線算法得到片段覆蓋的有效區(qū)域內(nèi)每條掃描線的起止點坐標;再對每條掃描線起止點之間的各點進行屬性插值,最終計算出片段內(nèi)部所有點的屬性值。
??? 例如,由頂點P1(1,2,3)、P2(6,3,2)、P3(3,8,1)構成的片段,先計算片段邊界線上各點的坐標。以P1,P2為例,由于|x1-x2|>|y1-y2|,所以利用x坐標作參考量對y坐標與z坐標(即深度緩沖)進行插值,即:
??? y=y1+(x-x1)×(y2-y1)/(x2-x1)
??? z=z1+(x-x1)×(z2-z1)/(x2-x1),其中y1
??? 然后對每條掃描線2個邊界點之間的各點即片段內(nèi)部各點進行屬性插值,以第3條掃描線為例,它的起止點坐標為(2,4,2.333)與(5,4,1.8),計算得到其間2點坐標為(3,4,1.977)、(4,4,2.155)。整個運算過程如圖2所示。
??? 對片段內(nèi)部各像素點的紋理坐標和顏色進行插值的算法與此類似,其中顏色的插值又可以分為R、G、B 3個通道進行。
1.3 片段紋理映射與著色
??? 如果紋理映射未開啟或當前片段未綁定有效的紋理,那么上階段插值得到的片段各點顏色值就是片段著色的結果;否則還需要利用上階段插值得到的各點紋理坐標(通常稱為UV坐標)計算其顏色值,其計算公式可以簡單表示如下:
??? Color=tex[int(u×texWidth)][int(v×texHeight)]
??? 式中,tex是存儲紋理各像素顏色值的二維數(shù)組,因為0??? 這樣簡單處理可能會帶來一些問題,例如一個面積很大的片段在映射一片面積較小的紋理區(qū)域時,會造成紋理貼圖因放大明顯分辨率不足而出現(xiàn)格狀,而面積很小的片段在映射一片面積較大的紋理區(qū)域時,又會造成片段內(nèi)頂點紋理坐標不穩(wěn)定而出現(xiàn)畫面躁動。這些現(xiàn)象都會影響視覺效果。為此,OpenGL與Direct3D等通用3D圖形庫會根據(jù)實際情況采取一些修正措施。
1.4 光柵操作
??? 以上步驟已經(jīng)完成了像素的定位、頂點與片段的著色。在將這些信息發(fā)送到顯示屏幕之前,還要進行必要的測試,以剔除不需要渲染的像素,這些測試主要包含[3]:(1)坐標測試;(2)Alpha測試;(3)模板測試;(4)深度測試。
??? 坐標測試是將定位在顯示屏幕之外的點去掉,這一步驟是必須保留的;Alpha測試主要用于混色(blending)以達到一些特殊的半透明效果(如火焰),所以這一步驟應該去掉;模板測試主要用于制作鏤空、鏡面、陰影等效果,也應該去掉;深度測試用于決定各個頂點或物體之間的遮擋關系(x、y坐標相同的條件下,z坐標即深度值較小的頂點覆蓋z坐標較大的頂點),予以保留[4]。
??? 經(jīng)過裁減后的3D渲染流程如圖3所示。
1.5 硬件配置需求
??? 以顯示屏幕分辨率為200×200、像素顏色深度與深度緩存深度均為16位(2字節(jié))的手持設備為例,根據(jù)裁減以后的渲染管線,幀緩沖區(qū)由像素顏色緩存與深度緩存組成,需求為200×200×2×2=160 KB,加上正弦、余弦等函數(shù)表以及各類常數(shù)的存儲,設備的存儲空間至少要在200 KB以上。如果要渲染較為復雜的模型,由于紋理貼圖與骨骼動畫關鍵幀信息還需要更多的空間,則存儲空間須在1 MB以上,處理器頻率至少要在50 MHz以上。
2 軟件解決方案
2.1 3D模型數(shù)據(jù)結構的簡化
??? 當前3D模型在計算機中大多是用網(wǎng)格(mesh)表示與存儲的,而每個網(wǎng)格又由若干個三角形組成,同時每個三角形又由3個頂點(vertex)組成,頂點數(shù)據(jù)包含位置坐標、紋理坐標、頂點顏色等信息,這樣就構成了網(wǎng)格-三角形-頂點的三級結構。由于1個頂點會同時被幾個三角形包含,為了避免重復存儲,三角形并不存儲所含3個頂點的詳細信息,而僅僅存儲3個頂點的索引;而每個網(wǎng)格除了它所包含的三角形信息外還要存儲紋理貼圖,材質等多種信息,為了防止結構體過于龐大,一般不直接存放每個三角形的詳細信息而只存放三角形的索引[5]。
使用這樣的結構,每渲染1個頂點實際上只要經(jīng)過2層索引查找操作,因為網(wǎng)格含有的材質信息與三角形含有的法線向量數(shù)據(jù)(均用于光照計算)并不需要,所以將上述三級結構簡化為網(wǎng)格-頂點二級結構,如圖4所示。這樣既簡化了數(shù)據(jù)結構節(jié)省了存儲空間,又提高了編程效率。
2.2 浮點運算的模擬
??? 一些低端嵌入式設備(如基于ARM7的微控制器系統(tǒng)與CLDC1.0版本的手機)不支持浮點數(shù),而浮點運算貫穿于整個3D渲染過程,所以必須用定點數(shù)表示浮點數(shù)并模擬浮點運算。
??? 以long型(4個字節(jié))為例,可以劃分8位表示指數(shù),其余24位表示尾數(shù),每次運算以后都要進行規(guī)格化以便保存。這是IEEE的float型運算的軟件實現(xiàn),精度較高但需要耗費較多的時間。
??? 對此可采用另一種精度較低但更為快速的方法——小數(shù)掩碼法,即將定點數(shù)的最后若干位劃為小數(shù)位,每次乘法運算后將結果右移相應位數(shù),每次除法運算前將被除數(shù)左移相應位數(shù),而加減運算規(guī)則不變。小數(shù)位劃分越多運算結果越精確,反之可表示數(shù)的范圍越大。本文取8位作小數(shù)位,運算精度為1/28,可以滿足一般的要求,同時可以保證整數(shù)部分在進行乘法時不會越界,這是因為嵌入式設備顯示屏幕一般分辨率較小(長寬均小于28=256),而相乘后整數(shù)部分有效位不會超過16位,小數(shù)部分有效位也不會超過16位,運算結果用4字節(jié)32位的long型即可存儲。此外,小數(shù)掩碼法附加的運算都是移位運算,硬件執(zhí)行效率較高。
2.3 幀緩沖區(qū)的設計
??? 幀緩沖區(qū)是3D渲染過程的終點,由于不需要模板緩存與像素的Alpha值,這段區(qū)域僅由像素顏色緩存與深度緩存組成。
??? 像素的顏色格式有很多種,如RGB、ARGB、YUV等,PC機平臺常用的32位ARGB真彩色可以充分滿足人眼的視覺需求。但考慮到嵌入式設備存儲空間有限,故采用16位ARGB 1555加強色格式,每個像素占用16位2個字節(jié)的空間,RGB每個顏色通道各占用5位,另留1位作為Alpha標記,用于表示該像素是否透明,進而可以表現(xiàn)紋理貼圖邊緣的不規(guī)則形狀。
??? 深度緩存根據(jù)需要可以設置為16位、24位、32位等,在嵌入式設備上采用16位便可以滿足需求。如果設備不支持浮點數(shù),可以用小數(shù)掩碼法用短整數(shù)來表示,劃分低8位作小數(shù)位。
??? 本文從分析常規(guī)3D渲染管線出發(fā),結合低端嵌入式設備處理器運算速度較低,存儲器空間較小且不支持現(xiàn)有通用3D圖形庫的局限性,提出了一種經(jīng)過功能裁減后的渲染方案并計算所需的硬件最低配置需求,最終完成簡化3D圖形庫的設計。這種圖形庫去除的是一些需要耗費大量運算時間與存儲空間的光照、霧化、半透明、陰影、粒子等光影效果,而保存了3D圖形基本特征與透視效果,所以仍然能夠滿足設備用戶的一般視覺需求。此外,本文針對軟件設計中的幾個問題進行了討論,并給出了解決的方案。
參考文獻
[1] OpenGL Pipeline Overview[DB/OL]. http://www.lighthouse3d.com.
[2] Nehe, OpenGL Tutorials[DB/OL]. http://nehe.gamedev.net.
[3] OpenGL編程指南(第四版)[M].鄧鄭祥,譯.北京:人民郵電出版社,2005.
[4] 唐澤圣,周嘉玉,李新友.計算機圖形學基礎[M].北京: 清華大學出版社,1995.
[5] MILLER J R. Vector geometry for computer graphics[J]. Computer Graphics, 1999,19(3):66-73.