本發(fā)明涉及圖形處理,更具體地,涉及一種通過分析通道特性壓縮頂點(diǎn)數(shù)據(jù)的頂點(diǎn)數(shù)據(jù)壓縮方法和裝置,以及相關(guān)的頂點(diǎn)數(shù)據(jù)解壓縮方法和裝置。
背景技術(shù):
如本領(lǐng)域所熟知的,圖形處理通常是以管線(pipelined)的形式執(zhí)行的,其中,多個管線級段對數(shù)據(jù)進(jìn)行操作以產(chǎn)生最終渲染輸出,如用于顯示的畫幀?,F(xiàn)在,許多的圖形處理管線包括一個或多個可編程處理級段,通常稱為“著色器”,其執(zhí)行程序來進(jìn)行圖形處理操作,以產(chǎn)生需要的圖形數(shù)據(jù)。例如,圖形處理管線可包括頂點(diǎn)著色器和像素(片段)著色器。這些著色器為可編程處理級段,其可對輸入數(shù)據(jù)值執(zhí)行著色器程序,以生成一組需要的輸出數(shù)據(jù)值,用于圖形管線的剩余級段進(jìn)行進(jìn)一步處理。圖形處理管線的著色器可共享可編程處理電路,也可以是不同的可編程處理單元。
舉例來說,頂點(diǎn)著色操作可包括頂點(diǎn)位置著色操作和頂點(diǎn)屬性著色操作,其用以對每一畫幀中的圖元(primitives)的頂點(diǎn)進(jìn)行處理。對于延遲渲染方案(如基于倉的渲染方案)而言,一種傳統(tǒng)的設(shè)計(jì)是在分倉過程(也即頂點(diǎn)級段(vertex phase)通道)中執(zhí)行頂點(diǎn)位置著色操作和頂點(diǎn)屬性著色操作,并將畫幀中所有圖元的頂點(diǎn)的頂點(diǎn)位置著色結(jié)果和頂點(diǎn)屬性著色結(jié)果存儲至倉存儲器(bin memory)中,分倉過程完成之后, 再在渲染過程(也即像素級段(pixel phase)通道)中執(zhí)行像素/片段著色操作。由于倉存儲器需要用來存儲許多頂點(diǎn)的頂點(diǎn)位置著色結(jié)果和頂點(diǎn)屬性著色結(jié)果,因此,對于存儲流量和存儲空間的需求很大。此外,頂點(diǎn)級段所寫入的數(shù)據(jù)流量和像素級段所讀取的數(shù)據(jù)流量可導(dǎo)致延遲渲染方案的性能下降。
因此,需要一種創(chuàng)新的用于頂點(diǎn)數(shù)據(jù)壓縮的設(shè)計(jì)方案,其能夠降低對存儲流量和存儲空間的需求。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目標(biāo)之一為提供一種通過分析通道特性壓縮頂點(diǎn)數(shù)據(jù)的頂點(diǎn)數(shù)據(jù)壓縮方法和裝置,以及相關(guān)的頂點(diǎn)數(shù)據(jù)解壓縮方法和裝置。
根據(jù)本發(fā)明的第一個方面,公開一種的頂點(diǎn)數(shù)據(jù)壓縮方法。該頂點(diǎn)數(shù)據(jù)壓縮方法包括:收集多個頂點(diǎn)組成頂點(diǎn)塊;從頂點(diǎn)塊中提取至少一個數(shù)據(jù)單元陣列,其中,每一數(shù)據(jù)單元陣列包括多個數(shù)據(jù)單元,這些數(shù)據(jù)單元分別從多個頂點(diǎn)的多個頂點(diǎn)組分中選取,并對應(yīng)于同一通道,且每一數(shù)據(jù)單元均小于一字節(jié);以及對于每一數(shù)據(jù)單元陣列,檢查數(shù)據(jù)單元陣列中的數(shù)據(jù)單元,以選取壓縮算法,進(jìn)而根據(jù)所選取的壓縮算法對數(shù)據(jù)單元陣列中的數(shù)據(jù)單元進(jìn)行壓縮。
根據(jù)本發(fā)明的第二個方面,公開一種頂點(diǎn)數(shù)據(jù)解壓縮方法。該頂點(diǎn)數(shù)據(jù)解壓縮方法包括:接收從壓縮頂點(diǎn)塊中讀取的數(shù)據(jù),其中,壓縮頂點(diǎn)塊包括標(biāo)頭部分和主體部分,壓縮頂點(diǎn)塊通過對從頂點(diǎn)塊中提取的至少一個數(shù)據(jù)單元陣列進(jìn)行壓縮而生成,每一數(shù)據(jù)單元陣列包括多個數(shù)據(jù)單元,這些數(shù)據(jù)單元分別從頂點(diǎn)塊的多個頂點(diǎn)的多個頂點(diǎn)組分中選取,并對應(yīng)于同一通道,且每一數(shù)據(jù)單元均小于一字節(jié);對標(biāo)頭部分進(jìn)行解碼以獲得記錄值;以及至少部分地根據(jù)從標(biāo)頭部分所獲取的記錄值來生成 一頂點(diǎn)的至少一部分的解壓縮頂點(diǎn)組分。
根據(jù)本發(fā)明的第三個方面,公開一種頂點(diǎn)數(shù)據(jù)壓縮裝置。該頂點(diǎn)數(shù)據(jù)壓縮裝置包括接收電路和壓縮器。接收電路用于接收多個頂點(diǎn)組成頂點(diǎn)塊。壓縮器用于從頂點(diǎn)塊中提取至少一個數(shù)據(jù)單元陣列,其中,每一數(shù)據(jù)單元陣列包括多個數(shù)據(jù)單元,這些數(shù)據(jù)單元分別從多個頂點(diǎn)的多個頂點(diǎn)組分中選取,并對應(yīng)于同一通道,且每一數(shù)據(jù)單元均小于一字節(jié);并且對于每一數(shù)據(jù)單元陣列,檢查數(shù)據(jù)單元陣列中的數(shù)據(jù)單元,以選取壓縮算法,并根據(jù)所選取的壓縮算法對數(shù)據(jù)單元陣列中的數(shù)據(jù)單元進(jìn)行壓縮。
根據(jù)本發(fā)明的第四個方面,公開一種頂點(diǎn)數(shù)據(jù)解壓縮裝置。該頂點(diǎn)數(shù)據(jù)解壓縮裝置包括接收電路和解壓縮器。接收電路用以接收從壓縮頂點(diǎn)塊中讀取的數(shù)據(jù),其中,壓縮頂點(diǎn)塊包括標(biāo)頭部分和主體部分,壓縮頂點(diǎn)塊通過對從頂點(diǎn)塊中提取的至少一個數(shù)據(jù)單元陣列進(jìn)行壓縮而生成,每一數(shù)據(jù)單元陣列包括多個數(shù)據(jù)單元,這些數(shù)據(jù)單元分別從頂點(diǎn)塊的多個頂點(diǎn)的多個頂點(diǎn)組分中選取,并對應(yīng)于同一通道,且每一數(shù)據(jù)單元均小于一字節(jié)。解壓縮器用于對標(biāo)頭部分進(jìn)行解碼以獲取記錄值,并至少部分地根據(jù)從標(biāo)頭部分所獲取的記錄值來生成頂點(diǎn)的至少一部分的解壓縮頂點(diǎn)組分。
本發(fā)明提出的頂點(diǎn)數(shù)據(jù)壓縮方法和裝置及相關(guān)的頂點(diǎn)數(shù)據(jù)解壓縮方法和裝置,能夠降低對存儲流量和存儲空間的需求。
通過閱讀下述于附圖中所揭露的優(yōu)選實(shí)施例的詳細(xì)說明書之后,本發(fā)明的這些以及其他的目標(biāo)對本領(lǐng)域的普通技術(shù)人員來說無疑是很明顯的。
附圖說明
圖1為本發(fā)明一實(shí)施例的圖形處理系統(tǒng)的方塊圖。
圖2為從頂點(diǎn)塊的多個頂點(diǎn)的多個頂點(diǎn)組分中提取數(shù)據(jù)單元陣列的一實(shí)例的示意圖。
圖3為對八個頂點(diǎn)的多個頂點(diǎn)組分進(jìn)行壓縮的一實(shí)例的示意圖。
圖4為本發(fā)明一實(shí)施例的頂點(diǎn)位置組分的通道化壓縮率和頂點(diǎn)屬性組分的通道化壓縮率的示意圖。
圖5為本發(fā)明一實(shí)施例的壓縮頂點(diǎn)塊的數(shù)據(jù)結(jié)構(gòu)的示意圖。
圖6為本發(fā)明一實(shí)施例的頂點(diǎn)數(shù)據(jù)壓縮方法的流程圖。
圖7為本發(fā)明一實(shí)施例的頂點(diǎn)數(shù)據(jù)解壓縮方法的流程圖。
具體實(shí)施方式
下面的描述中使用了一些術(shù)語,其代表特定的元件。本領(lǐng)域的熟練技術(shù)人員可以理解的是,電子設(shè)備制造商可用不同的名字來代表同一元件。本文件通過功能而不是名字的差異來對元件進(jìn)行區(qū)分。在下面的說明書和權(quán)利要求書中,詞語“包括”是開放式的,其應(yīng)理解為“包括,但不限于...”。同樣,詞語“耦接”意為間接的或直接的電連接。相應(yīng)地,如果一設(shè)備耦接至另一設(shè)備,所述連接可通過直接的電連接實(shí)現(xiàn),或通過經(jīng)由其他設(shè)備和連接的間接的電連接實(shí)現(xiàn)。
圖1為本發(fā)明一實(shí)施例的圖形處理系統(tǒng)的方塊圖。圖形處理系統(tǒng)100中至少一部分可為電子設(shè)備中使用的圖形處理單元(graphics processing unit,GPU)的一部分。圖形處理系統(tǒng)100可包括頂點(diǎn)著色器102、分倉模塊(binning module)104、頂點(diǎn)數(shù)據(jù)壓縮裝置106、存儲設(shè)備108、頂點(diǎn)數(shù)據(jù)解壓縮裝置110和像素著色器112。應(yīng)該指出的是,圖1僅顯示與本發(fā)明相關(guān)的元件。在實(shí)踐中,圖形處理系統(tǒng)100可包括其他額外的元件,以實(shí)現(xiàn)其他的功能。頂點(diǎn)數(shù)據(jù)壓縮裝置106用于對從先前三維(three-dimentinal,3D)圖形處理管線級段(如分倉模塊104)中所接收的 原始頂點(diǎn)數(shù)據(jù)進(jìn)行數(shù)據(jù)壓縮,并存儲壓縮/編碼后的頂點(diǎn)數(shù)據(jù)至存儲設(shè)備(如片外倉存儲器(off-chip bin memory))108中,頂點(diǎn)數(shù)據(jù)壓縮裝置106包括接收電路122和壓縮器124。頂點(diǎn)數(shù)據(jù)解壓縮裝置110用于對從存儲設(shè)備108中所讀取的壓縮/編碼后的頂點(diǎn)數(shù)據(jù)執(zhí)行數(shù)據(jù)解壓縮,并輸出解壓縮/解碼的頂點(diǎn)數(shù)據(jù)至下一3D圖形處理管線級段(如像素著色器112),頂點(diǎn)數(shù)據(jù)解壓縮裝置110包括接收電路126和解壓縮器128。因?yàn)閴嚎s的頂點(diǎn)數(shù)據(jù)在頂點(diǎn)級段(vertex phase)通道中存儲至存儲設(shè)備108,并在像素級段(pixel phase)通道中從存儲設(shè)備108中讀取,因此可降低對于存儲流量和存儲空間的需求。
頂點(diǎn)著色器102、分倉模塊104、頂點(diǎn)數(shù)據(jù)壓縮裝置106、頂點(diǎn)數(shù)據(jù)解壓縮裝置110和像素著色器112可通過可編程處理電路來實(shí)現(xiàn)。頂點(diǎn)著色器102可用以在分倉過程(如頂點(diǎn)級段通道)中執(zhí)行頂點(diǎn)位置著色(如頂點(diǎn)位置計(jì)算)和頂點(diǎn)屬性著色(如頂點(diǎn)屬性計(jì)算)。像素著色器112可用以在分倉過程之后在渲染過程(如像素級段通道)中執(zhí)行像素(片段)著色。在該實(shí)施例中,像素著色器112可采用基于倉的渲染方案。因而,在頂點(diǎn)級段通道中,分倉模塊104可根據(jù)頂點(diǎn)位置信息將屏幕空間(如畫幀)劃分為多個倉,其中,頂點(diǎn)位置信息由頂點(diǎn)著色器102所執(zhí)行的頂點(diǎn)位置著色給出。具體地,考慮到每一圖元均具有多個由先前的頂點(diǎn)著色器102處理的頂點(diǎn),并且需要之后的像素著色器112進(jìn)行處理,因而,分倉模塊104可檢查屏幕空間中圖元的分布情況以找出圖元所覆蓋的倉,并輸出圖元所覆蓋的每一倉的頂點(diǎn)數(shù)據(jù),其中,頂點(diǎn)數(shù)據(jù)可包括頂點(diǎn)位置數(shù)據(jù)和相關(guān)的頂點(diǎn)屬性數(shù)據(jù)。由于本發(fā)明的重點(diǎn)是頂點(diǎn)數(shù)據(jù)壓縮和解壓縮,因此關(guān)于頂點(diǎn)著色器102、分倉模塊104和像素著色器112的進(jìn)一步細(xì)節(jié)在這里將不再贅述。
對于頂點(diǎn)數(shù)據(jù)壓縮裝置106而言,其接收電路122用以收集/聚合多 個頂點(diǎn)以組成頂點(diǎn)塊(vertex block,VB)。舉例來說,每16個頂點(diǎn)可聚合起來形成頂點(diǎn)塊VB,用作供壓縮器124進(jìn)行處理的壓縮單元。當(dāng)剩余頂點(diǎn)的數(shù)量小于16個時,可僅對剩余的頂點(diǎn)進(jìn)行收集/聚合以生成頂點(diǎn)塊VB。頂點(diǎn)塊VB中的每一頂點(diǎn)均可具有多個32位頂點(diǎn)組分,包括記錄頂點(diǎn)位置(如X坐標(biāo)值和Y坐標(biāo)值)的頂點(diǎn)組分,記錄頂點(diǎn)屬性(如Z坐標(biāo)值、W坐標(biāo)值、R(紅色通道)值、G(綠色通道)值、B(藍(lán)色通道)值等)的頂點(diǎn)組分。壓縮器124耦接至接收電路122,并用以從頂點(diǎn)塊VB中提取至少一個數(shù)據(jù)單元陣列(如至少一半字節(jié)陣列),其中,每一數(shù)據(jù)單元陣列包括多個數(shù)據(jù)單元,這些數(shù)據(jù)單元分別從多個頂點(diǎn)的多個頂點(diǎn)組分中選取,并對應(yīng)于同一通道,且每一數(shù)據(jù)單元均小于一字節(jié)。例如,每一頂點(diǎn)組分可具有分別對應(yīng)于多個半字節(jié)通道(nibble channels)的多個半字節(jié),每一數(shù)據(jù)單元可為從一半字節(jié)通道中提取的一半字節(jié),進(jìn)而每一數(shù)據(jù)單元陣列為一半字節(jié)陣列,該半字節(jié)陣列包括從不同頂點(diǎn)的多個頂點(diǎn)組分的同一半字節(jié)通道中提取的多個半字節(jié)。簡言之,一32位頂點(diǎn)組分中的M個連續(xù)的位可收集為一個數(shù)據(jù)單元,其中,M≦4。如果頂點(diǎn)塊VB具有N個頂點(diǎn),那么從頂點(diǎn)塊VB中提取的每一數(shù)據(jù)單元陣列的尺寸便為M×N,其中,N≦16。
圖2為從頂點(diǎn)塊的多個頂點(diǎn)的多個頂點(diǎn)組分中提取數(shù)據(jù)單元陣列的一實(shí)例的示意圖。在該實(shí)例中,頂點(diǎn)塊VB包括16個頂點(diǎn)V0-V15,其中,每一頂點(diǎn)均具有多個32位頂點(diǎn)組分。取每一頂點(diǎn)V0-V15的頂點(diǎn)組分VC0為例,其具有分別對應(yīng)于多個通道的多個數(shù)據(jù)單元。若每一數(shù)據(jù)單元為半字節(jié)(4位),而每一頂點(diǎn)V0-V15的頂點(diǎn)組分VC0均具有32位B0-B31,那么其可視為具有8個數(shù)據(jù)單元(半字節(jié))DU0-DU7,分別對應(yīng)于8個通道CH0-CH7。壓縮器124可提取包括多個數(shù)據(jù)單元(如半字節(jié))的數(shù)據(jù)單元陣列(如半字節(jié)陣列),這些數(shù)據(jù)單元從頂點(diǎn)V0-V15的多個頂點(diǎn)組 分中選取并且對應(yīng)于同一通道(如半字節(jié)通道)。例如,當(dāng)選取通道CH0用于頂點(diǎn)數(shù)據(jù)壓縮時,所提取的數(shù)據(jù)單元陣列包括從所有頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中選取的多個數(shù)據(jù)單元DU0。又如,當(dāng)選取通道CH7用于頂點(diǎn)數(shù)據(jù)壓縮時,所提取的數(shù)據(jù)單元陣列包括從所有頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中選取的多個數(shù)據(jù)單元DU7。
對于所提取的每一數(shù)據(jù)單元陣列,壓縮器124進(jìn)一步用以對所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元進(jìn)行檢查,以選取壓縮算法,并根據(jù)所選取的壓縮算法對所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元進(jìn)行壓縮。也就是說,可根據(jù)通道的特性從多個預(yù)定義的壓縮算法中選取所需要的壓縮算法。在該實(shí)施例中,壓縮器124可執(zhí)行分類操作,以將所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值分類為至少一簇,并參照該分類操作所創(chuàng)建的至少一簇來確定所需的壓縮算法。當(dāng)分類操作所確定的簇的數(shù)量沒有超過第一預(yù)定閾值時,且分類操作所確定的每一簇所具有的值偏移不超過第二預(yù)定閾值,則分簇操作成功。舉例來說,第一預(yù)定閾值可設(shè)定為4,而第二預(yù)定閾值可設(shè)定為3。因此,壓縮器124可發(fā)現(xiàn)多達(dá)4簇,并且每一簇所具有的值偏移至多為3。但是,這僅是出于解釋的目的,而不應(yīng)理解為對本發(fā)明的限制。根據(jù)對所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元具有的值所進(jìn)行的分簇結(jié)果,壓縮器124可決定是否對所提取的數(shù)據(jù)單元陣列進(jìn)行數(shù)據(jù)壓縮。當(dāng)分簇操作可成功地發(fā)現(xiàn)有效的簇時,壓縮器124便從多個預(yù)定義的壓縮算法(如,“唯一半字節(jié)(unique nibble,un)”類型壓縮、“有限值域(limited range)”類型壓縮或“常見半字節(jié)(common nibble,cn)”類型壓縮)中選取壓縮算法,并使用所選取的壓縮算法對所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值進(jìn)行壓縮。但是,當(dāng)分簇操作不能發(fā)現(xiàn)任何有效的簇時,則越過數(shù)據(jù)壓縮,如此,所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的原始值就保存至壓縮器124的輸出之中。壓縮 器124根據(jù)原始頂點(diǎn)塊VB生成壓縮頂點(diǎn)塊VB’至存儲設(shè)備108中,其中,通過所選取的壓縮算法對頂點(diǎn)塊VB中的至少一個數(shù)據(jù)單元陣列(如至少一半字節(jié)陣列)進(jìn)行壓縮。所提出的壓縮算法的進(jìn)一步細(xì)節(jié)描述如下。
當(dāng)所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值被分類為具有單一值(single value)的單一簇(single cluster)時,壓縮器124應(yīng)用“un”類型壓縮對所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值進(jìn)行壓縮。取圖2所示的包括多個數(shù)據(jù)單元DU7的數(shù)據(jù)單元陣列為例,其中,多個數(shù)據(jù)單元DU7分別從頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中選取。如果頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有同一值(如0x3),那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將僅具有單一簇,且該單一簇僅具有單一值0x3。壓縮器124將該4位值(bit value)0x3以及指明壓縮類型“un”的3位類型值(type value)記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分,其中,頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7所具有的值0x3均不記錄至頂點(diǎn)塊VB’的主體部分。換言之,多個數(shù)據(jù)單元DU7所具有的每一值0x3均縮減為一0位數(shù)據(jù),因此,其不記錄至頂點(diǎn)塊VB’的主體部分。當(dāng)不啟用頂點(diǎn)數(shù)據(jù)壓縮時,存儲未壓縮的數(shù)據(jù)單元陣列所需要的存儲空間為(4*16)位,其中,“4”為每一數(shù)據(jù)單元中位的數(shù)量,而“16”為頂點(diǎn)塊中頂點(diǎn)的數(shù)量。然而,當(dāng)啟用所提出的“un”類型壓縮算法時,存儲壓縮的數(shù)據(jù)單元陣列所需要的存儲空間僅為(4+3)位,其中,“4”為記錄唯一數(shù)據(jù)單元(如0x3)所需要的位的數(shù)量,而“3”為記錄相關(guān)的壓縮類型所需要的位的數(shù)量。因此,壓縮率(compressing rate,CR)為(4+3)/(4*16)=10.9%。
當(dāng)所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值被分類為具有多個連續(xù)值的單一簇時,壓縮器124應(yīng)用“有限值域”類型壓縮對所提取 的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值進(jìn)行壓縮。取圖2所示的包括多個數(shù)據(jù)單元DU7的數(shù)據(jù)單元陣列為例,其中,多個數(shù)據(jù)單元DU7分別從頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中選取??紤]這樣的情況,頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有位于有限值域(如{0x5,0x8})內(nèi)的4個連續(xù)值,那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將僅具有單一簇,且該單一簇具有多個連續(xù)值0x5、0x6、0x7和0x8,而該單一簇的最大偏移等于3。因此,壓縮器124選取“range1_2”壓縮算法,其中第一指引“1”代表值域(如簇)的數(shù)量,而第二指引“2”代表為指明最大偏移所需要的位的數(shù)量。因此,壓縮器124將從該單一簇的值中所選取的特定值(如值域起始值0x5)和指明壓縮類型“range1_2”的3位類型值記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。對于所提取的數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所具有的每一個值,壓縮器124將特定值(如值域起始值0x5)和數(shù)據(jù)單元所具有的值之間的2位偏移值記錄至壓縮頂點(diǎn)塊VB’的主體部分,其中,該數(shù)據(jù)單元所具有的值不記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x5,那么原始的4位值0x5將縮減為2位偏移值b00,進(jìn)而該2位偏移值b00被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x6,那么原始的4位值0x6將縮減為2位偏移值b01,進(jìn)而該2位偏移值b01被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x7,那么原始的4位值0x7將縮減為2位偏移值b10,進(jìn)而該2位偏移值b10被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x8,那么原始的4位值0x8將縮減為2位偏移值b11,進(jìn)而該2位偏移值b11被記錄至壓縮頂點(diǎn)塊VB’的主體部分。當(dāng)不啟用頂點(diǎn)數(shù)據(jù)壓縮時,存儲未壓縮的數(shù)據(jù)單元陣列 所需要的存儲空間為(4*16)位,其中,“4”為每一數(shù)據(jù)單元中位的數(shù)量,而“16”為頂點(diǎn)塊中的頂點(diǎn)的數(shù)量。然而,當(dāng)啟用所提出的“range1_2”壓縮算法時,存儲壓縮的數(shù)據(jù)單元陣列所需要的存儲空間僅為[(4+3)+2*16]位,其中,“4”為記錄該單一簇的連續(xù)值中的值(如0x5)所需要的位的數(shù)量,“3”為記錄相關(guān)的壓縮類型所需要的位的數(shù)量,“2”為記錄偏移值所需要的位的數(shù)量,而“16”為頂點(diǎn)塊中頂點(diǎn)的數(shù)量。因此,壓縮率為[(4+3)+2*16]/(4*16)=60.9%。
前面提到的所選取的“range1_2”壓縮算法除了用于具有多個連續(xù)值的單一簇的情況之外,該“有限值域”類型壓縮算法還可支持其他類型的壓縮算法如“range1_1”壓縮算法和“range1_3”壓縮算法。
考慮這樣的情況,頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有位于有限值域(如{0x5,0x6})內(nèi)的2個連續(xù)值,那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將僅具有單一簇,且該單一簇具有多個連續(xù)值0x5和0x6,而該單一簇的最大偏移等于1。因此,壓縮器124選取“range1_1”壓縮算法,其中,第一指引“1”代表值域(如簇)的數(shù)量,而第二指引1代表為指明最大偏移所需要的位的數(shù)量。因此,壓縮器124將從該單一簇的值中所選取的特定值(如值域起始值0x5)和指明壓縮類型“range1_1”的3位類型值記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。對于所提取的數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所具有的每一值,壓縮器124將特定值(如值域起始值0x5)和數(shù)據(jù)單元所具有的值之間的1位偏移值記錄至壓縮頂點(diǎn)塊VB’的主體部分,其中,該數(shù)據(jù)單元所具有的值不記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x5,那么原始的4位值0x5將縮減為1位偏移值b0,進(jìn)而該1位偏移值b0被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具 有的值為0x6,那么原始的4位值0x6將縮減為1位偏移值b1,進(jìn)而該1位偏移值b1被記錄至壓縮頂點(diǎn)塊VB’的主體部分。因此,壓縮率為[(4+3)+1*16]/(4*16)=35.9%。
考慮另外一種情況,頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有位于一有限值域(如{0x5,0x9})內(nèi)的5個連續(xù)值,那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將僅具有單一簇,且該單一簇具有多個連續(xù)值0x5、0x6、0x7、0x8和0x9,而該單一簇的最大偏移等于4。因此,壓縮器124選取“range1_3”壓縮算法,其中第一指引“1”代表值域(如簇)的數(shù)量,而第二指引3代表為指明最大偏移所需要的位的數(shù)量。因此,壓縮器124將從該單一簇的值中所選取的特定值(如值域起始值0x5)和指明壓縮類型“range1_3”的3位類型值記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。對于所提取的數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所具有的每一值,壓縮器124將特定值(如值域起始值0x5)和數(shù)據(jù)單元所具有的值之間的3位偏移值記錄至壓縮頂點(diǎn)塊VB’的主體部分,其中,該數(shù)據(jù)單元所具有的值不記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x5,那么原始的4位值0x5將縮減為3位偏移值b000,進(jìn)而該3位偏移值b000被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x6,那么原始的4位值0x6將縮減為3位偏移值b001,進(jìn)而該3位偏移值b001被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x7,那么原始的4位值0x7將縮減為3位偏移值b010,進(jìn)而該3位偏移值b010被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x8,那么原始的4位值0x8將縮減為3位偏移值b011,進(jìn)而該3位偏移值b011被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如 果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x9,那么原始的4位值0x9將縮減為3位偏移值b100,進(jìn)而該3位偏移值b100被記錄至壓縮頂點(diǎn)塊VB’的主體部分。因此,壓縮率為[(4+3)+3*16]/(4*16)=85.9%。
當(dāng)所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值被分類為分別具有多個連續(xù)值的多個簇時,壓縮器124應(yīng)用“有限值域”類型壓縮對所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值進(jìn)行壓縮。取圖2所示的包括多個數(shù)據(jù)單元DU7的數(shù)據(jù)單元陣列為例,其中,多個數(shù)據(jù)單元DU7分別從頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中選取。考慮這樣的情況,頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有一組位于有限值域(如{0x5,0x8})內(nèi)的4個連續(xù)值以及一組位于不同的有限值域(如{0xa,0xc})內(nèi)的3個連續(xù)值,那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將具有兩簇,其中一簇具有多個連續(xù)值0x5、0x6、0x7和0X8,且該簇的最大偏移等于3,另一簇具有多個連續(xù)值0xa、0xb和0xc,且該另一簇的最大偏移等于2。因此,壓縮器124選取一“range2_2”壓縮算法,其中第一指引“2”代表值域(如簇)的數(shù)量,而第二指引“2”代表為指明每一值域的最大偏移所需要的位的數(shù)量。因此,壓縮器124將從其中一簇的值中所選取的特定值(如值域起始值0x5)、從其中另一簇的值中所選取的特定值(如值域起始值0xa)和指明壓縮類型“range2_2”的3位類型值記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。對于所提取的數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所具有的每一值,壓縮器124將同一數(shù)據(jù)單元具有的值相關(guān)的簇的1位指引值(index value)記錄至壓縮頂點(diǎn)塊VB’的主體部分,并進(jìn)一步將該相關(guān)簇的特定值(specific value)(如0x5或0xa)和該數(shù)據(jù)單元所具有的值之間的偏移值記錄至壓縮頂點(diǎn)塊VB’的主體部分,其中,該數(shù)據(jù)單元所具有的值不記錄至壓縮頂點(diǎn)塊VB’的主體部分。
如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x5,那么原始的4位值0x5將縮減為相關(guān)簇/值域{0x5,0x8}的1位指引值b0和2位偏移值b00,進(jìn)而該1位指引值b0和該2位偏移值b00均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x6,那么原始的4位值0x6將縮減為相關(guān)簇/值域{0x5,0x8}的1位指引值b0和2位偏移值b01,進(jìn)而該1位指引值b0和該2位偏移值b01均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的一數(shù)據(jù)單元所具有的值為0x7,那么原始的4位值0x7將縮減為相關(guān)簇/值域{0x5,0x8}的1位指引值b0和2位偏移值b10,進(jìn)而該1位指引值b0和該2位偏移值b10均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x8,那么原始的4位值0x8將縮減為相關(guān)簇/值域{0x5,0x8}的1位指引值b0和2位偏移值b11,進(jìn)而該1位指引值b0和該2位偏移值b11均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。
如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0xa,那么原始的4位值0xa將縮減為相關(guān)簇/值域{0xa,0xc}的1位指引值b1和2位偏移值b00,進(jìn)而該1位指引值b1和該2位偏移值b00均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的一數(shù)據(jù)單元所具有的值為0xb,那么原始的4位值0xb將縮減為相關(guān)簇/值域{0xa,0xc}的1位指引值b1和2位偏移值b01,進(jìn)而該1位指引值b1和該2位偏移值b01均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0xc,那么原始的4位值0xc將縮減為相關(guān)簇/值域{0xa,0xc}的1位指引值b1和2位偏移值b10,進(jìn)而該1位指引值b1和該2位偏移值b10均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。
當(dāng)不啟用頂點(diǎn)數(shù)據(jù)壓縮時,存儲一未壓縮的數(shù)據(jù)單元陣列需要的存儲 空間為(4*16)位,其中,4為每一數(shù)據(jù)單元中位的數(shù)量,而16為頂點(diǎn)塊中頂點(diǎn)的數(shù)量。然而,當(dāng)啟用所提出的“range2_2”壓縮算法時,存儲壓縮的數(shù)據(jù)單元陣列所需要的存儲空間僅為[(4*2+3)+(2+1)*16]位。因此,壓縮率為[(4*2+3)+(2+1)*16]/(4*16)=92.1%。
前面提到的所選取的“range2_2”壓縮算法除了可用于分別具有多個值的多個簇的情況之外,所述“有限值域”類型壓縮算法還可支持其他類型的壓縮算法如“range2_1”壓縮算法。考慮這樣的情況,頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有一組位于有限值域(如{0x5,0x6})內(nèi)的2個連續(xù)值以及一組位于不同的有限值域(如{0xa,0xb})內(nèi)的2個連續(xù)值,那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將具有兩簇,其中一簇具有多個連續(xù)值0x5和0x6,且該簇的最大偏移等于1,另一簇具有多個連續(xù)值0xa和0xb,且該另一簇的最大偏移等于1。因此,壓縮器124選取“range2_1”壓縮算法,其中第一指引“2”代表值域(如簇)的數(shù)量,而第二指引“1”代表為指明每一值域的最大偏移所需要的位的數(shù)量。因此,壓縮器124將從其中一簇的值中所選取的特定值(如值域起始值0x5)、從其中另一簇的值中所選取的特定值(如值域起始值0xa)和指明壓縮類型“range2_1”的3位類型值記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。對于所提取的數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所具有的每一值,壓縮器124將同數(shù)據(jù)單元所具有的值相關(guān)的簇的1位指引值記錄至壓縮頂點(diǎn)塊VB’的主體部分,并進(jìn)一步將該相關(guān)簇的特定值(如0x5或0xa)和該數(shù)據(jù)單元所具有的值之間的1位偏移值記錄至壓縮頂點(diǎn)塊VB’的主體部分,其中,該數(shù)據(jù)單元所具有的值不記錄至壓縮頂點(diǎn)塊VB’的主體部分。
如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x5,那么原始的4位值0x5將縮減為相關(guān)簇/值域{0x5,0x6}的1位指引值b0和1位 偏移值b0,進(jìn)而該1位指引值b0和該1位偏移值b0均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x6,那么原始的4位值0x6將縮減為相關(guān)簇/值域{0x5,0x6}的1位指引值b0和1位偏移值b1,進(jìn)而該1位指引值b0和該1位偏移值b1均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的一數(shù)據(jù)單元所具有的值為0xa,那么原始的4位值0xa將縮減為相關(guān)簇/值域{0xa,0xb}的1位指引值b1和1位偏移值b0,進(jìn)而該1位指引值b1和該1位偏移值b0均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0xb,那么原始的4位值0xb將縮減為相關(guān)簇/值域{0xa,0xb}的1位指引值b1和1位偏移值b1,進(jìn)而該1位指引值b1和該1位偏移值b1均被記錄至壓縮頂點(diǎn)塊VB’的主體部分。因此,壓縮率為[(4*2+3)+(1+1)*16]/(4*16)=67.1%。
當(dāng)所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值被分類為均具有單一值的多個簇時,壓縮器124應(yīng)用“cn”類型壓縮對所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值進(jìn)行壓縮。取圖2所示的包括多個數(shù)據(jù)單元DU7的數(shù)據(jù)單元陣列為例,其中,多個數(shù)據(jù)單元DU7分別從頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中選取??紤]這樣的情況,即頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7僅具有4個互異值0x4、0x8、0xa和0xf,那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將包括僅有單一值0x4的第一簇、僅有單一值0x8的第二簇、僅有單一值0xa的第三簇和僅有單一值0xf的第四簇。因此,壓縮器124選取“cn4”壓縮算法,其中,指引“4”代表數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所共享的互異值的數(shù)量。因此,壓縮器124分別將不同簇的互異值0x4、0x8、0xa和0xf以及指明壓縮類型“cn4”的3位類型值記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。對于所提取的數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所具 有的每一值,壓縮器124將同一數(shù)據(jù)單元所具有的值相關(guān)的簇的2位指引值記錄至壓縮頂點(diǎn)塊VB’的主體部分,其中,該數(shù)據(jù)單元所具有的值不記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x4,那么原始的4位值0x4將縮減為相關(guān)簇[0x4]的2位指引值b00,進(jìn)而該2位指引值b00被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x8,那么原始的4位值0x8將縮減為相關(guān)簇[0x8]的2位指引值b01,進(jìn)而該2位指引值b01被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0xa,那么原始的4位值0xa將縮減為相關(guān)簇[0xa]的2位指引值b10,進(jìn)而該2位指引值b10被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0xf,那么原始的4位值0xf將縮減為相關(guān)簇[0xf]的2位指引值b11,進(jìn)而該2位指引值b11被記錄至壓縮頂點(diǎn)塊VB’的主體部分。
當(dāng)不啟用頂點(diǎn)數(shù)據(jù)壓縮時,存儲未壓縮的數(shù)據(jù)單元陣列需要的存儲空間為(4*16)位,其中,4為每一數(shù)據(jù)單元中位的數(shù)量,而16為頂點(diǎn)塊中頂點(diǎn)的數(shù)量。然而,當(dāng)啟用所提出的“cn4”壓縮算法時,存儲壓縮的數(shù)據(jù)單元陣列所需要的存儲空間僅為[(4*4+3)+2*16]位。因此,壓縮率為[(4*4+3)+2*16]/(4*16)=79.6%。
前面提到的所選取的“cn4”壓縮算法除了可用于均具有多個值的多個簇的情況之外,所述“cn”類型壓縮算法還可支持其他類型的壓縮算法,如“cn3”壓縮算法??紤]這樣的情況,即頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7僅具有3個互異值0x4、0x8和0xa,那么對頂點(diǎn)V0-V15的頂點(diǎn)組分VC0中的多個數(shù)據(jù)單元DU7具有的值所進(jìn)行的分簇結(jié)果將包括僅有單一值0x4的第一簇、僅有單一值0x8的第二簇和僅有單一值0xa的第三簇。因此,壓縮器124選取“cn3”壓縮算法,其中,指引 “3”代表數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所共享的互異值的數(shù)量。因此,壓縮器124將不同簇的互異值0x4、0x8和0xa以及指明壓縮類型“cn3”的3位類型值記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。對于所提取的數(shù)據(jù)單元陣列中的多個數(shù)據(jù)單元所具有的每一值,壓縮器124將同一數(shù)據(jù)單元所具有的值相關(guān)的簇的2位指引值記錄至壓縮頂點(diǎn)塊VB’的主體部分,其中,該數(shù)據(jù)單元所具有的值不記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x4,那么原始的4位值0x4將縮減為相關(guān)簇[0x4]的2位指引值b00,進(jìn)而該2位指引值b00被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0x8,那么原始的4位值0x8將縮減為相關(guān)簇[0x8]的2位指引值b01,進(jìn)而該2位指引值b01被記錄至壓縮頂點(diǎn)塊VB’的主體部分。如果所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值為0xa,那么原始的4位值0xa將縮減為相關(guān)簇[0xa]的2位指引值b10,進(jìn)而該2位指引值b10被記錄至壓縮頂點(diǎn)塊VB’的主體部分。因此,壓縮率為[(4*3+3)+2*16]/(4*16)=73.4%。
為了更好地理解所提出的頂點(diǎn)數(shù)據(jù)壓縮方法的技術(shù)特征,圖3闡釋了對8個頂點(diǎn)的多個32位頂點(diǎn)組分(如R組分)進(jìn)行壓縮的一個實(shí)例。其中,位[31:28]對于所有的頂點(diǎn)均為0x4。因此,對其選取并應(yīng)用“un”類型壓縮算法以存儲0x4至壓縮頂點(diǎn)塊的標(biāo)頭部分作為其唯一半字節(jié)值,且不存儲任何位至壓縮頂點(diǎn)塊的主體部分。位[27:24]的范圍為{0xa,0xd},因此,選取并應(yīng)用“range1_2”壓縮算法以存儲0xa至該壓縮頂點(diǎn)塊的標(biāo)頭部分作為值域起始值,并存儲2位偏移值至該壓縮頂點(diǎn)塊的主體部分。由于a=a+0、b=a+1、c=a+2且d=a+3,因而,半字節(jié)通道[27:24]的半字節(jié)陣列[0xb,0xb,0xc,0xc,0xb,0xb,0xd,0xa]可被編碼為[01,01,10,10,01,01,11,00]。位[23:20]的范圍值域?yàn)閧0x1,0x2}和{0x9,0xa},因此, 對其選取并應(yīng)用“range2_1”壓縮算法以存儲0x1和0x9至該壓縮頂點(diǎn)塊的標(biāo)頭部分作為兩個值域起始值,并存儲1位指引值至該壓縮頂點(diǎn)塊的主體部分用于值域的選取,以及存儲1位偏移值至該壓縮頂點(diǎn)塊的主體部分。由于{0x1,0x2}為第一值域,{0x9,0xa}為第二值域,且9=9+0、a=9+1、1=1+0、2=1+1,因此,半字節(jié)通道[23:20]的半字節(jié)陣列[0x9,0xa,0xa,0x9,0x1,0x2,0x2,0x1]可被編碼為[10,11,11,10,00,01,01,00],其中,對于每一2位陣列元素,其第一位為指引值,而其第二位為偏移值。位[19:16]具有3個常見半字節(jié)0x1、0x8和0xe,因此,對其選取并應(yīng)用“cn3”壓縮算法以存儲常見半字節(jié)0x1、0x8和0xe至壓縮頂點(diǎn)塊的標(biāo)頭部分,并存儲2位指引值至該壓縮頂點(diǎn)塊的主體部分。由于0x1為第一常見半字節(jié),0x8為第二常見半字節(jié),且0xe為第三常見半字節(jié),因此,半字節(jié)通道[19:16]中的半字節(jié)陣列[0x1,0x8,0x8,0xe,0xe,0x1,0x8,0x8]可被編碼為[00,01,01,10,10,00,01,01]。由于位[15:0]不可壓縮,因此跳過對其的數(shù)據(jù)壓縮。其中,將其1位類型值(如b1)存儲至壓縮頂點(diǎn)塊的標(biāo)頭部分,而將位[15:0]存儲至壓縮頂點(diǎn)塊的主體部分。
壓縮類型和值(如唯一半字節(jié)、常見半字節(jié)、有限值域基值)依次被存儲至壓縮頂點(diǎn)塊的標(biāo)頭部分。在該實(shí)例中,壓縮頂點(diǎn)塊的標(biāo)頭部分可存儲{“un”,“range1_2”,“range2_1”,“cn3”,0x4,0xa,0x1,0x9,0x1,0x8,0xe},其中,每一壓縮類型“un”,“range1_2”,“range2_1”和“cn3”可進(jìn)一步進(jìn)行編碼,例如,可編碼為3位。
如上所述,當(dāng)所提取的數(shù)據(jù)單元陣列中的數(shù)據(jù)單元所具有的值被分類為具有單一值的單一簇時,壓縮器124應(yīng)用“un”類型壓縮,進(jìn)而,將所提取的數(shù)據(jù)單元陣列中的所有數(shù)據(jù)單元所共享的值(如4位值)和相關(guān)的壓縮類型信息(如3位值)記錄至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。當(dāng)所有通道CH0-CH7的數(shù)據(jù)單元均被提取以用于數(shù)據(jù)壓縮,且每一提取的數(shù) 據(jù)單元陣列中的多個數(shù)據(jù)單元所具有的值均被分類為具有單一值的單一簇時(例如,每一提取的對應(yīng)于通道CH0-CH7的數(shù)據(jù)單元陣列中,對應(yīng)于同一通道的數(shù)據(jù)單元所具有的值相同),那么壓縮器124所應(yīng)用的“un”類型壓縮將記錄8*(4+3)位至壓縮頂點(diǎn)塊VB'的標(biāo)頭部分。為了改善此情況下的壓縮效率,也即頂點(diǎn)V0-V15的頂點(diǎn)組分VC0彼此相同時,本發(fā)明進(jìn)一步提出一種“唯一組分(unique component,uc)”類型壓縮算法。當(dāng)選取該“uc”類型壓縮算法時,壓縮器124將同頂點(diǎn)V0-V15的任一頂點(diǎn)組分VC0相等的32位值和1位類型值(如uc=1)記錄至標(biāo)頭部分,其中,頂點(diǎn)V0-V15的頂點(diǎn)組分VC0均不記錄至壓縮頂點(diǎn)塊VB’的主體部分。相比較于“un”類型壓縮算法需要存儲8*(4+3)位至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分,該“uc”類型壓縮算法僅需存儲(32+1)位至壓縮頂點(diǎn)塊VB’的標(biāo)頭部分。應(yīng)當(dāng)指出的是,該“uc”類型壓縮算法是可選的。也就是說,在一可選擇的設(shè)計(jì)中,可根據(jù)實(shí)際的設(shè)計(jì)考慮,省略該“uc”類型壓縮算法。
圖2所示的頂點(diǎn)組分VC0可為頂點(diǎn)塊VB所包括的頂點(diǎn)的多個頂點(diǎn)組分之一。例如,該頂點(diǎn)組分VC0可為32位的頂點(diǎn)屬性組分。另外,該頂點(diǎn)組分VC0也可為32位的頂點(diǎn)位置組分。當(dāng)頂點(diǎn)塊中的所有頂點(diǎn)的X坐標(biāo)值和Y坐標(biāo)值均可通過12.4定點(diǎn)格式來表示(也就是說,頂點(diǎn)塊中的所有頂點(diǎn)均位于屏幕內(nèi)而不在剪切空間中),那么頂點(diǎn)的X坐標(biāo)值和Y坐標(biāo)值可打包并存儲為32位頂點(diǎn)組分,而不是存儲為兩個單獨(dú)的分別位于剪切空間中的頂點(diǎn)組分fp32(剪切值x)和fp32(剪切值y)。但是,當(dāng)頂點(diǎn)塊中的所有頂點(diǎn)的X坐標(biāo)值和Y坐標(biāo)值均不能通過12.4頂點(diǎn)格式來表示時,那么頂點(diǎn)的X坐標(biāo)值和Y坐標(biāo)值將分別存儲為位于剪切空間中的兩個頂點(diǎn)組分如fp32(剪切值x)和fp32(剪切值y)。
在典型設(shè)計(jì)中,可選擇性地對每一通道進(jìn)行頂點(diǎn)數(shù)據(jù)壓縮,進(jìn)而對頂點(diǎn)塊的多個頂點(diǎn)的多個頂點(diǎn)組分中所提取的數(shù)據(jù)單元陣列(如半字節(jié)陣 列)進(jìn)行壓縮。為提高壓縮/解壓縮速度并降低硬件成本,本發(fā)明進(jìn)一步提出一種通道選擇性頂點(diǎn)數(shù)據(jù)壓縮方案,其僅對特定通道進(jìn)行頂點(diǎn)數(shù)據(jù)壓縮。例如,壓縮器124可跳過對一些半字節(jié)通道的壓縮。在該實(shí)施例中,壓縮器124用以根據(jù)頂點(diǎn)塊VB中的多個頂點(diǎn)的多個頂點(diǎn)組分的數(shù)據(jù)類型,來確定多個數(shù)據(jù)單元陣列,用于選擇性頂點(diǎn)數(shù)據(jù)壓縮。
圖4為本發(fā)明一實(shí)施例的頂點(diǎn)位置組分的通道化壓縮率和頂點(diǎn)屬性組分的通道化壓縮率的示意圖。從圖4的子圖(A)中可以看出,頂點(diǎn)位置組分的4個最高有效位(most significant bit,MSB)通道(也即通道4-7)的壓縮率要優(yōu)于該頂點(diǎn)位置組分的剩余通道(也即通道0-3)的壓縮率。此外,從圖4的子圖(B)中可以看出,頂點(diǎn)屬性組分的3個MSB通道(也即通道5-7)和一個最低有效位(least significant bit,LSB)通道(也即通道0)的壓縮率要優(yōu)于該頂點(diǎn)屬性組分的剩余通道(也即通道1-4)的壓縮率。鑒于以上觀察,當(dāng)頂點(diǎn)組分為頂點(diǎn)位置組分時,通道選擇性頂點(diǎn)數(shù)據(jù)壓縮方案可僅對4個高位數(shù)據(jù)單元(如4個MSB半字節(jié))進(jìn)行壓縮,而當(dāng)頂點(diǎn)組分為頂點(diǎn)屬性組分時,通道選擇性頂點(diǎn)數(shù)據(jù)壓縮方案可僅對3個高位數(shù)據(jù)單元(如3個MSB半字節(jié))和一個低位數(shù)據(jù)單元(如1個LSB半字節(jié))進(jìn)行壓縮。通過這種方式,便可實(shí)現(xiàn)壓縮速度和壓縮質(zhì)量之間的平衡。
如上面所提到的,壓縮頂點(diǎn)塊VB’包括標(biāo)頭部分和主體部分。在一典型設(shè)計(jì)中,標(biāo)頭部分可進(jìn)一步劃分為固定長度部分和可變長度部分。不同的壓縮頂點(diǎn)塊的標(biāo)頭部分的位寬可根據(jù)所使用的不同的壓縮算法而彼此不同。當(dāng)所存儲的每一標(biāo)頭部分均使用固定長度部分和可變長度部分時,不同壓縮頂點(diǎn)塊的固定長度部分的位寬將被限制為彼此相同,但是不同壓縮頂點(diǎn)塊的可變長度部分的位寬可允許彼此不同。
圖5為本發(fā)明一實(shí)施例的壓縮數(shù)據(jù)塊的數(shù)據(jù)結(jié)構(gòu)的示意圖。在一典型 設(shè)計(jì)中,壓縮頂點(diǎn)塊VB’的標(biāo)頭部分劃分為位于主體部分之前的標(biāo)頭前部(header-front portion,HF portion)和緊接主體部分之后的標(biāo)頭后部(header-back portion,HB portion),其中,標(biāo)頭前部為前面提到的固定長度部分,而標(biāo)頭后部為前面提到的可變長度部分。壓縮類型(如“un”,“uc”,“range1_1”,“range1_2”,“range1_3”,“range2_1”,“range2_2”,“cn3”和“cn4”)均僅存儲至標(biāo)頭前部。而值(如唯一半字節(jié)、常見半字節(jié)、有限值域基值)通常存儲至標(biāo)頭后部。但是,當(dāng)所有的壓縮類型均存儲至標(biāo)頭前部之后,而標(biāo)頭前部仍然具有空閑空間的話,那么也可將一部分值(如唯一半字節(jié)、常見半字節(jié)、有限值域基值)存儲至標(biāo)頭前部。
當(dāng)將壓縮頂點(diǎn)塊VB’存儲至存儲設(shè)備108時,標(biāo)頭前部、主體部分和標(biāo)頭后部可存儲至連續(xù)的地址中。由于壓縮頂點(diǎn)塊VB’以標(biāo)頭前部開始,且標(biāo)頭前部具有固定的位寬,因此,標(biāo)頭部分所記錄的信息可容易地從存儲設(shè)備108中獲取。在該實(shí)施例中,標(biāo)頭部分所包括的信息可用以判定主體部分中的每一壓縮頂點(diǎn)V0’-V15’的位寬(其可包括指引值和/或偏移值)和標(biāo)頭后部的位寬。因此,頂點(diǎn)數(shù)據(jù)解壓縮裝置110可從存儲設(shè)備108中獲取壓縮頂點(diǎn)塊VB’的標(biāo)頭前部,并對標(biāo)頭前部進(jìn)行解碼以了解主體部分和標(biāo)頭后部的數(shù)據(jù)配置。在了解了壓縮頂點(diǎn)塊VB’的主體部分和標(biāo)頭后部的數(shù)據(jù)配置之后,頂點(diǎn)數(shù)據(jù)解壓縮裝置110可很容易地于主體部分找出圖元的壓縮頂點(diǎn),并于標(biāo)頭部分(如標(biāo)頭前部和/或標(biāo)頭后部)找出其相關(guān)值,然后對壓縮頂點(diǎn)進(jìn)行解壓縮,以獲得解壓縮頂點(diǎn)。由于壓縮器124所使用的壓縮算法是無損壓縮,因此,解壓縮頂點(diǎn)應(yīng)該同原始頂點(diǎn)完全一致。
頂點(diǎn)塊VB中的頂點(diǎn)V0-V15使用相同的壓縮算法組合來進(jìn)行壓縮,其中,對所選取的通道應(yīng)用這些壓縮算法。因此,壓縮頂點(diǎn)V0’-V15’的位寬是相同的。更具體地說,每一壓縮頂點(diǎn)V0’-V15’均具有相同的數(shù)據(jù)結(jié)構(gòu)和 相同的跨幅。而這能夠?qū)崿F(xiàn)對存儲設(shè)備108中存儲的壓縮頂點(diǎn)V0’-V15’進(jìn)行隨機(jī)存取。此外,本發(fā)明所提出的頂點(diǎn)數(shù)據(jù)壓縮和相關(guān)的頂點(diǎn)數(shù)據(jù)解壓縮簡單快捷,因此其對3D圖形的渲染性能影響甚微。
對于頂點(diǎn)數(shù)據(jù)解壓縮裝置110而言,其接收電路126用以接收從壓縮頂點(diǎn)塊VB’中所讀取的數(shù)據(jù),其中,壓縮頂點(diǎn)塊VB’包括標(biāo)頭部分和主體部分。壓縮頂點(diǎn)塊VB’通過對從頂點(diǎn)塊VB中所提取的至少一個數(shù)據(jù)單元陣列進(jìn)行壓縮而生成,每一數(shù)據(jù)單元陣列包括多個數(shù)據(jù)單元,這些數(shù)據(jù)單元分別從頂點(diǎn)塊VB中的多個頂點(diǎn)的多個頂點(diǎn)組分中選取,并對應(yīng)于同一通道,且每一數(shù)據(jù)單元均小于一字節(jié)。解壓縮器128用于對標(biāo)頭部分進(jìn)行解碼以獲取記錄值(如唯一組分、唯一半字節(jié)、常見半字節(jié)或有限值域基值),并至少部分地根據(jù)從標(biāo)頭部分所獲取的記錄值來生成一頂點(diǎn)的至少一部分的解壓縮頂點(diǎn)組分。
例如,頂點(diǎn)數(shù)據(jù)解壓縮裝置110可獲取同圖元的頂點(diǎn)相關(guān)的圖元信息(Addr,V_0,V_1,V_2)。根據(jù)存儲設(shè)備108中所存儲的壓縮頂點(diǎn)塊VB’的起始地址Addr,接收電路126從壓縮頂點(diǎn)塊VB’中接收具有固定位寬(其為預(yù)定值)的標(biāo)頭前部。解壓縮器128對所接收到的標(biāo)頭前部進(jìn)行解碼,以了解壓縮頂點(diǎn)塊VB’的主體部分和標(biāo)頭后部的數(shù)據(jù)配置情況,其包括每一壓縮頂點(diǎn)的位寬(即壓縮頂點(diǎn)的跨幅)和標(biāo)頭后部的位寬。接下來,根據(jù)解壓縮的頂點(diǎn)跨幅、標(biāo)頭前部的固定位寬和壓縮頂點(diǎn)塊VB’的起始地址Addr,解壓縮器122計(jì)算頂點(diǎn)標(biāo)識符V_0,V_1,V_2所指向的壓縮頂點(diǎn)的起始地址。接收電路126根據(jù)計(jì)算出的所需要的壓縮頂點(diǎn)的起始地址,接收從壓縮頂點(diǎn)塊VB’中讀取的所需要的壓縮頂點(diǎn),并將所接收的壓縮頂點(diǎn)發(fā)送至解壓縮器128,以用于解壓。接下來,解壓縮器128應(yīng)用同壓縮器124所使用的壓縮算法相匹配的解壓縮算法,并生成解壓縮頂點(diǎn)至像素著色器112,以用于像素(片段)著色。
如果解壓縮器128參照標(biāo)頭部分所記錄的壓縮類型從而確定所使用的對多個原始頂點(diǎn)的頂點(diǎn)組分進(jìn)行壓縮的壓縮算法為“uc”類型,那么解壓縮器128便對標(biāo)頭部分(如標(biāo)頭前部和/或標(biāo)頭后部)進(jìn)行解碼,以獲取作為完整頂點(diǎn)組分(即唯一頂點(diǎn)組分)的記錄值,并將該從標(biāo)頭部分獲取的記錄值設(shè)置為頂點(diǎn)的解壓縮頂點(diǎn)組分,而無需參照壓縮頂點(diǎn)塊的主體部分。
如果解壓縮器128參照標(biāo)頭部分所記錄的壓縮類型從而確定所使用的對多個原始頂點(diǎn)的頂點(diǎn)組分中的數(shù)據(jù)單元進(jìn)行壓縮的壓縮算法為“un”類型,那么解壓縮器128便對標(biāo)頭部分(如標(biāo)頭前部和/或標(biāo)頭后部)進(jìn)行解碼,以獲取作為該頂點(diǎn)的部分組分(如唯一半字節(jié))的記錄值,并將該從標(biāo)頭部分獲取的記錄值設(shè)置為頂點(diǎn)的解壓縮頂點(diǎn)組分的一數(shù)據(jù)單元,而無需參照壓縮頂點(diǎn)塊的主體部分。
如果解壓縮器128參照標(biāo)頭部分所記錄的壓縮類型從而確定所使用的對多個原始頂點(diǎn)的頂點(diǎn)組分中的數(shù)據(jù)單元進(jìn)行壓縮的壓縮算法為“cn”類型,那么解壓縮器128便對壓縮頂點(diǎn)塊的主體部分(如相應(yīng)的壓縮頂點(diǎn))進(jìn)行解碼,以獲取指引值,并參照該指引值從標(biāo)頭部分(如標(biāo)頭前部和/或標(biāo)頭后部)獲取該頂點(diǎn)組分的記錄值,并輸出該從標(biāo)頭部分獲取的記錄值,作為頂點(diǎn)的解壓縮頂點(diǎn)組分的數(shù)據(jù)單元。
如果解壓縮器128參照標(biāo)頭部分所記錄的壓縮類型從而確定所使用的對多個原始頂點(diǎn)的頂點(diǎn)組分的數(shù)據(jù)單元進(jìn)行壓縮的壓縮算法為“有限值域”類型,例如,“range1_1”壓縮算法,“range1_2”壓縮算法或“range1_3”壓縮算法,那么解壓縮器128便對壓縮頂點(diǎn)組塊的主體部分(如相應(yīng)的壓縮頂點(diǎn))進(jìn)行解碼,以獲取偏移值,從標(biāo)頭部分(如標(biāo)頭前部和/或標(biāo)頭后部)獲取基值,并將該偏移值添加至基值以生成頂點(diǎn)的解壓縮頂點(diǎn)組分的數(shù)據(jù)單元。
如果解壓縮器128參照標(biāo)頭部分所記錄的壓縮類型從而確定所使用的對一些原始頂點(diǎn)的頂點(diǎn)組分的數(shù)據(jù)單元進(jìn)行壓縮的壓縮算法為“有限值域”類型,例如,“range2_1”壓縮算法或“range2_2”壓縮算法,那么解壓縮器128便對壓縮頂點(diǎn)塊的主體部分(如相應(yīng)的壓縮頂點(diǎn))進(jìn)行解碼,以獲取指引值和偏移值,從標(biāo)頭部分(如標(biāo)頭前部和/或標(biāo)頭后部)的多個記錄基值中(如有限值域的起始值)選取目標(biāo)基值,并將該偏移值添加目標(biāo)基值,以生成頂點(diǎn)的解壓縮頂點(diǎn)組分的一數(shù)據(jù)單元。
圖6為本發(fā)明一實(shí)施例的頂點(diǎn)數(shù)據(jù)壓縮方法的流程圖。如果結(jié)果實(shí)質(zhì)上相同,圖6中的步驟不必按其所示的確切順序執(zhí)行。頂點(diǎn)數(shù)據(jù)壓縮方法可應(yīng)用于圖1所示的頂點(diǎn)數(shù)據(jù)壓縮裝置106,該頂點(diǎn)數(shù)據(jù)壓縮方法可簡述如下。
步驟600:開始。
步驟602:收集多個頂點(diǎn)組成頂點(diǎn)塊。
步驟604:對于所選取的通道,從其頂點(diǎn)塊中提取數(shù)據(jù)單元陣列,其中,數(shù)據(jù)單元陣列包括多個數(shù)據(jù)單元,這些數(shù)據(jù)單元分別從多個頂點(diǎn)的多個頂點(diǎn)組分中選取,并均對應(yīng)于所選取的通道,且每一數(shù)據(jù)單元均小于一字節(jié)。
步驟606:檢查數(shù)據(jù)單元陣列中的數(shù)據(jù)單元,以確定壓縮算法。
步驟608:根據(jù)所選取的壓縮算法對數(shù)據(jù)單元陣列中的數(shù)據(jù)單元進(jìn)行壓縮,并生成相應(yīng)的包括壓縮類型和壓縮相關(guān)值的標(biāo)頭信息。
步驟610:檢查是否有更多的通道需要進(jìn)行數(shù)據(jù)壓縮。如果是,則執(zhí)行步驟604;否則,執(zhí)行步驟612。
步驟612:將壓縮頂點(diǎn)塊存儲至存儲設(shè)備中(如片外倉存儲器),其中,該壓縮頂點(diǎn)塊包括用于記錄壓縮頂點(diǎn)的標(biāo)頭信息的標(biāo)頭部分和用于記錄壓縮頂點(diǎn)的主體部分。
步驟614:結(jié)束。
本領(lǐng)域的熟練技術(shù)人員在閱讀上述關(guān)于頂點(diǎn)數(shù)據(jù)壓縮裝置106的段落之后,可以容易地理解圖6所示的每一步驟的細(xì)節(jié),因此,出于簡潔性考慮,進(jìn)一步的細(xì)節(jié)在這里不再贅述。
圖7為本發(fā)明一實(shí)施例的頂點(diǎn)數(shù)據(jù)解壓縮方法的流程圖。如果結(jié)果實(shí)質(zhì)上相同,圖7中的步驟不必按其所示的確切順序執(zhí)行。頂點(diǎn)數(shù)據(jù)解壓縮方法可應(yīng)用于圖1所示的頂點(diǎn)數(shù)據(jù)解壓縮裝置110,該頂點(diǎn)數(shù)據(jù)解壓縮方法可簡述如下。
步驟700:開始。
步驟702:接收標(biāo)頭前部(其為壓縮頂點(diǎn)塊的標(biāo)頭的第一部分)。
步驟704:對標(biāo)頭前部進(jìn)行解碼,以了解壓縮頂點(diǎn)塊的主體部分和標(biāo)頭后部(其為壓縮頂點(diǎn)塊的標(biāo)頭部分的第二部分)的數(shù)據(jù)配置。
步驟706:對標(biāo)頭部分(如標(biāo)頭前部和/或標(biāo)頭后部)進(jìn)行解碼以獲取對應(yīng)于頂點(diǎn)的頂點(diǎn)組分的至少一部分記錄值(如唯一組分、唯一半字節(jié)、常見半字節(jié)或有限值域基值)。
步驟708:至少部分地根據(jù)從標(biāo)頭部分所獲取的記錄值生成頂點(diǎn)的至少一部分解壓縮頂點(diǎn)組分。例如,解壓縮頂點(diǎn)組分可直接通過記錄值進(jìn)行設(shè)定。此外,解壓縮頂點(diǎn)組分的數(shù)據(jù)單元可通過記錄值和偏移值的總和進(jìn)行設(shè)定,其中,偏移值通過對壓縮頂點(diǎn)塊的主體部分中對應(yīng)的壓縮頂點(diǎn)進(jìn)行解碼而獲得。
步驟710:檢查是否有多個通道或多個壓縮頂點(diǎn)需要進(jìn)行解壓縮。如果是,則執(zhí)行步驟706;否則,執(zhí)行步驟712。
步驟712:結(jié)束。
本領(lǐng)域的熟練技術(shù)人員在閱讀上述關(guān)于頂點(diǎn)數(shù)據(jù)解壓縮裝置110的段落之后,可以容易地理解圖7所示的每一步驟的細(xì)節(jié),因此,出于簡 潔性考慮,進(jìn)一步的細(xì)節(jié)在這里不再贅述。
本領(lǐng)域的熟練技術(shù)人員將容易地觀察到,可對本發(fā)明的裝置和方法做出大量的修改和替換,同時保留本發(fā)明的指導(dǎo)內(nèi)容。相應(yīng)地,上述公開內(nèi)容應(yīng)被解釋為,僅通過所附的權(quán)利要求書的界限和范圍來進(jìn)行限定。