基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的圖形加速方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)圖形處理技術(shù),尤其涉及圖像加速處理方法。
【背景技術(shù)】
[0002] 圖形作為傳遞信息的最主要媒體之一,使得計(jì)算機(jī)圖形學(xué)在短短30年的歷史中 飛速發(fā)展。作為商品的圖形軟件和硬件已能方便地生成各種線畫(huà)圖形和自然景物的真實(shí)感 圖像,從某種程度上來(lái)講,計(jì)算機(jī)圖形學(xué)的廣泛應(yīng)用是計(jì)算機(jī)發(fā)展水平的標(biāo)志。計(jì)算機(jī)圖形 學(xué)來(lái)源于生活、舞蹈、音樂(lè)、藝術(shù)、電影制作、工程技術(shù)、科學(xué)等,它們之間的相互推動(dòng)作用又 使計(jì)算機(jī)圖形學(xué)大大促進(jìn)了這些領(lǐng)域的發(fā)展。
[0003]當(dāng)代計(jì)算機(jī)所具有的圖形圖像處理能力已經(jīng)達(dá)到實(shí)時(shí)渲染高幀頻高清高質(zhì)量的 3D彩色圖像和非常逼真的多層次場(chǎng)景。計(jì)算機(jī)圖形圖像加速處理技術(shù)已經(jīng)廣泛應(yīng)用領(lǐng)域 有:計(jì)算機(jī)動(dòng)畫(huà)、科學(xué)計(jì)算可視化、圖形用戶接口、虛擬現(xiàn)實(shí)技術(shù)、計(jì)算機(jī)藝術(shù)、CAD/CAM等 領(lǐng)域。在這些年,計(jì)算機(jī)圖形圖像處理技術(shù)飛速發(fā)展,從單色到真彩色,從二維到三維、從低 分辨率到高清,陰影、光照、霧化、紋理、融合等技術(shù)層出不窮。正是有了圖形加速技術(shù),才讓 這些所有的技術(shù)得以實(shí)現(xiàn)。
[0004] 在計(jì)算機(jī)圖形學(xué)和計(jì)算機(jī)飛速發(fā)展的趨勢(shì)下,用戶對(duì)人機(jī)交互的要求越來(lái)越高, 要求系統(tǒng)能夠提供出更多的視覺(jué)信息,要求系統(tǒng)可以在屏幕上顯示圖形圖像,例如嵌入式 系統(tǒng)。尤其是進(jìn)入21世紀(jì)后,用戶對(duì)嵌入式設(shè)備的要求上升到了一個(gè)新的高度,用戶要求 這些嵌入式設(shè)備實(shí)時(shí)顯示高清高質(zhì)量的3D圖像圖形。為了滿足這些嵌入式系統(tǒng)的各種應(yīng) 用需求,這些嵌入式設(shè)備必須具有高實(shí)時(shí)性、小體積、低功耗、低成本等這些性能要求。為了 使得嵌入式圖形系統(tǒng)滿足這些需求,必須要求嵌入式系統(tǒng)具有高效的圖形渲染能力,在嵌 入式系統(tǒng)的有限資源下,就需要圖形加速技術(shù)來(lái)快速實(shí)現(xiàn)圖形渲染。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明所要解決的技術(shù)問(wèn)題就是提供一種基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的圖形加速 方法,快速實(shí)現(xiàn)圖形渲染。
[0006] 為解決上述技術(shù)問(wèn)題,本發(fā)明采用如下技術(shù)方案:基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的 圖形加速方法,采用紋理集算法進(jìn)行圖形渲染,采用紋理集算法進(jìn)行圖形渲染包括如下步 驟:
[0007] 第一,創(chuàng)建一個(gè)紋理集類,這個(gè)紋理集的功能是用來(lái)將小紋理合并成一張大的紋 理;
[0008] 第二,將每個(gè)物體上的小紋理傳給紋理集類來(lái)創(chuàng)建一張大紋理,并將每個(gè)物體上 小紋理替換成這張大的紋理;
[0009] 第三,根據(jù)每張小的紋理在紋理集中的相對(duì)位置更新UV坐標(biāo);
[0010] 第四,將序列化的多個(gè)元素繪制函數(shù)合并成一個(gè)元素繪制函數(shù)。
[0011] 優(yōu)選的,將各小紋理合并到大紋理中包括均勻分配和非均勻分配兩種方法,均勻 分配是指在大紋理中分配給各小紋理的大小是固定的,而非均勻分配是指按各小紋理實(shí)際 的尺寸合并到大紋理中。
[0012] 本發(fā)明用紋理集算法進(jìn)行圖形渲染,該算法從渲染10角度出發(fā)考慮,通過(guò)減少 CPU和GPU之間數(shù)據(jù)交互所需要的巨大開(kāi)銷來(lái)提高渲染效率,實(shí)現(xiàn)了圖形的加速處理。
【具體實(shí)施方式】
[0013] 本發(fā)明基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的圖形加速方法的基本思想是設(shè)計(jì)一種動(dòng)態(tài)空 間分配算法將各個(gè)獨(dú)立的小紋理合并為一個(gè)大的紋理,并且進(jìn)行紋理坐標(biāo)的相應(yīng)修改,從 而減少GPU draw call的調(diào)用,以此提高渲染幀率。
[0014] 設(shè)我們要渲染的場(chǎng)景中包含了n張不同的紋理圖,該場(chǎng)景中的幾何對(duì)象總數(shù)為k, 該場(chǎng)景植染時(shí)發(fā)生的GPUdrawcall的調(diào)用次數(shù)為n',則必有:
[0015] n彡n,彡kXn(2-l)
[0016] 若發(fā)生一次GPUdrawcall調(diào)用的時(shí)間為t',場(chǎng)景中某幾何對(duì)象i的植染時(shí)間(不 包括紋理狀態(tài)切換的時(shí)間)為h,場(chǎng)景的總渲染時(shí)間為:
[0017]
[0018] 由公式(2-2)知,GPUdrawcall的調(diào)用次數(shù)增加必然使場(chǎng)景的渲染時(shí)間增長(zhǎng)。而 實(shí)際表明在GPU中,GPUdrawcall的調(diào)用時(shí)間遠(yuǎn)遠(yuǎn)大于正常的渲染時(shí)間。因此,減少GPU drawcall的調(diào)用對(duì)提高場(chǎng)景的渲染效率具有很大的意義。又由公式(2-1)得知,若場(chǎng)景 中幾何對(duì)象總數(shù)不變,紋理個(gè)數(shù)減少,必然會(huì)使渲染時(shí)發(fā)生的GPUdrawcall的調(diào)用次數(shù)減 少。
[0019] 由以上得知,可以通過(guò)合并紋理的方法減少GPU draw call的調(diào)用次數(shù),從而提高 渲染效率。
[0020] 基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的圖形加速方法,采用紋理集算法進(jìn)行圖形渲染,采用 紋理集算法進(jìn)行圖形渲染包括如下步驟:
[0021] 第一,創(chuàng)建一個(gè)紋理集類,這個(gè)紋理集的主要功能是用來(lái)將小紋理合并成一張大 的紋理。
[0022] 第二,將每個(gè)物體上的小紋理傳給紋理集類來(lái)創(chuàng)建一張大紋理,并將每個(gè)物體上 小紋理替換成這張大的紋理。
[0023] 第三,根據(jù)每張小的texture在紋理集中的相對(duì)位置更新UV坐標(biāo)。
[0024] 第四,將序列化的元素繪制函數(shù)(DrawPrimitive函數(shù))合并成一個(gè)元素繪制函數(shù) (DrawPrimitive函數(shù)),即調(diào)用一次draw call即可。
[0025] 首先,我們有一個(gè)TextureSet的基類,這是個(gè)虛擬類,規(guī)定了一些紋理集的基本 操作函數(shù),如Add(),Clear()等操作。
[0026] UniformSet和Non-uniformSet是繼承TextureSet的兩個(gè)實(shí)例,在UniformSet中 我們規(guī)定了紋理集中的每個(gè)texture的大小都是相同的(通常為需要合并的各小紋理中最 大的一個(gè))。而non-uniformSet中則會(huì)按texture實(shí)際大小加到紋理集中。這兩種方案都 有利有弊。UniformSet中管理和計(jì)算都比較方便,而Non-uniformSet對(duì)空間的利用率則比 較高。
[0027] 在實(shí)現(xiàn)的過(guò)程中有以下幾個(gè)關(guān)鍵要點(diǎn)需要注意:
[0028] (1)如何將各小texture(紋理)合并到大紋理中
[0029] 這其中包括uniform和non-uniform兩種,uniform是指在大紋理中分配給各小 texture的大小是固定的,這種方法的優(yōu)點(diǎn)在于方便管理,計(jì)算比較方便,而缺點(diǎn)是比較消 費(fèi)空間。而non-uniform是指按各小texture實(shí)際的size合并到大紋理中。
[0030] (2)如何處理Addressmode的問(wèn)題
[0031] 所謂Addressmode的問(wèn)題,即物體上要求的UV坐標(biāo)超過(guò)(0, 1)時(shí)如何處理的 問(wèn)題,常用的AddressMode有Clamp,Wrap,Mirror,一種解決這種問(wèn)題的辦法就是將帶 Addressmode的小的texture在紋理集中重復(fù)多次,比如一個(gè)小texture的uv值是(0, 5), 那我們就將這個(gè)texture在紋理集中重復(fù)5次。
[0032] (3)如何處理filtering的問(wèn)題
[0033] 所謂filtering是指在pixelshader中采取texture上像素點(diǎn)(texel)時(shí),當(dāng) 采取的點(diǎn)不正好是texel的正中心如何處理的問(wèn)題,通常用的方法有NearestNeighbor, BilinearFiltering,TrilinearFiltering和AnisotropicFiltering。
[0034] 當(dāng)小texture合并到紋理集中時(shí),當(dāng)采取點(diǎn)采到小texture的內(nèi)部時(shí)不會(huì)出什么 問(wèn)題,唯一會(huì)出問(wèn)題的則是當(dāng)采取點(diǎn)采到texture的邊緣時(shí),因?yàn)樵谠瓉?lái)小的texture中 時(shí),texture之外為空白區(qū)域,而在大紋理中時(shí),貝lj會(huì)采到旁邊的texture中。
[0035] 解決這個(gè)問(wèn)題的一個(gè)辦法就是將每個(gè)小texture周圍包圍一個(gè)lpixel寬的外圍 再合并到紋理集中。
[0036] 下面我們來(lái)舉例說(shuō)明這個(gè)減少drawcall的過(guò)程:
[0037] 我們現(xiàn)在需要畫(huà)兩個(gè)物體,通常情況下,我們需將第一張Texture賦給(調(diào)用 SetTextureO函數(shù))第一個(gè)物體,然后開(kāi)始畫(huà)(調(diào)用DrawPrimitiveO函數(shù)),然后再將第 二張Texture通過(guò)SetTextureO賦給第二個(gè)物體,再調(diào)用DrawPrimitiveO畫(huà)第二個(gè)物 體。這樣整個(gè)流程就調(diào)用了兩次drawcall。
[0038] 如果將兩個(gè)Texture合并到一個(gè)textureset里,我們則無(wú)需要在兩 次DrawPrimitiveO之間再次調(diào)用SetTextureO,也就是說(shuō)我們只需要一次 DrawPrimitiveO即可,即將Drawcall的調(diào)用從兩次減少到了一次。為了保證在合并后讀 取pixel時(shí)不至于發(fā)生錯(cuò)誤,我們需要對(duì)Texture的UV坐標(biāo)做一個(gè)對(duì)應(yīng)變換。
[0039] 另外,現(xiàn)有技術(shù)中,Irrlicht引擎中絕對(duì)值運(yùn)算是通過(guò)分支來(lái)判斷其值的正負(fù),以 此來(lái)實(shí)現(xiàn)求值,這種求法不利于CPU的流水線指令處理方式。因此,本發(fā)明還可以通過(guò)優(yōu)化 了Irrlicht引擎的一些底層浮點(diǎn)數(shù)數(shù)學(xué)運(yùn)算進(jìn)加快圖形處理速度,其優(yōu)化實(shí)現(xiàn)方式是:將 原來(lái)代碼中的分支結(jié)構(gòu)去掉,將浮點(diǎn)類型轉(zhuǎn)換成整型,去掉其符號(hào)位,再將其轉(zhuǎn)換回浮點(diǎn)類 型。
【主權(quán)項(xiàng)】
1. 基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的圖形加速方法,其特征在于:采用紋理集算法進(jìn)行圖形 渲染,采用紋理集算法進(jìn)行圖形渲染包括如下步驟: 第一,創(chuàng)建一個(gè)紋理集類,這個(gè)紋理集的功能是用來(lái)將小紋理合并成一張大的紋理; 第二,將每個(gè)物體上的小紋理傳給紋理集類來(lái)創(chuàng)建一張大紋理,并將每個(gè)物體上小紋 理替換成這張大的紋理; 第三,根據(jù)每張小的紋理在紋理集中的相對(duì)位置更新UV坐標(biāo); 第四,將序列化的多個(gè)元素繪制函數(shù)合并成一個(gè)元素繪制函數(shù)。2. 根據(jù)權(quán)利要求1所述的基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的圖形加速方法,其特征在于:將 各小紋理合并到大紋理中包括均勻分配和非均勻分配兩種方法,均勻分配是指在大紋理中 分配給各小紋理的大小是固定的,而非均勻分配是指按各小紋理實(shí)際的尺寸合并到大紋理 中。
【專利摘要】本發(fā)明公開(kāi)了一種基于嵌入式系統(tǒng)存儲(chǔ)優(yōu)化的圖形加速方法,采用紋理集算法進(jìn)行圖形渲染,包括如下步驟:第一,創(chuàng)建一個(gè)紋理集類,這個(gè)紋理集的功能是用來(lái)將小紋理合并成一張大的紋理;第二,將每個(gè)物體上的小紋理傳給紋理集類來(lái)創(chuàng)建一張大紋理,并將每個(gè)物體上小紋理替換成這張大的紋理;第三,根據(jù)每張小的紋理在紋理集中的相對(duì)位置更新UV坐標(biāo);第四,將序列化的多個(gè)元素繪制函數(shù)合并成一個(gè)元素繪制函數(shù)。本發(fā)明用紋理集算法進(jìn)行圖形渲染,通過(guò)減少CPU和GPU之間數(shù)據(jù)交互所需要的巨大開(kāi)銷來(lái)提高渲染效率,實(shí)現(xiàn)了圖形的加速處理。
【IPC分類】G06T1/00
【公開(kāi)號(hào)】CN105023234
【申請(qǐng)?zhí)枴緾N201510376696
【發(fā)明人】盛斌, 吳丹, 裴淑煒, 高吟, 周旭楚, 張?jiān)角?
【申請(qǐng)人】嘉興慧康智能科技有限公司
【公開(kāi)日】2015年11月4日
【申請(qǐng)日】2015年6月29日