OpenVG是一種應(yīng)用程式介面(API),系由Khronos Group所研制,用來(lái)顯示向量化格式及點(diǎn)陣影像,并以硬體加速方式操作。
OpenVG處理兩種主要的上層物件。首先是點(diǎn)陣圖,這是一種記憶體架構(gòu),用來(lái)儲(chǔ)存/繪制影像。每個(gè)x和y座標(biāo)都對(duì)應(yīng)到一個(gè)畫(huà)素;而每個(gè)畫(huà)素都擁有一個(gè)
另一種則是向量格式。向量是一種以起點(diǎn)和終點(diǎn)來(lái)描述的數(shù)學(xué)算式,根據(jù)各點(diǎn)互連方式,可能還須要加上其他如曲線控制點(diǎn)、弧線半徑、弧度之類的參數(shù)。這種特性讓向量非常適于延展,因?yàn)樗⒉豁氁棵恳粋€(gè)畫(huà)素的資料來(lái)呈現(xiàn)影像。
圖1所描繪的是兩個(gè)原本在一般大小時(shí)看似無(wú)異的圓圈,隨著畫(huà)面放大,點(diǎn)陣圖逐漸失真,但向量影像卻仍能保持滑順而清晰的輪廓。
圖1 向量與點(diǎn)陣圖比較
向量并不一定在所有場(chǎng)合都勝過(guò)點(diǎn)陣圖。點(diǎn)陣圖在固定大小時(shí)比較清晰,但是在放大后就會(huì)變得失真。點(diǎn)陣圖處理起來(lái)較快,但是較耗費(fèi)記憶體。向量則可以在任何縮放尺寸下保有影像畫(huà)質(zhì),耗費(fèi)記憶體也較少。向量影像只能以向量設(shè)計(jì)工具繪制,點(diǎn)陣圖則可以來(lái)自相片、任何影像源,或制圖工具。
OpenVG繪圖效能更出色
理想的OpenVG管線(Pipeline)包括一套八段式的程序。雖然不是所有的實(shí)作手段都確實(shí)按照這套理想的管線,然而實(shí)作的成果卻都應(yīng)根據(jù)Khronos所定義測(cè)試程序,以確保一定的容錯(cuò)程度。其程序分別為:路徑定義與API參數(shù)的設(shè)定;筆劃;轉(zhuǎn)換;畫(huà)素轉(zhuǎn)換;修剪與遮蔽;著色;影像內(nèi)插;色彩轉(zhuǎn)換;混合及防止失真。
以全球衛(wèi)星導(dǎo)航(GPS)地圖來(lái)說(shuō),要呈現(xiàn)可任意縮放的地圖,標(biāo)準(zhǔn)方式就是透過(guò)向量。線上有很多種免費(fèi)的地圖軟體工具,大多數(shù)都允許使用者將地圖匯出為SVG檔案,這個(gè)檔案須再解譯,并轉(zhuǎn)換為OpenVG一般的架構(gòu),才能繼續(xù)使用。
此外,以O(shè)penVG加速過(guò)的使用介面,可以產(chǎn)生出流暢、易于延伸的人機(jī)介面(HMI),并提供一套完整的動(dòng)態(tài)字型繪制引擎,具備各種混合及繪制功能。
OpenGL可以完成多項(xiàng)繪圖作業(yè),例如字型、2D GUI及HMI等等;而其最大的優(yōu)點(diǎn)為處理多邊形及紋路。OpenGL是點(diǎn)陣圖導(dǎo)向,因此即使是以強(qiáng)大的OpenGL核心做簡(jiǎn)易的繪圖,也須耗費(fèi)寶貴的時(shí)間。
OpenVG補(bǔ)足了繪圖的需求。它本身就是絕佳的應(yīng)用,如果配合OpenGL,就能同時(shí)管理字型、向量及大部分的2D和虛擬3D組件,讓OpenGL核心把時(shí)間用在它最擅長(zhǎng)的項(xiàng)目上。
即使單獨(dú)使用OpenVG時(shí),也僅需少量電流及耗用記憶體,便可完成多項(xiàng)作業(yè)。若配合OpenGL使用,OpenVG便可轉(zhuǎn)而管理OpenGL核心并不擅長(zhǎng)的作業(yè)。
點(diǎn)陣影像繪制范例
以O(shè)penVG處理影像相當(dāng)簡(jiǎn)易,按照以下步驟即可在所需的表面上繪制影像:
?。?.宣告一個(gè)VGImage物件。
?。?.產(chǎn)生一個(gè)VGImage,并為VGImage物件指定處理程式。
?。?.以點(diǎn)陣圖資料填滿影像。
?。?.為VG_MATRIX_IMAGE_USER_TO_SURFACE設(shè)定矩陣模式,以便轉(zhuǎn)換影像(3×3仿射轉(zhuǎn)換)。
?。?.繪制影像。
對(duì)虛擬程式碼亦采取相同步驟:
?。?.VGImage ovgarticle_image
?。?.ovgarticle_image=vgCreateImage (VGImageFormat format, VGint width, VGint height, VGbitfield allowedQuality)
?。?.vgImageSubData(VGImage image, const void data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height)
.4.vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
?。?.vgDrawImage(ovgarticle_image)
要進(jìn)行這種操作,必須了解若干點(diǎn)陣圖特性,例如Stride、位元深度及設(shè)置混色之類的API屬性。
[@B]向量路徑加速圖形繪制[@C] 向量路徑加速圖形繪制
路徑構(gòu)成了向量加速繪圖的核心(圖2)。要完全掌握這個(gè)概念,必須了解以下觀點(diǎn):
圖2 向量路徑示意圖
?。?.路徑:是一連串以段落串連起來(lái)的點(diǎn)。
?。?.點(diǎn):座標(biāo)值。
.3.段落:兩點(diǎn)之間的運(yùn)算型態(tài),有時(shí)需要很多個(gè)點(diǎn)才能形成段落的控制值。
在此用一個(gè)簡(jiǎn)單的三角路徑來(lái)說(shuō)明。首先,須定義構(gòu)成整個(gè)路徑的段落。構(gòu)成路徑的段落則須以一連串的指令來(lái)描述,并以位元組陣列的方式儲(chǔ)存。每個(gè)指令都會(huì)消耗一個(gè)或多個(gè)點(diǎn)。
復(fù)雜的路徑甚至須要?jiǎng)佑玫交【€和Bezier曲線的概念,在OpenVG里產(chǎn)生并繪制一個(gè)路徑的步驟包括:
?。?.宣告一個(gè)VGPath物件。
?。?.宣告一個(gè)區(qū)段和點(diǎn)陣列。
?。?.產(chǎn)生一個(gè)空的路徑,以便接收段落資料(vgCreatePath)。
?。?.將
?。?.繪出路徑(vgDrawPath)。
Cover Flow動(dòng)畫(huà)范例說(shuō)明
最常見(jiàn)但也最為人所注目的動(dòng)畫(huà),就是2D視角轉(zhuǎn)換,經(jīng)常用來(lái)呈現(xiàn)音響播放裝置的唱片封面。這種動(dòng)畫(huà)會(huì)讓人覺(jué)得影像在3D空間中沿著x、y及z軸移動(dòng)或旋轉(zhuǎn)。
這種轉(zhuǎn)換并非真正透過(guò)3D繪圖處理器(GPU)或3D處理引擎來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果,而是先在2D空間中定義,再由OpenVG提供必要的API來(lái)達(dá)到動(dòng)畫(huà)效果。
在數(shù)學(xué)觀念里,這種效果稱為「3D投射」,事實(shí)上是將一連串的3D點(diǎn)集合對(duì)應(yīng)到一個(gè)2D平面上。觀念本身很簡(jiǎn)單。試想一下,有一個(gè)平坦、方形的物體,譬如一片紙或是一張圖,你可以將這張圖放在面前,讓它看起來(lái)是矩形。如果你把紙張挪近些,紙張看起來(lái)就會(huì)變大,如果移遠(yuǎn)些,又會(huì)變小。接著嘗試順著垂直軸轉(zhuǎn)動(dòng)一下,結(jié)果當(dāng)然看起來(lái)就不再是矩形。它會(huì)出現(xiàn)一些銳角,因此外觀上會(huì)像是菱形,甚至?xí)且恢本€。這就是3D物體將自身的每個(gè)點(diǎn)投影在你眼中的結(jié)果。
在繪圖技術(shù)里,空間影像處理終究不脫陣列型態(tài)的演算。要展開(kāi)陣列,你必須以陣列與影像相乘。如果要簡(jiǎn)化影像轉(zhuǎn)換,也要仰賴陣列乘法。要產(chǎn)生一個(gè)Cover Flow動(dòng)畫(huà),也必須要用到陣列。在OpenVG里,所有的空間處理都要以陣列變換為之。
設(shè)計(jì)關(guān)鍵就在于如何得出所需的「透視陣列(Perspective Matrix)」,以便得到3D的效果。這須要用到一些數(shù)學(xué)演算。在OpenVG API里也有提供其他設(shè)備,可計(jì)算出產(chǎn)生透視轉(zhuǎn)換所需的陣列。
這些OpenVG API的工具函數(shù)可協(xié)助你計(jì)算出透視轉(zhuǎn)換的陣列,不論是四邊形轉(zhuǎn)換為四邊形,還是把矩形影像轉(zhuǎn)換為給定的四邊形,甚至反向而行。如此一來(lái)你就可以將影像中任意一點(diǎn)移動(dòng)到任何想要的位置。在執(zhí)行Cover Flow動(dòng)畫(huà)時(shí),只須透過(guò)這些函數(shù),就可以簡(jiǎn)化演算。
此外,OpenVG里一共有兩種字型:點(diǎn)陣和向量(表1)。這兩種字型OpenVG API都有辦法處理,也有函數(shù)可以定義和登錄字型(vgCreateFont)。一旦完成,就可以透過(guò)vgDrawGlyphs函數(shù)輕松使用字型。
一旦考量到這些資訊,程式設(shè)計(jì)師就必須決定要在應(yīng)用中采用何種字型。通常視不同的繪圖需求,可以混用兩種字型。舉例來(lái)說(shuō),可縮放的文字就要用向量字型,而大小固定不變的字型,例如按鍵標(biāo)示,就可以改用點(diǎn)陣字型。
OpenVG加速動(dòng)畫(huà)效果制作
OpenVG的主要優(yōu)勢(shì),就是可以用既有API輕松做出動(dòng)畫(huà)效果。一旦你有了可以繪制的EGL表面,只需要幾行指令就可以讓影像帶到幕前,再加幾行就可以令它動(dòng)起來(lái)。
以汽車(chē)應(yīng)用為例,最常見(jiàn)的需求之一就是要做出生動(dòng)逼真的指針或儀表。直覺(jué)化的OpenVG運(yùn)算可以用最高的畫(huà)面刷新速率(如60fps)做到這一點(diǎn)。
此外,也可以透過(guò)常見(jiàn)的轉(zhuǎn)換來(lái)達(dá)成延展之類的轉(zhuǎn)換效果。延展不僅可以放大或縮小整體外型,也可以沿著個(gè)別的x軸和y軸進(jìn)行。再以指針動(dòng)畫(huà)為例,通常指針并不會(huì)越過(guò)儀表板的藍(lán)色邊框,只會(huì)淡入或淡出。
反射則是另一種驚人的效果,同樣可以用OpenVG輕松做到。只要對(duì)水平影像做一點(diǎn)通透的光滑表面效果,就可以達(dá)到反射的效果。既定函數(shù)可以反轉(zhuǎn)出一個(gè)原本不存在的影像。
目前已有廠商研制出完全采用向量導(dǎo)向的車(chē)用儀表板。在圖3兩個(gè)展示版本當(dāng)中,車(chē)速表是以大字型展示速度資訊,亦即在將現(xiàn)有字型畫(huà)在表面之前,還要先做放大處理。OpenGL都不見(jiàn)得有這種功力。
圖3 以O(shè)penVG開(kāi)發(fā)之向量車(chē)用儀表板示意圖
此外,業(yè)者還研制了簡(jiǎn)易的動(dòng)畫(huà)引擎,以便處理延展、旋轉(zhuǎn)及轉(zhuǎn)換。透過(guò)這種繪圖引擎,儀表板上的每種路徑及點(diǎn)陣影像都可以輕易動(dòng)畫(huà)化。 至于像是GPS逐步轉(zhuǎn)向?qū)Ш街惖膹?fù)雜動(dòng)畫(huà),也可以透過(guò)vgInterpolatePath函數(shù)輕易完成。
此種函數(shù)可以接收起始及結(jié)束路徑(具備類似段落)、終點(diǎn)路徑及你想要加入的內(nèi)插量。終點(diǎn)路徑資料會(huì)根據(jù)選定的數(shù)量,以內(nèi)插方式植入至起點(diǎn)和終點(diǎn)之間。如此一來(lái),僅須定義兩個(gè)路徑狀態(tài),便可產(chǎn)生出復(fù)雜的路徑轉(zhuǎn)換。
(本文作者皆任職于飛思卡爾)
關(guān)注我們
公眾號(hào):china_tp
微信名稱:亞威資訊
顯示行業(yè)頂級(jí)新媒體
掃一掃即可關(guān)注我們