摘要:針對在動態圖形繪制基礎上進行圖像渲染的問題,基于Mac OS X操作系統的核心制圖與渲染技術,提出了重組OpenGL渲染流程實現加速圖形繪制與圖像渲染結合的管道化方法,目的是實現GPU完全承擔繪圖和渲染加速。整個流程無須CPU參與,在提高圖形子系統性能的同時優化了應用程序響應能力。
關鍵詞:圖形處理單元加速; 圖形繪制; 圖像渲染
中圖分類號:TP311.1文獻標志碼:A
文章編號:1001-3695(2008)05-1589-04
0引言
圖形圖像處理是多媒體應用的重點。目前,圖形圖像處理技術在硬件實現上通過CPU計算,在軟件實現上采用各種常規算法將像素單元視為標量數據進行串行運算。但傳統的方法,如文獻[1]提出的一種方法,處理效率較低,致使CPU高負荷運行并導致響應惡化,從性能和質量上均無法滿足高質量實時處理的要求。
GPU(graphics processing unit,圖形處理單元)是NVIDIA公司率先提出的概念。它是計算機體系結構中專門負責2D/3D圖形圖像處理的芯片。Apple公司研發的Mac計算機作為圖形圖像應用的專業平臺,其技術優勢在于能充分發揮GPU強大的數據流處理和高效的并行繪圖能力加速處理圖像。借助GPU實現的各種高級數學計算可在像素級別完成圖像處理工作,滿足操作實時互動響應的同時釋放CPU負擔,使CPU在相同時間內執行更多通用程序控制,包括如下應用:
a)圖像處理。使用GPU硬件著色渲染引擎可為圖像添加模糊化、顏色校正、抗失真和反走樣、邊緣銳化、定制風格化、幾何扭曲、圖元生成等高級特效。
b)視頻流服務。將CPU多媒體指令和GPU渲染管線相結合,打開視頻流和像素處理的高速接口。通過硬件加速視頻處理,高度優化視頻展示體驗的同時提升性能。
c)科學計算可視化?;贑PU和GPU明確任務分工實現的科學計算實時可視化。CPU處理得到的數據直接輸出到GPU繪圖渲染核心,渲染繪制后輸出到屏幕。在不損失CPU性能的前提下獲得對當前處理結果的動態觀測。在天氣預報、電子軌道計算、地球磁場模擬、核實驗、DNA分子排布、蛋白質折疊等大規??茖W計算任務扮演重要角色。
基于Mac OS X Tiger的圖形繪制和圖像渲染技術,本文提出一種通過重新組織OpenGL指令流程,搭建高速特效渲染通道的解決方案:使用OpenGL硬件加速的繪圖引擎繪制圖形,采用基于濾鏡層迭代的特效引擎渲染圖像。該方案降低了處理流程對CPU資源的占用,提高了圖形子系統的效率,實現了借由GPU加速的繪圖和特效渲染。
1技術背景
Mac OS X Tiger操作系統為圖形圖像處理提供系統內嵌處理引擎支持,同時對開發人員開放相應的編程框架支持。本文討論了通過調用系統相關編程接口搭建定制處理流程的方法。
1.1開發框架
Cocoa是Mac OS X應用程序開發框架代號。它使用面向對象技術,封裝全部系統核心架構技術的實現,為應用程序開發提供完整可靠,可擴展可維護的接口。本文的測試程序在Cocoa框架內實現。
1.2圖形繪制系統
Mac OS X核心構架圖形子系統部分代號為Quartz。Quartz負責Mac OS X GUI繪圖的核心任務,它由用于繪圖的Quartz 2D和用于合成最終屏幕輸出的Quartz Compositor組成。
Quartz基于工業標準圖形庫OpenGL操縱GPU,使用OpenGL紋理渲染技術將輸出至屏幕的圖形元素合成基于PDF為成像模型基礎的PostScript文本,提供鋸齒平滑和高范圍縮放等高級圖形渲染能力。Mac OS X v10.4 Tiger將Quartz技術升級為Quartz Extreme:Quartz 2D和Quartz Compositor均通過OpenGL獲得硬件加速支持:Quartz 2D和Quartz Compositor只保留 PostScript繪圖指令,將需要組合的不同窗口繪制結果作為圖像紋理交付GPU 2D繪圖單元加速,在幀緩沖區合成最終屏幕視圖輸出到監視器,實現了完全借助GPU加速在圖形加速卡中合成屏幕輸出。
1.3圖像特效引擎
在原有圖形架構基礎上,Mac OS X v10.4 Tiger引入使用Core Image Kernel Language語言構建的圖像特效渲染引擎Core Image。其利用GPU像素著色器處理平面像素變換,實現像素級別的高速變換與高精度浮點數據處理。通過可編程GPU消除渲染時間延遲,利用GPU矢量引擎和超標量流水線優化CPU與GPU之間的數據通路。
Mac OS X v10.4 Tiger實現從圖形繪制和特效渲染的全面硬件加速;Quartz Extreme利用硬件合成圖像,Core Image通過硬件加速圖形特效。雖然兩者是系統核心構架相互獨立的模塊,但它們都是基于OpenGL技術構建,通過重組OpenGL渲染流程將兩者整合是可行的。本文基于該思路探索了在兩套框架范圍內重組繪圖和渲染流程的可行性和實用性方法。
本文提出的方法包括幾個關鍵步驟:
a)執行OpenGL繪圖指令獲取繪制完畢的圖像紋理;
b)把圖像紋理作為輸入源導入特效引擎進行渲染處理;
c)將處理后的圖像通過OpenGL加速繪制輸出。
2圖像源生成方法
本文以基于OpenGL繪圖指令合成的可視化動畫生成工具Quartz Composer創作素材,它借助Quartz 2D、OpenGL、Core Video等技術合成豐富多彩的視覺特效,將OpenGL繪圖指令組合成.qtz格式的文件導出。本文實驗中以該類型文件作為繪圖指令源繪制圖形。
2.1使用基于Core Video的QuickTime引擎
Core Video是基于OpenGL紋理擴展的視頻流模型,它從CPU導入解碼后的視頻數據流生成OpenGL紋理對象,交付GPU繪制輸出。基于Core Video框架的QuickTime引擎是Apple 公司提供的系統級代碼壓縮包。QuickTime內嵌對Quartz Composer的支持組件,通過Core Video直接解碼Quartz繪圖指令。由此本文采用QuickTime實現接口QTMovie類作為.qtz格式繪圖指令封裝容器,使用GPU解碼執行OpenGL繪圖指令。其處理流程如圖1所示。
以下步驟完成對Core Video引擎參數的初始化過程:
a)QTMovie實例要求配置視覺上下文。視覺上下文是抽象繪圖空間,指示OpenGL紋理的繪制輸出目標。視覺上下文可以是OpenGL上下文,或與其他可輸出的圖形數據源共享繪圖空間。為了使用OpenGL驅動提供的硬件加速,筆者將視覺上下文綁定到OpenGL上下文,以OpenGL緩沖區為媒介開辟GPU和幀緩沖區的管道。
b)Core Video基于流媒體技術,解碼核心利用可用的處理資源不斷輸出OpenGL紋理流,填滿顯示緩沖區后輸出到監視器。為了同步播放數據流并防止過量數據溢出顯示緩沖區,本文使用顯示鏈接回調函數控制視覺上下文,該函數是以線程形態運行的高優先級定時器。本文借由定制回調函數代碼同步Core Video處理核心與顯示緩沖區的數據流,協調安全線程調度,以保證在監視器上輸出穩定連續的有效視頻幀;同時在處理線程中施加臨界鎖保護緩沖區分配和回收正常進行,得到可用的OpenGL紋理對象。
c)Core Video引擎默認監視器為視覺上下文,OpenGL紋理流輸出到監視器后即被銷毀,而筆者需要保留其輸出的幀紋理對象進行下一步操作。為此創建離線OpenGL緩沖區代替默認視覺上下文,收集繪制完畢的幀紋理。Core Video使用的 OpenGL 緩沖區和OpenGL紋理基于Apple OpenGL擴展,專門針對動態視頻流進行優化,用于在圖形加速卡的幀緩沖區中保存視頻流對應的OpenGL紋理源。一塊OpenGL緩沖區對象對應一幅幀數據,其不可復用,對每幀都要生成一塊OpenGL緩沖區。為進一步優化性能,本文使用OpenGL緩沖區收集池動態分配緩沖區,同時將OpenGL緩沖區收集池附加到Core Vi-deo引擎視覺上下文,Core Video引擎即以OpenGL緩沖區收集池為默認輸出對象。當幀紋理繪制完畢后即可從OpenGL緩沖區收集池獲得有效的紋理對象。緩沖區收集池用更新的幀數據替換過時的幀數據,避免在存儲區域重復開辟緩沖區,極大節約了系統處理資源。
2.2使用QCRenderer類執行繪圖指令
QCRenderer類是系統內嵌執行.qtz格式繪圖指令的原生類接口,也通過OpenGL加速。與基于數據流解碼模型的Core Video引擎不同,它將.qtz格式繪圖指令還原為原始OpenGL圖元繪制指令。具體處理流程如下:
a)QCRenderer類提供了從指定繪圖空間實例化自身的方法。繪圖空間本質是OpenGL上下文,通過將.qtz文件路徑作為QCRenderer類的實例化參數,建立.qtz繪圖命令和OpenGL上下文輸出目標的關聯。
b)依據統一OpenGL像素格式創建OpenGL上下文及相應像素緩沖區。OpenGL上下文指明了繪圖區域框架,繪制完畢的幀紋理在緩沖區刷新指令到來后被更新。為保留.qtz繪圖命令輸出的幀紋理,本文將像素緩沖區和QCRenderer實例對應的OpenGL上下文相關聯,使用相同像素格式保證紋理形式一致性;同時指定紋理源為與之關聯的OpenGL像素緩沖區,目的是為了從像素緩沖區中獲得繪制完畢的幀對象。
c)在當前OpenGL上下文生成紋理。在獲得可用的紋理前需要對紋理屬性進行調整。輸出到像素緩沖區的紋理是2D矩形紋理,于是將OpenGL紋理綁定到矩形紋理擴展。qtz格式繪圖命令與分辨率無關,而OpenGL紋理有嚴格的尺寸限制,當紋理對象超出預置像素尺寸范圍時,為避免分辨率因素造成紋理破碎現象,筆者指定使用紋理重復模式填滿每個像素點,同時指定紋理縮放方式為線性濾波,最大限度防止失真。
經過上述步驟,筆者在緩沖區中獲得可用的OpenGL紋理對象。
2.3基于線程調度的實時制圖方法
為增強圖形繪制子系統性能,提高應用程序響應能力和交互性,本文從主進程中分離出繪圖線程對其進行實時控制:
a)為主進程分離出的繪圖線程分配資源回收池。在分離線程中進行離線OpenGL繪圖操作涉及到對緩沖區的分配和回收。由于OpenGL非線程安全,該方法使用Cocoa框架實現的對線程資源分配機制,通過聲明自釋放回收池(autorelease pool)統一收集可用緩沖區空間,線程委托自釋放回收池向操作系統索取緩沖區。自釋放回收池在線程周期結束時接管資源進行必要的更新操作,準備下一次分配。
b)啟動線程循環,使用定時器在指定時間觸發線程執行。線程默認在執行一次主體代碼后即被銷毀,這樣無法達到實時繪圖的效果。筆者在線程代碼中實例化定時器對象,設置觸發間隔,把線程代碼選擇器(selector)連接到定時器對象,以循環模式調度線程執行。
c)分離線程被調度執行后,QCRenderer實例解釋.qtz格式繪圖命令,在OpenGL命令列表中展開繪圖指令提交硬件驅動層加速。繪圖完畢后更新OpenGL上下文,通知OpenGL驅動程序將繪圖結果輸出到幀緩沖區。
3鏈式迭代的特效疊加方法——核心濾鏡引擎
本章主要解說Core Image圖像特效渲染引擎的工作原理。Core Image引擎的圖像原語表示CIImage類是對圖像數據的引用,附帶圖像數據操作和生成輸出圖像所需的信息。它提供從OpenGL紋理實例化自身的方法,本質是創建指向OpenGL紋理的指針表示。使用平面紋理表示指針實例化CIImage對象避免大量紋理數據從圖形加速卡與主機之間的傳輸,是快速高效的方法。
Core Filter類是Core Image特效渲染引擎的核心,是抽象濾鏡的通用表示,其實例化方法通過指定濾鏡名稱關聯相應的濾鏡特效。在指定特效濾鏡后,引擎輸入接口獲得CIImage實例為變換源,處理核心執行特效渲染,引擎輸出接口導出結果CIImage實例。Core Image引擎采用插件方式管理Core Filter框架,提供了高度可擴展性。開發人員可以通過Core Image核心語言為該特效引擎編寫定制濾鏡,為此該框架保留了濾鏡插件編目列表。在初始化Core Image引擎時導入該列表,選擇編目名和濾鏡名實例化Core Filter對象。
Core Filter采樣器通過規定ROI,在指定邊界內采集像素點輸入求值內核作為數據源,避免對不相關像素進行操作;同時其使用延遲賦值技術,僅當要求輸出時才發射像素著色指令到GPU,可以極大降低對處理資源的占用和對存儲空間的消耗。
在此基礎上,筆者借助Core Image引擎的上述技術特性構建濾鏡鏈。輸入圖像在經過一系列濾鏡特效疊加后產生輸出圖像,延遲賦值技術通過評估顯示列表中對ROI重疊區域內相同像素點的操作,復合對同一像素的全部操作,實現濾鏡渲染特效的疊加。在對輸入圖像疊加任意數目的濾鏡特效時,只需第一次計算出像素分量的級連變換,即可將多層濾鏡壓縮為單一濾鏡,極大地提高系統的處理效率。其具體處理流程如圖2所示。
Core Filter提供了調節特效的必要接口,其內核單元開放特定參數為外部代碼可見的端口供應用程序訪問。輸入圖像源亦是內核單元的一個參數,本文把CIImage實例指針作為參數傳遞給內核單元的像素采樣器;為搭建特效濾鏡鏈,使用數組結構NSArray類管理濾鏡組。它擁有聚集抽象成員能力,接受抽象類型參數并以hash表散列地址管理成員,適合應用在該場合中聚積同類對象。把目標濾鏡特效指針表示插入NSArray實例中,設置相關參數并提供輸入圖像源。Core Image引擎載入濾鏡鏈并跟蹤記錄像素著色操作,獲得第一次渲染輸出圖像后,Core Image引擎完成對濾鏡鏈的迭代操作,對往后輸入的任何圖像像素均執行一次快速變換。
4基于OpenGL加速圖像輸出方法
經過Core Image特效處理,筆者得到以CIImage實例表示的渲染特效圖像。為了通過硬件加速將其輸出,本文提出的解決方案是調用Quartz 2D繪制處理后的圖像到監視器。
Core Image引擎使用CIContext類為CIImage實例的輸出目標。CIContext類擁有通過OpenGL加速呈現CIImage實例到指定繪圖上下文的能力,只要為其指定具體的屏幕觀察視口即可。本文使用基于OpenGL加速的NSOpenGLView類作為CIContext類的支持視口。它是基礎視圖類的派生子類,維護自身OpenGL像素格式和上下文,通過設置視口觀察呈現到對應OpenGL上下文中的內容。
CIContext類提供由指定的OpenGL上下文實例化自身方法。通過使用NSOpenGLView實例的OpenGL上下文初始化CIContext對象,把CIImage實例輸出目標綁定到NSOpenGLView。當該圖像實例繪制到CIContext時,OpenGL渲染引擎自動將輸入圖像還原為OpenGL紋理,執行坐標變換后呈現到NSOpenGLView對應的監視器區域。該過程由OpenGL驅動提交圖形硬件加速。由于CIImage實例是在坐標無關的離線緩沖區中生成,而NSOpenGLView類根據規格坐標系裁剪OpenGL場景,故實例化CIContext對象后,要將圖像坐標變換到窗口坐標,設置觀察矩陣為場景增加透視,保證觀察到正確結果。
至此,筆者使用完全OpenGL加速從圖形繪制到圖像處理的全部操作。應用程序流程如圖3所示。
5運行效果與性能監測分析
實驗平臺所用的計算機型號為Mac Pro:Intel Xeon 5100處理器,1GB DDR2 ECC內存,Mac OS X v10.4.9 Tiger操作系統。圖形加速卡為NVIDIA GeForce 7300 GT 256MB GDDR2 SDRAM。OpenGL引擎使用NVIDIA OpenGL硬件擴展和Apple OpenGL軟件實現。
實驗程序基于Cocoa,使用Objective-C語言編寫。使用Mac OS X Tiger提供的OpenGL和QuartzCore框架編程接口,在Xcode 2.4開發環境下進行程序的編譯及執行。使用Xcode調試工具箱中的圖形系統性能監測工具OpenGL Driver Monitor和分析工具OpenGL Profiler跟蹤程序流程,對圖形加速卡工作狀態進行實時采樣。
本文使用Xcode SDK附帶的.qtz示例文件作為演示素材:載入.qtz文件,通過上文論述的方法得到以OpenGL紋理表示的處理圖像源,進行特效渲染后輸出到屏幕。圖4(a)是使用GlassDistortion、GaussianGradient、TwirlDistortion濾鏡疊加對Cube Replicator.qtz文件進行特效渲染的截圖;(b)是使用Crystallize、BumpDistortion、Bloom濾鏡疊加對Cell.qtz文件進行特效渲染的截圖。
為了考察本文提出的基于OpenGL加速的圖像特效方法的性能,本文使用OpenGL Driver Monitor工具通過硬件驅動層測試OpenGL渲染流程,監視圖形加速卡的GPU和顯示緩沖區的工作參數。圖5說明基于延遲賦值和ROI采樣的濾鏡鏈僅在刷新緩沖區時交付GPU像素作色器計算,在處理時間上出現峰值。Core Image引擎在峰值前沿對圖像源采樣輸入處理內核,像素作色器在峰值后沿對像素處理后輸出到緩沖區。OpenGL緩沖區直接接收GPU處理輸出的紋理數據,添加線程鎖保護臨界區后,周期寬度和GPU處理周期寬度相等。為了驗證在繪圖和渲染過程中完全由GPU加速,CPU僅處理必要的應用程序控制,本文使用OpenGL Profiler工具解析OpenGL緩沖區參數。表1參數含義表示OpenGL緩沖區等待輸入由CPU處理完畢的紋理數據,由于GPU完全加速紋理繪制過程,圖像數據直接通過CPU轉交給GPU處理后輸出到緩沖區,因此OpenGL驅動層檢測到的紋理等待時間為0。表2參數表示常規處理流程中由CPU處理紋理時操作系統為避免線程沖突對紋理對象施加臨界鎖的等待時間。由于OpenGL繪圖命令均由GPU加速,不依賴CPU渲染紋理對象,不存在線程鎖調度的問題,故檢測到的臨界鎖等待時間為0。
為了分析應用程序運行過程的OpenGL代碼執行時間,筆者使用OpenGL Driver Monitor工具統計OpenGL硬件驅動指令與CPU指令對圖形加速卡的使用情況,分別如表3、4所示。
表3和4說明程序運行時絕大部分時間在調用OpenGL命令,由GPU處理。相對而言,CPU處理的應用程序通用控制指令僅占極小部分。
實驗數據說明在本文提出的處理流程中,GPU承擔繪圖和特效渲染任務,生成的OpenGL紋理對象在顯示緩沖區和GPU計算單元中直接交換數據,CPU僅進行必要的應用程序控制。
6結束語
本文針對Mac OS X平臺實時圖形渲染任務中如何充分利用GPU加速圖形繪制和圖像渲染作了探索,提出了重組OpenGL渲染流程的方法。實驗中,筆者在2 560×1 440的分辨率下可以獲得60 fps+的渲染幀率,同時CPU使用率控制在20%以下。實驗結果充分說明本文提出的方法實現了完全的GPU加速,CPU僅用于必要的程序控制而不參與渲染過程,為OpenGL圖形繪制系統和圖像特效渲染系統的結合提供了一個有效的解決方案。當處理數據量增大時,從OpenGL緩沖區到圖形處理單元點對點的數據通路可以有效地避開CPU和主存之間的帶寬瓶頸,具有更大的性能優勢,同時充分發揮GPU在圖形數據處理方面的特長可更進一步優化性能。
參考文獻:
[1]NILSSON P.Hardware accelerated image compositing using OpenGL[C]//Proc of Usenix’04 Annual Technical Conference.Santiago:Freenix Track,2004.
[2]NVIDIA Inc. NVIDIA OpenGL extension specifications [EB/OL].http://developer.nvidia.com/object/nvidia_opengl_specs.html.
[3]Apple Inc. Apple OpenGL extensions specification[EB/OL].http://developer.apple.com/graphicsimaging/opengl/extensions.html.
[4]GELPHMAN D, LADEN B.Programming with Quartz: 2D and PDF graphics in Mac OS X[M].San Francisco:Morgan Kaufmann Publi-sher,2005.
[5]DALRYMPLE M, HILLEGASS A. Advanced Mac OS X programming[M].2nd ed.[S.l.]:Big Nerd Ranch Publisher,2005.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”