本發(fā)明涉及一種基于opengl-es的數(shù)字儀表盤繪制方法,屬于圖像實(shí)時(shí)顯示
技術(shù)領(lǐng)域:
。
背景技術(shù):
:目前航空、汽車駕駛中的人機(jī)交互技術(shù)迅速發(fā)展,智能化程度越來越高,視頻、雷達(dá)傳感器也越來越多,飛行器或者汽車有了更多、更復(fù)雜的狀態(tài),使用傳統(tǒng)的機(jī)械儀表難以在有限的空間內(nèi)顯示這些信息,因此數(shù)字儀表盤是駕駛技術(shù)的的發(fā)展趨勢(shì)。gpu(圖形處理單元)具有很強(qiáng)的圖像處理、并行運(yùn)算的能力,目前在手機(jī)、機(jī)頂盒、平板電腦等手持設(shè)備中非常普及,并運(yùn)用在更多涉及移動(dòng)計(jì)算的場(chǎng)合。android較新的版本默認(rèn)運(yùn)行的硬件包含有g(shù)pu,用于加速和顯示相關(guān)的大多數(shù)任務(wù)。opengl-es是免授權(quán)費(fèi)的,跨平臺(tái)的,功能完善的2d和3d圖形應(yīng)用程序接口api,主要針對(duì)多種嵌入式系統(tǒng)專門設(shè)計(jì)。它由精心定義的桌面opengl子集組成。opengl-es是利用gpu強(qiáng)大計(jì)算、渲染能力的編程標(biāo)準(zhǔn),基于shader的編程方式在最新的opengl-es2.0及以上支持,能夠更靈活地實(shí)現(xiàn)渲染的管線。雖然opengl-es和gpu針對(duì)圖形圖像渲染而設(shè)計(jì),提供了完備的api,但是針對(duì)儀表盤繪制這樣的應(yīng)用目前還沒有直接的實(shí)現(xiàn)方法。一是opengl-es不直接支持矢量的繪制,二是不支持特定字體,比如漢字等字符的高效繪制,三是繪制的線條或者圖形邊緣有明顯的鋸齒,目前的抗鋸齒算法運(yùn)算量大,效率低,不適合實(shí)時(shí)性要求較高的儀表盤繪制,四是目前的渲染流程只支持渲染過程中的處理,但不直接支持對(duì)渲染完成后的延遲處理,如基于統(tǒng)計(jì)的亮度、對(duì)比度調(diào)整、變形處理等。技術(shù)實(shí)現(xiàn)要素:本發(fā)明的目的是提供一種基于opengl-es的數(shù)字儀表盤繪制方法,以解決目前在opengl-es的數(shù)字儀表盤繪制過程中所采用的抗鋸齒算法運(yùn)算量大,效率低,不適合實(shí)時(shí)性要求較高的儀表盤繪制的問題。本發(fā)明為解決上述技術(shù)問題而提供一種基于opengl-es的數(shù)字儀表盤繪制方法,該方法采用反走樣進(jìn)行數(shù)字儀表盤的線條繪制,將opengl-es繪制的線條按照從邊緣到中心拆分為至少兩個(gè)三角形,并對(duì)三角形頂點(diǎn)賦予不同的透明度,以實(shí)現(xiàn)繪制結(jié)果中線條顏色和背景顏色的平滑融合。該方法采用truetype字體進(jìn)行數(shù)字儀表盤的字符繪制,使用矢量繪制工具加載truetype字體,將字符繪制到一個(gè)以網(wǎng)格劃分的透明背景圖像之中,并記錄字符的寬高和位置參數(shù),在opengl-es中以紋理的方式加載圖像,并根據(jù)參數(shù)將紋理中的一小塊貼圖到背景上,從實(shí)現(xiàn)數(shù)字儀表盤的字符繪制。該方法采用矢量圖形進(jìn)行數(shù)字儀表盤的圖形繪制,使用矢量繪制工具繪制出圖形,估算所繪制的矢量圖形的矩形包圍框的大小,將矩形包圍框內(nèi)部的部分上傳到gpu的紋理當(dāng)中,并根據(jù)矩形包圍框的大小將紋理的局部貼圖到背景中。該方法采用矩陣棧保存來實(shí)現(xiàn)儀表盤中圖形幾何的變換,利用opengl-es中viewmodel矩陣控制繪制的狀態(tài)。該方法還包括將視頻畫面與儀表盤的疊加,將視頻的每幀圖像上傳到opengl-es的fbo對(duì)象綁定的紋理當(dāng)中,將儀表盤的繪制重定向到fbo,即繪制到紋理,以實(shí)現(xiàn)儀表盤和視頻畫面的疊加。該方法還包括對(duì)儀表盤顯示畫面的畸變校正,利用opengl-es的fbo對(duì)象將渲染定向到fbo綁定的紋理,再將紋理以畸變校正參數(shù)指定的方式貼圖到屏幕上,以實(shí)現(xiàn)對(duì)儀表盤顯示畫面的畸變校正。本發(fā)明的有益效果是:本發(fā)明的繪制方法采用反走樣進(jìn)行數(shù)字儀表盤的線條繪制,將opengl-es繪制的線條按照從邊緣到中心拆分為至少兩個(gè)三角形,并對(duì)三角形頂點(diǎn)賦予不同的透明度,以實(shí)現(xiàn)繪制結(jié)果中線條顏色和背景顏色的平滑融合。該繪制方法繪制出的數(shù)字儀表盤的線條無鋸齒,且邊緣與背景能夠很好的融合,相對(duì)于opengl-es默認(rèn)的抗鋸齒功能的全屏處理,本發(fā)明的反走樣直線線條繪制能夠大幅提高繪制的效率。本發(fā)明采用truetype字體進(jìn)行數(shù)字儀表盤的字符繪制,使用矢量繪制工具加載truetype字體,將字符繪制到一個(gè)以網(wǎng)格劃分的透明背景圖像之中,并記錄字符的寬高和位置參數(shù),在opengl-es中以紋理的方式加載圖像,并根據(jù)參數(shù)將紋理中對(duì)應(yīng)的圖像塊貼圖到畫布上,相對(duì)于實(shí)時(shí)解析字體文件上傳,本發(fā)明提高了繪制效率,同時(shí)由于貼圖中的像素在生成過程中有不等的透明度,因此融合到背景后不會(huì)產(chǎn)生鋸齒。附圖說明圖1是本發(fā)明基于opengl-es的數(shù)字儀表盤繪制方法的流程圖;圖2是反走樣線條拆分示意圖;圖3是使用opengl-es進(jìn)行字符繪制的過程示意圖;圖4是本發(fā)明實(shí)施例使用opengl-es繪制的字符紋理圖;圖5是本發(fā)明使用opengl-es實(shí)現(xiàn)矢量繪制的過程示意圖;圖6是本發(fā)明使用opengl-es實(shí)現(xiàn)幾何變換的過程示意圖;圖7是本發(fā)明使用opengl-es完成視頻背景、儀表盤疊加過程的示意圖;圖8是本發(fā)明使用opengl-es完成畸變校正過程的示意圖。具體實(shí)施方式下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式做進(jìn)一步的說明。本發(fā)明的基于opengl-es的數(shù)字儀表盤繪制方法的實(shí)施例本實(shí)施例的儀表盤繪制方法使用opengl-es基礎(chǔ)指令進(jìn)行繪制,如圖1所示,數(shù)字儀表盤的繪制過程主要包括線條、曲線圖形、文字內(nèi)容的繪制、背景圖像的疊加和畸變校正處理,各步驟具體的實(shí)現(xiàn)過程如下。1.采用反走樣進(jìn)行數(shù)字儀表盤的線條繪制。反走樣的本質(zhì)是建立線條顏色和背景顏色的平滑漸變,opengl繪制三角形時(shí)在三角形內(nèi)部的部分就是頂點(diǎn)顏色的漸變,因此可以通過把線條(僅限于直線線條)按照從邊緣到中心拆分為多個(gè)三角形,如圖2所示,指定三角形頂點(diǎn)不同的透明度,來實(shí)現(xiàn)繪制結(jié)果中線條顏色和背景顏色的平滑融合。比如繪制a到b的線段,首先計(jì)算出a->b向量的單位法向量delta,線寬為f1,漸變寬度為f2,繪制的拆分點(diǎn)參數(shù)如表1所示。表1反走樣線條拆分點(diǎn)繪制參數(shù)列表拆分點(diǎn)名稱計(jì)算方法顏色a2a-f1*delta透明b2b-f1*delta透明a1a-f2*delta綠色b1b-f2*delta綠色a3a+f2*delta綠色b3b+f2*delta綠色a4a+f1*delta透明b4b+f1*delta透明在繪制的時(shí)候依次繪制b2、a2、b1、a1、b3、a3、b4、a4構(gòu)成的trianglestrip即可繪制出整個(gè)無鋸齒、邊緣與背景融合良好的線條。相對(duì)于opengl-es默認(rèn)的抗鋸齒功能的全屏處理,線條在全屏中所占比例比較小,因此,本發(fā)明采用反走樣直線線條進(jìn)行數(shù)字儀表盤的繪制能夠大幅提高繪制的效率。2.采用truetype字體進(jìn)行數(shù)字儀表盤的字符繪制。由于gpu不具有像cpu一樣可以串行解析字體文件的能力,實(shí)時(shí)解析字體文件上傳會(huì)增加傳輸數(shù)據(jù),降低效率,因此本發(fā)明把字體文件的參數(shù)預(yù)先提取出來,保存上傳到硬件中,在繪制中只需要直接繪制硬件中緩存的數(shù)據(jù)即可。opengl-es的truetype字符紋理生成需要依賴外部工具,本發(fā)明通過使用freetype或者skia等矢量繪制工具加載truetype字體,如圖3所示,使用skia的measuretext測(cè)量出字體的參數(shù),將skia畫布劃分16*8個(gè)網(wǎng)格,在skia畫布上在每個(gè)網(wǎng)格逐個(gè)繪制完成字符,同時(shí)記錄下每個(gè)字符的繪制位置,將畫布導(dǎo)出為圖像即可,然后上傳到gpu中成為字符紋理。opengl-es執(zhí)行儀表盤繪制的時(shí)候,遇到繪制字符的指令,根據(jù)字符的值及其在字符串中的位置,計(jì)算出畫布上繪制字符的位置作為頂點(diǎn)渲染器(vertexshader)的輸入,從字符紋理中截取出對(duì)應(yīng)的圖像塊作為片段渲染器(fragmentshader),然后貼圖到畫布上。本實(shí)施例通過上述過程得到的字符紋理如圖4所示。相對(duì)實(shí)時(shí)解析字體文件上傳的方式,本發(fā)明采用truetype字體進(jìn)行字符繪制提高了繪制效率,同時(shí)由于貼圖中的像素在生成過程中有不等的透明度,因此融合到背景后不會(huì)產(chǎn)生鋸齒。3.采用矢量圖形進(jìn)行數(shù)字儀表盤的圖形繪制。該步驟使用opengl-es用貼圖的方式模擬矢量繪制,使用矢量繪制工具繪制出圖形,估算所繪制的矢量圖形保衛(wèi)矩形的大小,將矩形區(qū)域上傳到gpu的紋理當(dāng)中,并根據(jù)矩形區(qū)域的大小將紋理的局部貼圖到背景中,具體的實(shí)現(xiàn)過程如圖5所示。首先獲取儀表盤曲線繪制指令,一般是由點(diǎn)坐標(biāo)以及點(diǎn)之間的插值方式指定(貝塞爾曲線),或者圓心和半徑(圓、橢圓、圓弧),將這些類型輸入到skia繪制引擎中,繪制到skia的畫布,也就是一塊內(nèi)存中;然后估算出這些圖形的矩形包圍框(skia中有對(duì)應(yīng)的函數(shù)),將內(nèi)存中矩形包圍框內(nèi)部的部分上傳到gpu當(dāng)中,更新預(yù)先開辟的曲線紋理;再將曲線紋理矩形包圍框中的部分貼圖到畫布,最終完成了曲線到gpu畫布的繪制。4.采用矩陣棧保存實(shí)現(xiàn)圖形的幾何變換。本步驟使用數(shù)組實(shí)現(xiàn)的矩陣棧保存實(shí)現(xiàn)儀表盤中元素的幾何繪制矩陣狀態(tài),如縮放、平移、旋轉(zhuǎn),通過矩陣棧的push、pop操作實(shí)現(xiàn)狀態(tài)的保存、還原,如圖7所示。opengl-es的矩陣分為投影矩陣和視圖-模型矩陣(viewmodel矩陣),其中投影矩陣控制三維空間到二維平面的映射,同時(shí)使像素坐標(biāo)與繪制坐標(biāo)一致。儀表盤繪制中使用正交映射,視圖-模型控制繪制的狀態(tài),在二維平面中就是縮放、平移、旋轉(zhuǎn)三種變換,如圖6所示。通過對(duì)當(dāng)前狀態(tài)矩陣重新賦值,實(shí)現(xiàn)了二維畫面的平移、縮放、旋轉(zhuǎn)以及通用的矩陣變換。所有的繪制都要經(jīng)過坐標(biāo)與當(dāng)前矩陣的乘積作為最終繪制的坐標(biāo)。當(dāng)前矩陣的變化方式與棧的變化方式相同都是先進(jìn)后出,棧頂代表了剛剛被push進(jìn)來的當(dāng)前矩陣,也就是矩陣變換嵌套最深的地方,棧底代表了最初始的繪制矩陣一般是單位矩陣。矩陣棧使用數(shù)組模擬實(shí)現(xiàn),數(shù)組的長度代表了棧的長度,也代表了應(yīng)該插入新元素的位置。平移、縮放、旋轉(zhuǎn)三種變換都對(duì)應(yīng)一個(gè)3*3矩陣,變換的執(zhí)行相當(dāng)于將當(dāng)前矩陣乘以這個(gè)3*3矩陣,在變換的嵌套中,進(jìn)入下一層之前一般都要使用push指令保存當(dāng)前矩陣,在從下一層返回時(shí)pop指令恢復(fù)當(dāng)前矩陣。5.將儀表盤和視頻畫面進(jìn)行疊加。該步驟如圖7所示,首先將視頻的每幀圖像上傳到opengl-es的fbo對(duì)象綁定的紋理當(dāng)中,然后將儀表盤的繪制重定向到fbo,即繪制到紋理,繪制完畢即完成了儀表盤和視頻畫面的基于透明度的疊加,疊加后的圖像仍然在gpu的顯存當(dāng)中,可以對(duì)疊加后的圖像做進(jìn)一步計(jì)算和處理。完成視頻采集后通過opengl-es的api將視頻的畫面上傳到顯存紋理中,然后將紋理渲染到fbo中,再將2d畫面渲染到fbo紋理中,完成與視頻畫面的疊加。畫面疊加是通過首先渲染背景畫面,然后直接繪制儀表盤實(shí)現(xiàn),繪制的過程就是將前景顏色根據(jù)透明度值與背景顏色融合的過程。由于畫面的透明度值都為1(完全不透明),直接渲染背景圖像可以覆蓋掉上一幀的渲染結(jié)果,設(shè)置blendmode來調(diào)整前景和背景的混合方式。在視頻背景上繪制2d畫面時(shí)需要glenable(gl_blend);glblendfunc(gl_one,gl_one_minus_src_alpha);渲染紋理到fbo或者渲染紋理到屏幕時(shí)由于要完全覆蓋之前的畫面,因此需要gldisable(gl_blend);blend參數(shù)只在發(fā)生繪制的地方起作用,將繪制顏色和外視頻疊加。沒有繪制的地方不會(huì)起作用。6.使用opengl-es完成畸變校正后處理。使用opengl-es完成畸變校正后處理過程如圖8所示,首先將fbo綁定的紋理(也就是疊加后的圖像紋理)激活為當(dāng)前紋理;然后對(duì)待輸出的畫布進(jìn)行網(wǎng)格劃分,計(jì)算出每個(gè)網(wǎng)格的頂點(diǎn)坐標(biāo);再根據(jù)畸變校正查找表,計(jì)算出每個(gè)網(wǎng)格頂點(diǎn)所對(duì)應(yīng)的紋理坐標(biāo);然后再根據(jù)opengl-es的tranglestrip繪制規(guī)則,計(jì)算出繪制的頂點(diǎn)索引值,并將這三組數(shù)值傳入gpu中,gpu通過傳入的紋理坐標(biāo)對(duì)fbo紋理圖像進(jìn)行采樣,繪制輸出,得到即為畸變校正后的圖像。解決了opengl-es無法根據(jù)整體結(jié)果進(jìn)行畸變校正處理的缺陷。通過上述過程,本發(fā)明利用嵌入式gpu支持的opengl-es開放接口標(biāo)準(zhǔn)實(shí)現(xiàn)數(shù)字儀表盤的繪制,充分利用硬件的圖形繪制能力,生成2d儀表盤中的各種元素,具有生成效率高、結(jié)果平滑無鋸齒、可疊加圖像、可對(duì)繪制結(jié)果任意變形,同時(shí)還可對(duì)繪制結(jié)果進(jìn)行亮度和對(duì)比度等像素變換。本發(fā)明可用于航空、汽車駕駛、工業(yè)控制、儀器儀表等領(lǐng)域,可以用于游戲、可穿戴設(shè)備、虛擬現(xiàn)實(shí)設(shè)備等涉及到2d圖形、字符、圖像顯示和實(shí)時(shí)處理等領(lǐng)域。當(dāng)前第1頁12