一種基于表面信號擬合和曲面細(xì)分的著色器簡化方法、裝置及圖形渲染方法
【專利摘要】本發(fā)明公開了一種基于表面信號擬合和曲面細(xì)分的著色器簡化方法、裝置及圖形渲染方法,利用于曲面細(xì)分法在原始著色器中插入細(xì)分著色器和幾何著色器,對待渲染模型進(jìn)行細(xì)分,并采用表面信號擬合法生成用于計算原始像素著色器中的變量和表達(dá)式在細(xì)分模型中相應(yīng)的細(xì)分圖元上的取值的擬合器,并將形成的擬合器插入到原始像素著色器中,替代對相應(yīng)的變量或表達(dá)式的取值計算,從而簡化原始像素著色器的計算,加快計算時間。進(jìn)一步,由于插入了細(xì)分著色器和幾何著色器,可以在細(xì)分圖元上進(jìn)行擬合計算,從而提高擬合精度,減少由簡化著色器帶來的渲染誤差。
【專利說明】一種基于表面信號擬合和曲面細(xì)分的著色器簡化方法、裝置及圖形渲染方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及圖形渲染【技術(shù)領(lǐng)域】,尤其涉及一種基于表面信號擬合和曲面細(xì)分的著色器簡化方法、裝置及圖形渲染方法。
【背景技術(shù)】
[0002]著色器替代了傳統(tǒng)的固定渲染管線,可以實現(xiàn)3D圖形學(xué)計算中的相關(guān)計算,由于其可編輯性,可以實現(xiàn)各種各樣的圖像效果而不用受顯卡的固定渲染管線限制。這極大的提高了圖像的畫質(zhì)。最新的GPU流水線提供了 5個著色器,著色器自頂向下依次為頂點著色器(Vertex Shader)、外殼著色器(Hull Shader)、域著色器(Domain Shader)、幾何著色器(Geometry Shader)和像素著色器(Fragment Shader)。所有的著色器按功能可以分為3類。第一類著色器是頂點著色器,處理頂點信息,將頂點的空間位置投影在屏幕上,即計算頂點的二維坐標(biāo)。第二類著色器是幾何處理著色器,包括外殼著色器、域著色器和幾何著色器,他們計算并輸出新的幾何圖元。第三類是像素著色器,其輸入為插值后的幾何屬性,輸出為像素的顏色值。所有的著色器都是完全可編程的,并且允許靈活的實時渲染效果的定制。
[0003]但是,著色器的計算速度很大程度上依賴于程序員的經(jīng)驗。盡管有一些規(guī)則和工具集來處理交互式建模和著色器程序優(yōu)化,整個渲染過程仍然耗時。一般地,最耗時的渲染計算都在像素著色器部分,因此以前的方法主要的目標(biāo)都在優(yōu)化像素著色器的計算。Pellacini提供了一個用戶可配置的著色器簡化方法來進(jìn)行逐像素的過程建模。程序生成一系列由原始著色器逐步簡化生成的著色器。該方法通過對著色器的代碼應(yīng)用指定的簡化規(guī)則來生成一系列的候選變種,然后評估變種與原始著色器之間度量的差來選擇具有最小誤差的候選變種。這種選擇過程一直循環(huán)直到最后的著色器成為了常量。Sitth1-amorn使用遺傳編程來自動簡化渲染過程。與Pellacini類似,該算法同樣計算一系列逐步簡化的著色器,但考慮了更多的代碼變換規(guī)則,包括代碼中表達(dá)式語句中操作數(shù)與操作符的交換、語句的刪除和語句的插入等,同時該方法使用遺傳算法來選取更多的簡化后的著色器,并且也能生成更快的和更可靠的結(jié)果。
[0004]Pellacini的方法受限于很少的代碼轉(zhuǎn)換規(guī)則,會漏掉很多的優(yōu)化結(jié)果。雖然Sitth1-amorn的方法增加了更多的代碼轉(zhuǎn)換規(guī)則,但是該方法僅僅只是對像素著色器的表達(dá)式簡化,并沒有考慮到整個的渲染流程。
[0005]從信號處理的角度來看,生成一個表面上的視覺效果就相當(dāng)于表面上的信號生成,建模和重構(gòu)。在渲染中,圖形學(xué)能廣泛地表示許多類型的信號:顏色,紋理映射,凹凸紋理,置換貼圖,雙向紋理函數(shù),預(yù)計算的渲染和自傳輸紋理,等等。為了表示或近似表面的光照信號,主要有兩種不同的方法。一個是調(diào)整表面使其適應(yīng)信號,或者采樣一個細(xì)粒度的網(wǎng)格然后簡化網(wǎng)格來更好的表示給定的信號。另外一個使用基函數(shù)來表達(dá)這些信號,比如高階的多項式函數(shù),無網(wǎng)格的稀疏徑向基函數(shù),或者數(shù)據(jù)分解的基函數(shù)。因為著色器輸入的限制,網(wǎng)格的重組近似對于著色器的優(yōu)化來說顯得不切實際。我們提出了一個使用高階的多項式函數(shù)來近似著色器生成的圖元上的表面信號,這個近似方法在圖形學(xué)中有廣泛的使用。
【發(fā)明內(nèi)容】
[0006]針對現(xiàn)有技術(shù)的不足,本發(fā)明提供了一種基于表面信號擬合和曲面細(xì)分的著色器簡化方法、裝置及圖形渲染方法。
[0007]—種基于表面信號擬合和曲面細(xì)分的著色器簡化方法,待簡化的原始著色器包括原始頂點著色器和原始像素著色器,包括:
[0008](I)設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型;
[0009](2)從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值;
[0010](3)根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器。
[0011]本發(fā)明中為得到擬合器,先對待渲染模型進(jìn)行細(xì)分,從而利用細(xì)分得到的細(xì)分模型,采用表面信號擬合法計算原始像素著色器中的變量和表達(dá)式在細(xì)分模型中相應(yīng)的細(xì)分圖元上的取值。實際上得到的細(xì)分模型中各個細(xì)分圖元上的均有各自的圖元索引號,且圖元索引號在細(xì)分過程中按照設(shè)定的細(xì)分參數(shù)和細(xì)分函數(shù)已經(jīng)確定:是利用細(xì)分后細(xì)分圖元的各個細(xì)分頂點在相應(yīng)原始圖元上的重心坐標(biāo)進(jìn)行編號,編號結(jié)果即為該細(xì)分圖元在細(xì)分模型中的圖元索引號。具體編號方法為:選擇原始圖元的一個頂點為坐標(biāo)原點,從坐標(biāo)原點出發(fā),按照由外層向內(nèi)層、每一層內(nèi)部順時針的遍歷順序遍歷細(xì)分圖元,并對圖元根據(jù)遍歷順序依次編號。在形成擬合器時針對各個目標(biāo)變量或目標(biāo)表達(dá)式,以該像素著色器當(dāng)前所處理的像素點所對應(yīng)的細(xì)分圖元的索引號去索引該細(xì)分圖元的擬合函數(shù),利用索引得到的擬合函數(shù)計算目標(biāo)變量或表達(dá)式在該細(xì)分圖元上的取值。
[0012]本發(fā)明的著色器簡化方法中基于曲面細(xì)分法在原始著色器中插入細(xì)分著色器和幾何著色器,對待渲染模型進(jìn)行細(xì)分,并采用表面信號擬合法生成用于計算原始像素著色器中的變量和表達(dá)式在細(xì)分模型中相應(yīng)的細(xì)分圖元上的取值的擬合器,并將形成的擬合器插入到原始像素著色器中,替代對相應(yīng)的變量或表達(dá)式的取值計算,從而簡化原始像素著色器的計算,加快計算時間。進(jìn)一步,由于插入了細(xì)分著色器和幾何著色器,可以在細(xì)分圖元上進(jìn)行擬合計算,從而提高擬合精度,減少由簡化著色器帶來的渲染誤差。
[0013]本發(fā)明中得到的修正著色器的個數(shù)與步驟(I)中設(shè)定的細(xì)分參數(shù)的組數(shù)擬合器的個數(shù)、以及步驟(3)中選擇用于替換的擬合器的個數(shù)和組合方式有關(guān)。一個擬合目標(biāo)在一個細(xì)分模型上對應(yīng)一個擬合器,針對每一個細(xì)分模型,形成修正像素著色器時,可以選擇不同的擬合目標(biāo)對應(yīng)的擬合器以及數(shù)量不同的擬合器,從而得到不同的修正像素著色器。修正著色器的個數(shù)越多,簡化后得到最優(yōu)簡化結(jié)果的概率越大,但是計算量也會增大,具體個數(shù)可根據(jù)實際應(yīng)用需求設(shè)定,本發(fā)明得到的修正著色器的個數(shù)為200?10000個。
[0014]每組細(xì)分參數(shù)包括:每個圖元內(nèi)部細(xì)分的層數(shù)、每個圖元在每層細(xì)分時每條邊的細(xì)分?jǐn)?shù)目與細(xì)分步長。基于以上細(xì)分參數(shù)可以完成對待渲染模型的細(xì)分。如果三角形設(shè)置3個組邊長細(xì)分參數(shù)(即每條邊的細(xì)分?jǐn)?shù)目與細(xì)分步長),四邊形設(shè)置4組邊長細(xì)分參數(shù)。
[0015]所述步驟(I)中通過圖形硬件流水線中固定細(xì)分函數(shù)的計算方法按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分。
[0016]可以采用多種辦法對待渲染模型細(xì)分,直接利用圖形硬件流水線中固定細(xì)分函數(shù)形成相應(yīng)的細(xì)分函數(shù)細(xì)分,也可以利用圖形硬件流水線中固定細(xì)分函數(shù)形成具有細(xì)分功能的著色器完成細(xì)分。作為優(yōu)選,所述步驟(I)針對每一組細(xì)分參數(shù)形成相應(yīng)的第一著色器對待渲染模型進(jìn)行細(xì)分,所述的第一著色器通過如下步驟生成:
[0017](1-1)以頂點的屬性值和頂點索引號作為輸入變量和輸出變量生成第一頂點著色器,所述的第一頂點著色器用于將各個輸入變量的值賦值給相應(yīng)的輸出變量;
[0018](1-2)針對任意一組細(xì)分參數(shù),根據(jù)當(dāng)前組細(xì)分參數(shù)生成第一細(xì)分著色器,所述的細(xì)分著色器用于根據(jù)第一頂點著色器輸出的頂點的屬性值和頂點索引號,通過圖形硬件流水線中固定細(xì)分函數(shù)的計算方法按照當(dāng)前組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,并根據(jù)細(xì)分結(jié)果輸出細(xì)分頂點的屬性值,以及各個細(xì)分頂點所在的原始圖元的所有頂點的頂點索引號和各個頂點在該原始圖元上的重心坐標(biāo);
[0019](1-3)生成第一幾何著色器,所述的第一幾何著色器用于接收第一細(xì)分著色器的輸出,并根據(jù)接收到的數(shù)據(jù)輸出當(dāng)前處理的細(xì)分圖元的所有細(xì)分頂點的屬性值、所有細(xì)分頂點所在的原始圖元的所有頂點的頂點索引號和在該原始圖元上的重心坐標(biāo)、以及該細(xì)分圖元所在的原始圖元的細(xì)分索引號,所述的細(xì)分索引號為第一幾何著色器根據(jù)各個細(xì)分頂點在該原始圖元上的重心坐標(biāo)計算得到;還用于對該細(xì)分圖元的所有細(xì)分頂點在對應(yīng)細(xì)分圖元上的重心坐標(biāo)賦值并輸出;
[0020](1-4)分別將每一個第一細(xì)分著色器與第一頂點著色器、第一幾何著色器和原始像素著色器組合得到相應(yīng)的第一著色器,利用各個第一著色器渲染待渲染模型,將渲染過程中各個第一著色器中的第一幾何著色器的輸出作為相應(yīng)的細(xì)分模型。
[0021]所述步驟(2)包括如下步驟:
[0022](2-1)在當(dāng)前細(xì)分模型中的每個細(xì)分圖元上設(shè)定若干個樣本點;
[0023](2-2)將原始像素著色器中當(dāng)前擬合目標(biāo)對應(yīng)的程序點之前,與計算當(dāng)前擬合目標(biāo)相關(guān)的語句作為對應(yīng)的目標(biāo)片段,將各個樣本點的屬性值作為對應(yīng)的目標(biāo)片段的輸入,針對當(dāng)前細(xì)分模型中任意一個細(xì)分圖元上所有樣本點對應(yīng)的輸出,以該細(xì)分圖元對應(yīng)的所有的輸出作為該擬合目標(biāo)在細(xì)分圖元上生成的表面信號,用設(shè)定的擬合基函數(shù)對該表面信號函數(shù)進(jìn)行擬合得到擬合函數(shù);
[0024](2-3)生成擬合器,所述的擬合器用于根據(jù)當(dāng)前像素點對應(yīng)的細(xì)分圖元的重心坐標(biāo),利用所述的擬合函數(shù)計算當(dāng)前擬合目標(biāo)在對應(yīng)的細(xì)分圖元上的取值,對應(yīng)的細(xì)分圖元為當(dāng)前像素點在細(xì)分模型中所在的細(xì)分圖元。
[0025]當(dāng)前變量對應(yīng)的程序點指該變量在原始像素著色器所處的位置,變量名相同的變量,在原始像素著色器中不同的位置處時應(yīng)該作為不同的變量處理。步驟(2-3)中的當(dāng)前像素點指像素著色器當(dāng)前處理的像素點,該步驟中將得到每個細(xì)分圖元上的擬合函數(shù)進(jìn)行存儲,并利用細(xì)分圖元的圖元索引號去索引該細(xì)分圖元上的擬合函數(shù)。
[0026]步驟(2-1)中在每個細(xì)分圖元上通過抖動采樣法獲取若干個樣本點,樣本點的個數(shù)可根據(jù)圖元大小確定,通??稍O(shè)為15?32個。各個樣本點的屬性值根據(jù)樣本點的重心坐標(biāo)分別對待渲染模型該樣本點所在圖元的頂點的屬性值進(jìn)行光柵化插值得到。
[0027]步驟(2-2)中通過對原始像素著色器進(jìn)行語法分析,獲取原始像素著色器的程序依賴圖,并根據(jù)得到的程序依賴圖提取像素著色器與計算該擬合目標(biāo)相關(guān)的部分形成該目標(biāo)片段(實際上向得到目標(biāo)片段的抽象語法樹,然后再轉(zhuǎn)化為目標(biāo)片段)。
[0028]目標(biāo)變量或目標(biāo)表達(dá)式的個數(shù)過小,不能達(dá)到有效的簡化效果。因此,作為優(yōu)選,所述的擬合目標(biāo)的個數(shù)為原始像素著色中的變量與表達(dá)式的個數(shù)的20?100%。
[0029]所述步驟(2)采用最小二乘法進(jìn)行擬合,采用的擬合基函數(shù)為貝塞爾曲面函數(shù)。
[0030]采用最小二乘法擬合,可以有效的減小計算得到的目標(biāo)變量或目標(biāo)表達(dá)式與實際值之間的差異,提高擬合精度。以貝塞爾曲面函數(shù)作為擬合基函數(shù)時,得到的擬合函數(shù)實際為包含控制頂點的貝塞爾曲面函數(shù)。利用該擬合函數(shù)計算時,將當(dāng)前像素點在對應(yīng)細(xì)分圖元上的重心坐標(biāo)代入即可得到,其中當(dāng)前像素點對應(yīng)的細(xì)分圖元上的重心坐標(biāo)從幾何著色器獲取。
[0031]所述步驟(3)中通過如下步驟生成頂點著色器:
[0032](al)分別以原始頂點著色器的輸入變量和輸出變量作為輸入變量和輸出變量,初始化一個空的頂點著色器;
[0033](a2)向步驟(al)處理后的頂點著色器添加主函數(shù),所述的主函數(shù)用于將輸入變量的值賦值給相應(yīng)的輸出變量。
[0034]通過以上步驟生成的頂點著色器用于接收當(dāng)前處理的頂點的屬性值,并將接收到的數(shù)據(jù)輸出,所述的頂點的屬性值的個數(shù)和數(shù)據(jù)類型與原始頂點著色器接收到的頂點的屬性值的個數(shù)和數(shù)據(jù)類型相同。本發(fā)明令生成的頂點著色器的輸入變量和輸出變量與原始頂點著色器的輸入變量和輸出變量相同(包括輸入變量和輸出變量的個數(shù)和數(shù)據(jù)類型相同),能夠使頂點著色器的輸入與原始頂點著色器的輸入能夠通用。
[0035]對于DirectX,所述的細(xì)分著色器包括外殼著色器和域著色器,通過如下步驟生成細(xì)分著色器:
[0036](bl)以原始頂點著色器的輸出變量作為輸入變量與輸出變量,初始化一個空的外殼著色器;
[0037](b2)設(shè)置該外殼著色器中的細(xì)分參數(shù)為相應(yīng)細(xì)分模型對應(yīng)的一組細(xì)分參數(shù);
[0038](b3)在空的外殼著色器中插入主函數(shù),所述的主函數(shù)用于將輸入變量賦值給相應(yīng)的輸出變量;
[0039](b4)以外殼著色器的輸出變量作為輸入變量,以原始像素著色器的輸入變量以及細(xì)分圖元的細(xì)分頂點在對應(yīng)的原始圖元上的重心坐標(biāo)為輸出變量,初始化一個域著色器;
[0040](b5)在域著色器中插入主函數(shù),所述的主函數(shù)用于將輸入變量賦值給相應(yīng)的輸出變量;
[0041](b6)將原始頂點著色器的主函數(shù)插入到域著色器的主函數(shù)中;
[0042]對于OpenGL,所述的細(xì)分著色器包括細(xì)分評估著色器和細(xì)分控制著色器,通過步驟(bl)和(b6)生成,所不同的是生成是細(xì)分評估著色器和細(xì)分控制著色器。
[0043]細(xì)分著色器相當(dāng)于設(shè)定細(xì)分參數(shù),并根據(jù)設(shè)定的細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,將進(jìn)一步將細(xì)分后得到的細(xì)分頂點的進(jìn)行處理(主要為位置變換)。對于域著色器而言,細(xì)分圖元的細(xì)分頂點在對應(yīng)的原始圖元上的重心坐標(biāo)由硬件計算得到,硬件流水線中固定細(xì)分函數(shù)的計算細(xì)分圖元的方法計算細(xì)分圖元的細(xì)分頂點,并將計算的結(jié)果輸入通過固有的輸入結(jié)構(gòu)輸入到域著色器。其中,域著色器中對應(yīng)原始像素著色器的輸入變量的輸出變量,輸出的實際上細(xì)分頂點的屬性值,由硬件輸入(硬件對待渲染模型細(xì)分的同時會計算得到的細(xì)分頂點的屬性值)。
[0044]所述步驟(3)中通過如下步驟生成幾何著色器:
[0045](Cl)以所述細(xì)分著色器的輸出變量為輸入變量,以原始像素著色器的輸入變量以及該細(xì)分圖元在細(xì)分模型中的圖元索引號作為輸出變量,初始化一個空的幾何著色器;
[0046](c2)向步驟(Cl)處理后的幾何著色器添加主函數(shù),所述的主函數(shù)用于將輸入變量的值賦值給相應(yīng)的輸出變量,還用于根據(jù)各個細(xì)分頂點計算在對應(yīng)原始圖元上的重心坐標(biāo)值計算該細(xì)分圖元在原始圖元上的細(xì)分位置,并利用所述細(xì)分位置計算該細(xì)分圖元在細(xì)分模型中的圖元索引號,并將計算結(jié)果賦值給相應(yīng)的輸出變量,還用于對表示細(xì)分圖元各個頂點在該細(xì)分圖元上的重心坐標(biāo)的輸出變量重新賦值。
[0047]原始像素著色器的輸入變量包括幾何著色器當(dāng)前處理的細(xì)分圖元的各個細(xì)分頂點的屬性值以及各個細(xì)分頂點的重心坐標(biāo)(開始為該細(xì)分頂點在對應(yīng)的原始圖元的重心坐標(biāo))。對于幾何著色器,硬件中的固定函數(shù)根據(jù)待渲染模型和細(xì)分方式計算得到圖元的各個細(xì)分頂點的在原始圖元上的重心坐標(biāo)并輸入給幾何著色器,幾何著色器利用硬件輸入的細(xì)分圖元的細(xì)分頂點在原始圖元上的重心坐標(biāo)值計算得到當(dāng)前處理的細(xì)分圖元在原始圖元上的位置,根據(jù)細(xì)分圖元在細(xì)分模型中的圖元索引號索引該細(xì)分圖元,擬合器以索引方式得到該細(xì)分圖元,根據(jù)該圖元索引號,能夠快速的找到該細(xì)分圖元上使用的擬合函數(shù),進(jìn)而計算對應(yīng)的擬合目標(biāo)在該細(xì)分圖元上的取值。計算得到細(xì)分圖元的圖元索引號之后,幾何著色器還需要對表示細(xì)分圖元的重心坐標(biāo)的輸出變量重新賦值作為各個細(xì)分頂點在當(dāng)前處理的細(xì)分圖元上的重心坐標(biāo)。本發(fā)明中對各個細(xì)分頂點的重心坐標(biāo)賦的值為基本坐標(biāo)值,如若細(xì)分圖元為三角形,則賦值分別為(0,0,1)、(0,1,0)和(1,0,0)。
[0048]本發(fā)明中通過以上步驟生成的幾何著色器用于接收細(xì)分著色器的輸出,并根據(jù)接收到的數(shù)據(jù)輸出當(dāng)前處理的細(xì)分圖元的各個細(xì)分頂點的屬性值和該細(xì)分圖元在細(xì)分模型中的圖元索引號,以及對各個細(xì)分頂點的重心坐標(biāo)重新賦值并輸出,所述的細(xì)分圖元在細(xì)分模型中的圖元索引號由幾何著色器根據(jù)各個細(xì)分頂點在對應(yīng)的原始圖元上的重心坐標(biāo)計算得到,還用于對該圖元的各個頂點在該細(xì)分圖元上的重心坐標(biāo)賦值并輸出。
[0049]所述步驟(3)中通過如下步驟得到修正像素著色器:
[0050](dl)以幾何著色器的輸出變量為輸入變量,原始像素著色器的輸出變量為輸出變量初始化一個空的像素著色器;
[0051](d2)從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個擬合器作為目標(biāo)擬合器,利用目標(biāo)擬合器替換原始像素著色器中與各個目標(biāo)擬合器的擬合目標(biāo)對應(yīng)的變量或表達(dá)式。
[0052]步驟(d2)以擬合器替換應(yīng)理解為替換原始像素著色器中僅用于計算相應(yīng)的擬合目標(biāo)的所有變量和表達(dá)式。替換后還像素著色器中還應(yīng)該生成相應(yīng)的計算函數(shù),并在替換后的擬合器中通過輸入的細(xì)分圖元在細(xì)分模型中的圖元索引號,選擇該像素所屬細(xì)分圖元上的擬合函數(shù),利用輸入的該像素點所屬細(xì)分圖元的重心坐標(biāo)通過擬合函數(shù)計算替換后的變量或表達(dá)式的取值。
[0053]所述步驟(3)中得到修正著色器后將頂點著色器、幾何著色器細(xì)分著色器以及修正像素著色器中未被用于修正像素著色器輸出變量計算的輸入變量和輸出變量刪除。
[0054]像素著色器中的部分變量和表達(dá)式通過擬合器計算后,原始像素著色器的輸入變量、輸出變量以及函數(shù)中僅用于計算各個擬合目標(biāo)的輸入變量、輸出變量均不需要使用。此夕卜,對應(yīng)頂點著色器、細(xì)分著色器以及幾何著色器中,相應(yīng)的處理過程、輸入變量和輸出變量需要進(jìn)行適應(yīng)調(diào)整,刪除不必要的計算和處理變換流程,從而能夠提高簡化率及并降低簡化后得到的著色器的內(nèi)存開銷。
[0055]所述步驟(3)中得到簡化后的著色器后還包括對得到簡化著色器進(jìn)行篩選:
[0056]利用原始著色器與各個簡化著色器對待渲染模型進(jìn)行渲染,根據(jù)渲染結(jié)果篩選得到若干個作為最終的簡化著色器。
[0057]所述步驟(3)包括如下步驟:
[0058](3-1)將每一個渲染圖像中所有像素點的顏色值按行或列排列成向量;
[0059](3-2)計算各個簡化著色器對應(yīng)的向量與由原始著色器對應(yīng)的向量之間的歐幾里得距離,作為該修正著色器的渲染結(jié)果與原始著色器的渲染結(jié)果之間的渲染誤差;
[0060](3-3)根據(jù)所有簡化著色器的渲染結(jié)果對應(yīng)的渲染誤差、渲染時間和渲染所需的顯存空間,采用帕累托前端方法選擇若干個簡化著色器作為簡化著色器。
[0061]采用帕累托前端方法(帕累托最優(yōu)法)篩選簡化著色器即選擇滿足帕累托前端條件的所有修正著色器。不同情況下,滿足帕累托前端條件的個數(shù)也不同,因此,最終得到待選著色器的個數(shù)并不確定。最終著色器根據(jù)渲染任務(wù)選擇,若渲染任務(wù)需要渲染質(zhì)量,則可以選擇渲染誤差較小的修正著色器,若要求渲染速率快,則可以選擇渲染時間較小的修正著色器。當(dāng)選擇渲染時間較小的修正著色器作為最終著色器,能夠大大提高渲染效率,降低渲染時間消耗和渲染所需的顯存空間,尤其適用于幀速率高的場景的渲染應(yīng)用。
[0062]本發(fā)明還提供了一種基于表面信號擬合和曲面細(xì)分的圖形渲染方法,渲染采用的原始著色器包括原始頂點著色器和原始像素著色器,包括如下步驟:
[0063](SI)設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型;
[0064](S2)從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值;
[0065](S3)根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器;
[0066](S4)從簡化后的著色器中選擇一個對待渲染模型進(jìn)行渲染。
[0067]該渲染方法實際上是先對原始著色器進(jìn)行簡化(具體簡化過程如上所述),然后從簡化后的著色器中選擇一個進(jìn)行對待渲染模型進(jìn)行渲染。
[0068]本發(fā)明還提供了一種基于表面信號擬合和曲面細(xì)分的著色器簡化裝置,待簡化的原始著色器包括原始頂點著色器和原始像素著色器,包括:
[0069]細(xì)分模塊,用于設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型;
[0070]信號擬合模塊,用于從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值;
[0071]著色器生成模塊,用于根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器。
[0072]所述的著色器簡化裝置還包括篩選模塊,所述的篩選模塊用于利用原始著色器與各個修正著色器對待渲染模型進(jìn)行渲染,并根據(jù)渲染結(jié)果選擇若干個簡化著色器作為最優(yōu)簡化著色器。
[0073]本發(fā)明還提供了一種著色器,包括:
[0074]頂點著色器,用于接收當(dāng)前處理的頂點的屬性值,并將接收到的數(shù)據(jù)輸出;
[0075]細(xì)分著色器,用于設(shè)定細(xì)分參數(shù),并根據(jù)按照設(shè)定的細(xì)分參數(shù)細(xì)分后的待渲染模型,輸出當(dāng)前處理的細(xì)分頂點的屬性值以及該細(xì)分頂點在對應(yīng)的原始圖元上的重心坐標(biāo);
[0076]幾何著色器,用于接收細(xì)分著色器的輸出,并根據(jù)接收到的數(shù)據(jù)輸出當(dāng)前處理的細(xì)分圖元的所有細(xì)分頂點的屬性值以及細(xì)分頂點在對應(yīng)的細(xì)分圖元上的重心坐標(biāo),還用于根據(jù)接收到的各個細(xì)分頂點在對應(yīng)原始圖元上的重心坐標(biāo)計算并輸出該細(xì)分圖元在細(xì)分模型中的圖元索引號,還用于對輸入的圖元的各個頂點在細(xì)分模型上的重心坐標(biāo)賦值并輸出;
[0077]像素著色器,用于根據(jù)所述幾何著色器的輸出計算當(dāng)前處理的像素點的顏色值以渲染該像素點,在計算過程中的若干個變量或表達(dá)式在細(xì)分后的待渲染模型中相應(yīng)的細(xì)分圖元上的取值利用擬合器計算得到,所述的擬合器利用表面信號擬合法計算該目標(biāo)變量或目標(biāo)表達(dá)式在細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值,所述的細(xì)分模型通過對待渲染模型按照與幾何著色器相同的細(xì)分參數(shù)細(xì)分得到。
[0078]本發(fā)明還提供了一種存儲有計算機(jī)程序的計算機(jī)可讀存儲介質(zhì),其中所述計算機(jī)程序使計算機(jī)執(zhí)行:
[0079]步驟1:設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型;
[0080]步驟2:從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值;
[0081]步驟3:根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器。
[0082]所述計算機(jī)程序還使計算機(jī)執(zhí)行如下步驟:
[0083]利用原始著色器與各個修正著色器對待渲染模型進(jìn)行渲染,根據(jù)渲染結(jié)果選擇若干個修正著色器作為簡化著色器。
[0084]本發(fā)明還提供了另一種存儲有計算機(jī)程序的計算機(jī)可讀存儲介質(zhì),其中所述計算機(jī)程序使計算機(jī)執(zhí)行:
[0085]步驟1:設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型;
[0086]步驟2:從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值;
[0087]步驟3:根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器。
[0088]步驟4:從簡化后的著色器中選擇一個對待渲染模型進(jìn)行渲染。
[0089]本發(fā)明中未作特殊說明,輸入變量和輸出變量均包括對應(yīng)的變量的變量名和數(shù)據(jù)類型。本發(fā)明中原始著色器和簡化后的著色器(修正著色器),包括頂點著色器、細(xì)分著色器、幾何著色器、像素著色器等均采用著色器語言(包括HLSL、GLSL、CG等)編寫的源代碼。為能夠操作,本發(fā)明中生成的頂點著色器、細(xì)分著色器、幾何著色器和像素著色器時均是先生成對應(yīng)的抽象語法樹,再轉(zhuǎn)化為基于著色器語言的代碼。
[0090]與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點在于:
[0091](a)通過對原始著色器進(jìn)行簡化得到簡化后的著色器,與原始著色器比較,簡化后的著色器的像素著色器中的部分(或全部)變量或表達(dá)式采用擬合器計算,原始的代碼計算變量或表達(dá)式,可能需要大量的計算,甚至幾百個指令,而利用擬合器計算時只需使用有限個乘法和加法即可計算得到,降低了像素著色器的計算量,大大提高了渲染效率,縮短了渲染時間;
[0092](b)插入了細(xì)分著色器和幾何著色器,在渲染時對待渲染模型進(jìn)行細(xì)分,提高了渲染質(zhì)量;
[0093](C)首先生成若干個修正著色器,再根據(jù)渲染任務(wù)選擇最終著色器,能夠根據(jù)實際情況靈活選擇不同的渲染方案,提高了最終著色器的適用范圍;
[0094](d)能夠自動完成簡化,不需要人工干預(yù)。
【專利附圖】
【附圖說明】
[0095]圖1為本實施例的著色器簡化方法的原理圖。
【具體實施方式】
[0096]下面將結(jié)合具體實施例和附圖對本發(fā)明進(jìn)行詳細(xì)說明。
[0097]本實施例中待簡化的原始著色器包括原始頂點著色器和原始像素著色器。一種基于表面信號擬合和曲面細(xì)分的著色器簡化方法的簡化原理如圖1所示,包括:
[0098](I)設(shè)定若干組細(xì)分參數(shù),通過圖形硬件流水線中固定細(xì)分函數(shù)的計算方法按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型。
[0099]每組細(xì)分參數(shù)包括:每個圖元內(nèi)部細(xì)分的層數(shù)、每個圖元在每層細(xì)分時每條邊的細(xì)分?jǐn)?shù)目與細(xì)分步長。對于三角形圖元,則分別針對每一條邊設(shè)置3個邊長細(xì)分參數(shù)(細(xì)分?jǐn)?shù)目與細(xì)分步長),即對應(yīng)有3細(xì)分?jǐn)?shù)目與細(xì)分步長。設(shè)定的細(xì)分參數(shù)的組數(shù)可根據(jù)實際應(yīng)用需求調(diào)整,設(shè)定的細(xì)分參數(shù)的組數(shù)通常為4?256組(本實施例中為256組)。
[0100]本實施例中針對每一組細(xì)分參數(shù)形成相應(yīng)的第一著色器,然后利用形成的第一著色器對待渲染模型進(jìn)行細(xì)分,其中通過如下步驟生成第一著色器:
[0101](1-1)以頂點的屬性值和頂點索引號作為輸入變量和輸出變量生成第一頂點著色器,該第一頂點著色器用于將各個輸入變量的值賦值給相應(yīng)的輸出變量;
[0102](1-2)針對任意一組細(xì)分參數(shù),根據(jù)當(dāng)前組細(xì)分參數(shù)生成第一細(xì)分著色器,該細(xì)分著色器用于根據(jù)第一頂點著色器輸出的頂點的屬性值和頂點索引號,通過圖形硬件流水線中固定細(xì)分函數(shù)的計算方法按照當(dāng)前組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,并根據(jù)細(xì)分結(jié)果輸出細(xì)分頂點的屬性值,以及各個細(xì)分頂點所在的原始圖元的所有頂點的頂點索引號和各個頂點在該原始圖元上的重心坐標(biāo);
[0103](1-3)生成第一幾何著色器,該第一幾何著色器用于接收第一細(xì)分著色器的輸出,并根據(jù)接收到的數(shù)據(jù)輸出當(dāng)前處理的細(xì)分圖元的所有細(xì)分頂點的屬性值、所有細(xì)分頂點所在的原始圖元的所有頂點的頂點索引號和在該原始圖元上的重心坐標(biāo)、以及該細(xì)分圖元所在的原始圖元的細(xì)分索引號,細(xì)分索引號為第一幾何著色器根據(jù)各個細(xì)分頂點在該原始圖元上的重心坐標(biāo)計算得到;還用于對該細(xì)分圖元的所有細(xì)分頂點在對應(yīng)細(xì)分圖元上的重心坐標(biāo)賦值并輸出;
[0104](1-4)分別將每一個第一細(xì)分著色器與第一頂點著色器、第一幾何著色器和原始像素著色器組合得到相應(yīng)的第一著色器,利用各個第一著色器渲染待渲染模型,將渲染過程中各個第一著色器中的第一幾何著色器的輸出作為相應(yīng)的細(xì)分模型。
[0105](2)從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值,包括如下步驟:
[0106](2-1)在當(dāng)前細(xì)分模型中的每個細(xì)分圖元上設(shè)定若干個樣本點(本實施例中為16個);
[0107](2-2)將原始像素著色器中當(dāng)前擬合目標(biāo)對應(yīng)的程序點之前,與計算當(dāng)前擬合目標(biāo)相關(guān)的語句作為對應(yīng)的目標(biāo)片段,將各個樣本點的屬性值作為對應(yīng)的目標(biāo)片段的輸入,針對當(dāng)前細(xì)分模型中任意一個細(xì)分圖元上所有樣本點對應(yīng)的輸出,以該細(xì)分圖元對應(yīng)的所有的輸出作為該擬合目標(biāo)在細(xì)分圖元上生成的表面信號,用設(shè)定的擬合基函數(shù)對該表面信號函數(shù)進(jìn)行擬合得到擬合函數(shù);
[0108](2-3)生成擬合器,該擬合器用于根據(jù)當(dāng)前像素點在對應(yīng)細(xì)分圖元上的重心坐標(biāo),利用相應(yīng)的擬合函數(shù)(即當(dāng)前像素點在細(xì)分模型中所在的細(xì)分圖元上對應(yīng)的擬合函數(shù))計算當(dāng)前擬合目標(biāo)在對應(yīng)的細(xì)分圖元上的取值,對應(yīng)的細(xì)分圖元為當(dāng)前像素點在細(xì)分模型中所在的細(xì)分圖元。
[0109]本實施例中擬合目標(biāo)為原始像素著色中所有的變量與表達(dá)式的個數(shù)。以所有移動目標(biāo)作為擬合目標(biāo)集合,分別對應(yīng)于變量I?變量r,以及表達(dá)式I?表達(dá)式m。每個擬合器均對應(yīng)不同的擬合目標(biāo)或細(xì)分模型,將得到的擬合器分別記為擬合器I?擬合器P,P的取值與擬合目標(biāo)的個數(shù)和細(xì)分模型相關(guān)。
[0110]本實施例中擬合時采用最小二乘法,擬合基函數(shù)為擬合貝塞爾三角曲面函數(shù),得到的擬合函數(shù)為具有控制頂點的貝塞爾三角曲面函數(shù)。此時,擬合器根據(jù)以下公式:
[0111]~ Σ {?/?{? B (β.(., Cps/i
[0112]計算當(dāng)前擬合目標(biāo)在對應(yīng)的細(xì)分圖元上的取值val,其中,(s,t)為當(dāng)前像素點所在的細(xì)分圖元的重心坐標(biāo),是關(guān)于(s,t)的貝塞爾二元三角多項式(即貝塞爾三角曲面函數(shù)),Cpijl為擬合函數(shù)的控制頂點控制點值,其中η為貝塞爾二元三角多項式的階數(shù)(本實施例η = 2),本發(fā)明中采用二階貝塞爾二元三角多項式,1、j、l為求和的下標(biāo),取值范圍為O到η。
[0113]本實施例中擬合目標(biāo)的個數(shù)為原始像素著色中的函數(shù)的所有變量。
[0114]本實施例中當(dāng)前像素點指待渲染模型中當(dāng)前處理的像素點。
[0115](3)根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器。
[0116]通過如下步驟生成頂點著色器:
[0117](al)分別以原始頂點著色器的輸入變量和輸出變量作為輸入變量和輸出變量,初始化一個空的頂點著色器;
[0118](a2)向步驟(al)處理后的頂點著色器添加主函數(shù),所述的主函數(shù)用于將輸入變量的值賦值給相應(yīng)的輸出變量。
[0119]本實施例的著色器基于DirectX實現(xiàn),對于DirectX,細(xì)分著色器包括外殼著色器和域著色器,通過如下步驟生成細(xì)分著色器:
[0120](bl)以原始頂點著色器的輸出變量作為輸入變量與輸出變量,初始化一個空的外殼著色器;
[0121](b2)設(shè)置該外殼著色器中的細(xì)分參數(shù)為相應(yīng)細(xì)分模型對應(yīng)的一組細(xì)分參數(shù);
[0122](b3)在空的外殼著色器中插入主函數(shù),所述的主函數(shù)用于將輸入變量賦值給相應(yīng)的輸出變量;
[0123](b4)以外殼著色器的輸出變量作為輸入變量,以原始像素著色器的輸入變量以及細(xì)分圖元的細(xì)分頂點在對應(yīng)的原始圖元上的重心坐標(biāo)為輸出變量,初始化一個域著色器;
[0124](b5)在域著色器中插入主函數(shù),所述的主函數(shù)用于將輸入變量賦值給相應(yīng)的輸出變量;
[0125](b6)將原始頂點著色器的主函數(shù)插入到域著色器的主函數(shù)中。
[0126]根據(jù)原始頂點著色器,針對每一個細(xì)分模型,通過如下步驟生成幾何著色器:
[0127](Cl)以細(xì)分著色器的輸出變量為輸入變量,以原始像素著色器的輸入變量以及該細(xì)分圖元在細(xì)分模型中的圖元索引號作為輸出變量,初始化一個空的幾何著色器;
[0128](c2)向步驟(Cl)處理后的幾何著色器添加主函數(shù),該主函數(shù)用于將輸入變量的值賦值給相應(yīng)的輸出變量,還用于根據(jù)各個細(xì)分頂點計算在對應(yīng)原始圖元上的重心坐標(biāo)值計算該細(xì)分圖元在原始圖元上的細(xì)分位置,并利用細(xì)分位置計算該細(xì)分圖元在細(xì)分模型中的圖元索引號,并將計算結(jié)果賦值給相應(yīng)的輸出變量,還用于對表示細(xì)分圖元各個頂點的重心坐標(biāo)的輸出變量重新賦值。
[0129]幾何著色器的主函數(shù)通過以下步驟計算細(xì)分圖元在細(xì)分模型中的圖元索引號:
[0130]獲得幾何著色器當(dāng)前處理的細(xì)分圖元的重心的重心坐標(biāo)P,判斷其從屬于哪一個區(qū)域edge_id。(將原始圖元的重心與圖元各個頂點相連,可以將圖元分為若干個區(qū)域)。
[0131]獲取該重心坐標(biāo)屬于細(xì)分層的那一層,設(shè)重心的中心坐標(biāo)中最小的為t。則層數(shù)layer = floor(3*t*n/2);計算該重心坐標(biāo)在層數(shù)layer中屬于第幾個圖元,計算過程如下:
[0132]計算當(dāng)前細(xì)分層的圖元邊的細(xì)分個數(shù)segment_num = η - 2*layer ;
[0133]計算在當(dāng)前細(xì)分層。當(dāng)前細(xì)分邊的兩個端點重心坐標(biāo)xO,x2,每一個細(xì)分邊的長度segment_length,并計算出當(dāng)前重心坐標(biāo)投影到細(xì)分邊上的長度d,和投影點所在的細(xì)分邊序號,segment_id ;
[0134]xO = (2*layer/(3*n),1-(4*layer/(3*n)),l_2*layer/(3*n) - (1-(4*layer/(3*n)));
[0135]y2 = (x0.x, x0.z, x0.y);
[0136]segment_length = 1.414/n ;
[0137]d = abs(dot ((p - xO)*(x2 - xO))/(segment_length*segment_num));
[0138]segment_id = floor (d/segment_length);
[0139]計算當(dāng)前重心所作點是屬于上三角性還是下三角形up_and_down
[0140]如果(P.χ-χ0.χ) >1/ (3*η)則 up_and_down = 2 ;否則 up_and_down = I。
[0141]獲取在當(dāng)前細(xì)分層的索引local_index = (segment_num_l) *2*edge_id+ (segment_num_l)*2+up_and_down ;
[0142]計算比當(dāng)前層layer外圈的三角形個數(shù)outer_triangle。
[0143]針對每一個細(xì)分層layer_id〈layer。
[0144]此層的三角形個數(shù)為outer_triangle+ = (η - 2*layer_id_l) *2*3.
[0145]最終的三角形索引號為outer_triangle+local_index。
[0146]該主函數(shù)還用于對表示細(xì)分圖元各個頂點的重心坐標(biāo)的輸出變量重新賦值,若細(xì)分圖元為三角形,則賦值分別為(0,0,1)、(0,1,0)和(1,0,0)。
[0147]通過如下步驟得到修正像素著色器:
[0148](dl)以幾何著色器的輸出變量為輸入變量,原始像素著色器的輸出變量為輸出變量初始化一個空的像素著色器;
[0149](d2)從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個擬合器作為目標(biāo)擬合器,利用目標(biāo)擬合器替換原始像素著色器中與各個目標(biāo)擬合器的擬合目標(biāo)對應(yīng)的變量或表達(dá)式。
[0150]本實施例中將生成的幾何著色器記為幾何著色器I?幾何著色器k,細(xì)分著色器記為細(xì)分著色器I?細(xì)分著色器k,修正像素著色器記為修正像素著色器I?修正像素著色器k,k的取值與細(xì)分參數(shù)的組數(shù)和擬合目標(biāo)的個數(shù)有關(guān),通過將對應(yīng)的各部分組合得到相應(yīng)的修正著色器。
[0151]本實施例的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,步驟(3)中得到修正著色器后還包括如下步驟:
[0152]首先,根據(jù)該修正著色器中的修正像素著色器刪除該修正像素著色器中的頂點著色器、幾何著色器以及細(xì)分著色器中未被修正像素著色器使用的輸入變量、輸出變量以及表達(dá)式。
[0153]本實施例的著色器簡化方法在得到簡化著色器后還利用原始著色器與各個簡化著色器對待渲染模型進(jìn)行渲染,根據(jù)渲染結(jié)果對簡化著色器進(jìn)行篩選得到若干個作為最優(yōu)簡化著色器。本實施例的渲染結(jié)果包括渲染圖像、渲染時間和渲染所需的顯存空間。修正著色器對應(yīng)的渲染結(jié)果即為渲染結(jié)果I?渲染結(jié)果k。原始著色器的渲染結(jié)果記為原始渲染結(jié)果。本實施例中渲染在渲染流水線中使用各個著色器進(jìn)行,首先將待渲染模型和相應(yīng)的著色器輸入到渲染流水線中,渲染過程中,待渲染模型作為相應(yīng)的著色器的輸入,輸入到著色器中。
[0154]篩選具體如下:
[0155](3-1)將每一個渲染圖像中所有像素點的顏色值按行或列排列成向量;
[0156](3-2)計算各個簡化著色器(此處即為修正著色器)對應(yīng)的向量與由原始著色器對應(yīng)的向量之間的歐幾里得距離,作為該簡化著色器的渲染結(jié)果與原始著色器的渲染結(jié)果之間的渲染誤差;
[0157](3-3)根據(jù)所有修正著色器的渲染結(jié)果對應(yīng)的渲染誤差、渲染時間和渲染所需的顯存空間,采用帕累托前端方法選擇若干個簡化著色器作為簡化著色器。
[0158]本實施例中以原始著色器對待渲染模型進(jìn)行渲染時的時間為0.05毫秒,簡化后著色器中渲染時間最短為0.005毫秒,渲染所需的顯存空間最小為1MB,渲染誤差最小為O。
[0159]基于以上簡化方法得到的簡化著色器,根據(jù)需要選擇一個對待渲染模型進(jìn)行渲染。
[0160]本實施例的著色器簡化方法,通過基于表面信號擬合和曲面細(xì)分的著色器簡化裝置實現(xiàn),該著色器簡化裝置包括:
[0161]細(xì)分模塊,用于設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型;
[0162]信號擬合模塊,用于從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值;
[0163]著色器生成模塊,用于根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正像素著色器,并以各個修正著色器作為簡化著色器;
[0164]篩選模塊,用于利用原始著色器與各個修正著色器對待渲染模型進(jìn)行渲染,并根據(jù)渲染結(jié)果選擇若干個修正著色器作為簡化著色器。
[0165]本實施例中原始著色器和最終得到的簡化著色器、以及中間形成的像素著色器、細(xì)分著色、幾何著色器等均采用著色器語言編寫,在簡化過程中,基于著色器語言編寫的著色器不能直接操作,需要轉(zhuǎn)化為相應(yīng)的抽象語法樹,通過對抽象語法樹進(jìn)行操作(實際操作對應(yīng)為抽象語法樹的各個節(jié)點,可以執(zhí)行移動、復(fù)制、刪除、添加等操作),對像素著色器完成所有操作后,再轉(zhuǎn)化為著色器語言,進(jìn)而完成對著色器的操作。下面以形成頂點著色器為例進(jìn)行說明:
[0166]先將原始頂點著色器轉(zhuǎn)化為抽象語法樹,并初始一個空的頂點著色器對應(yīng)的抽象語法樹,將原始頂點著色對應(yīng)的抽象語法樹中對應(yīng)于原始頂點著色器的輸入變量和輸出變量的節(jié)點復(fù)制到初始化得到的頂點著色器對應(yīng)的抽象語法樹中,并繼續(xù)向該抽象語法樹中添加主函數(shù)對應(yīng)的節(jié)點。添加完成后再將得到的抽象語法樹轉(zhuǎn)化為著色器語言,即得到相應(yīng)的頂點著色器。
[0167]本申請實施例的各模塊或各步驟可以用通用的計算裝置來實現(xiàn),可選地,它們可以用計算裝置可執(zhí)行的程序代碼來實現(xiàn),從而可以將它們存儲在存儲裝置中由計算裝置來執(zhí)行,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實現(xiàn)。因此,本申請實施例不限制于任何特定的硬件和軟件結(jié)合。
[0168]以上所述僅為本發(fā)明的最優(yōu)選實施例,并不用于限制本發(fā)明,凡在本發(fā)明的原則范圍內(nèi)所做的任何修改、補(bǔ)充和等同替換等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種基于表面信號擬合和曲面細(xì)分的著色器簡化方法,待簡化的原始著色器包括原始頂點著色器和原始像素著色器,其特征在于,包括: (1)設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型; (2)從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值; (3)根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器。
2.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,每組細(xì)分參數(shù)包括:每個圖元內(nèi)部細(xì)分的層數(shù)、每個圖元在每層細(xì)分時每條邊的細(xì)分?jǐn)?shù)目與細(xì)分步長。
3.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(I)中通過圖形硬件流水線中固定細(xì)分函數(shù)的計算方法按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分。
4.如權(quán)利要求3所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(I)針對每一組細(xì)分參數(shù)形成相應(yīng)的第一著色器對待渲染模型進(jìn)行細(xì)分,所述的第一著色器通過如下步驟生成: (1-1)以頂點的屬性值和頂點索引號作為輸入變量和輸出變量生成第一頂點著色器,所述的第一頂點著色器用于將各個輸入變量的值賦值給相應(yīng)的輸出變量; (1-2)針對任意一組細(xì)分參數(shù),根據(jù)當(dāng)前組細(xì)分參數(shù)生成第一細(xì)分著色器,所述的細(xì)分著色器用于根據(jù)第一頂點著色器輸出的頂點的屬性值和頂點索引號,通過圖形硬件流水線中固定細(xì)分函數(shù)的計算方法按照當(dāng)前組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,并根據(jù)細(xì)分結(jié)果輸出細(xì)分頂點的屬性值,以及各個細(xì)分頂點所在的原始圖元的所有頂點的頂點索引號和各個頂點在該原始圖元上的重心坐標(biāo); (1-3)生成第一幾何著色器,所述的第一幾何著色器用于接收第一細(xì)分著色器的輸出,并根據(jù)接收到的數(shù)據(jù)輸出當(dāng)前處理的細(xì)分圖元的所有細(xì)分頂點的屬性值、所有細(xì)分頂點所在的原始圖元的所有頂點的頂點索引號和在該原始圖元上的重心坐標(biāo)、以及該細(xì)分圖元所在的原始圖元的細(xì)分索引號,所述的細(xì)分索引號為第一幾何著色器根據(jù)各個細(xì)分頂點在該原始圖元上的重心坐標(biāo)計算得到;還用于對該細(xì)分圖元的所有細(xì)分頂點在對應(yīng)細(xì)分圖元上的重心坐標(biāo)賦值并輸出; (1-4)分別將每一個第一細(xì)分著色器與第一頂點著色器、第一幾何著色器和原始像素著色器組合得到相應(yīng)的第一著色器,利用各個第一著色器渲染待渲染模型,將渲染過程中各個第一著色器中的第一幾何著色器的輸出作為相應(yīng)的細(xì)分模型。
5.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(2)包括如下步驟: (2-1)在當(dāng)前細(xì)分模型中的每個細(xì)分圖元上設(shè)定若干個樣本點; (2-2)將原始像素著色器中當(dāng)前擬合目標(biāo)對應(yīng)的程序點之前,與計算當(dāng)前擬合目標(biāo)相關(guān)的語句作為對應(yīng)的目標(biāo)片段,將各個樣本點的屬性值作為對應(yīng)的目標(biāo)片段的輸入,針對當(dāng)前細(xì)分模型中任意一個細(xì)分圖元上所有樣本點對應(yīng)的輸出,以該細(xì)分圖元對應(yīng)的所有的輸出作為該擬合目標(biāo)在細(xì)分圖元上生成的表面信號,用設(shè)定的擬合基函數(shù)對該表面信號函數(shù)進(jìn)行擬合得到擬合函數(shù); (2-3)生成擬合器,所述的擬合器用于根據(jù)當(dāng)前像素點對應(yīng)的細(xì)分圖元的重心坐標(biāo),利用所述的擬合函數(shù)計算當(dāng)前擬合目標(biāo)在對應(yīng)的細(xì)分圖元上的取值,對應(yīng)的細(xì)分圖元為當(dāng)前像素點在細(xì)分模型中所在的細(xì)分圖元。
6.如權(quán)利要求5所述的基于表面信號擬合的著色器中像素著色器的簡化方法,其特征在于,所述的擬合目標(biāo)的個數(shù)為原始像素著色中的變量與表達(dá)式的個數(shù)的20?100%。
7.如權(quán)利要求5所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(2)采用最小二乘法進(jìn)行擬合,采用的擬合基函數(shù)為貝塞爾曲面函數(shù)。
8.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(3)中通過如下步驟生成頂點著色器: (al)分別以原始頂點著色器的輸入變量和輸出變量作為輸入變量和輸出變量,初始化一個空的頂點著色器; (a2)向步驟(al)處理后的頂點著色器添加主函數(shù),所述的主函數(shù)用于將輸入變量的值賦值給相應(yīng)的輸出變量。
9.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,對于DirectX,所述的細(xì)分著色器包括外殼著色器和域著色器,通過如下步驟生成細(xì)分著色器: (bl)以原始頂點著色器的輸出變量作為輸入變量與輸出變量,初始化一個空的外殼著色器; (b2)設(shè)置該外殼著色器中的細(xì)分參數(shù)為相應(yīng)細(xì)分模型對應(yīng)的一組細(xì)分參數(shù); (b3)在空的外殼著色器中插入主函數(shù),所述的主函數(shù)用于將輸入變量賦值給相應(yīng)的輸出變量; (b4)以外殼著色器的輸出變量作為輸入變量,以原始像素著色器的輸入變量以及細(xì)分圖元的細(xì)分頂點在對應(yīng)的原始圖元上的重心坐標(biāo)為輸出變量,初始化一個域著色器; (b5)在域著色器中插入主函數(shù),所述的主函數(shù)用于將輸入變量賦值給相應(yīng)的輸出變量; (b6)將原始頂點著色器的主函數(shù)插入到域著色器的主函數(shù)中; 對于OpenGL,所述的細(xì)分著色器包括細(xì)分評估著色器和細(xì)分控制著色器,通過步驟(bl)和(b6)生成,所不同的是生成是細(xì)分評估著色器和細(xì)分控制著色器。
10.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(3)中通過如下步驟生成幾何著色器: (Cl)以所述細(xì)分著色器的輸出變量為輸入變量,以原始像素著色器的輸入變量以及該細(xì)分圖元在細(xì)分模型中的圖元索引號作為輸出變量,初始化一個空的幾何著色器; (c2)向步驟(cl)處理后的幾何著色器添加主函數(shù),所述的主函數(shù)用于將輸入變量的值賦值給相應(yīng)的輸出變量,還用于根據(jù)各個細(xì)分頂點計算在對應(yīng)原始圖元上的重心坐標(biāo)值計算該細(xì)分圖元在原始圖元上的細(xì)分位置,并利用所述細(xì)分位置計算該細(xì)分圖元在細(xì)分模型中的圖元索引號,并將計算結(jié)果賦值給相應(yīng)的輸出變量,還用于對表示細(xì)分圖元各個頂點的重心坐標(biāo)的輸出變量重新賦值。
11.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(3)中通過如下步驟得到修正像素著色器: (dl)以幾何著色器的輸出變量為輸入變量,原始像素著色器的輸出變量為輸出變量初始化一個空的像素著色器; (d2)從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個擬合器作為目標(biāo)擬合器,利用目標(biāo)擬合器替換原始像素著色器中與各個目標(biāo)擬合器的擬合目標(biāo)對應(yīng)的變量或表達(dá)式。
12.如權(quán)利要求1所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(3)中得到修正著色器后將頂點著色器、幾何著色器細(xì)分著色器以及修正像素著色器中未被用于修正像素著色器輸出變量計算的輸入變量和輸出變量刪除。
13.如權(quán)利要求1?12中任意一項權(quán)利要求所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述步驟(3)中得到簡化后的著色器后還包括對得到簡化著色器進(jìn)行篩選: 利用原始著色器與各個簡化著色器對待渲染模型進(jìn)行渲染,根據(jù)渲染結(jié)果篩選得到若干個作為最終的簡化著色器。
14.如權(quán)利要求13所述的基于表面信號擬合和曲面細(xì)分的著色器簡化方法,其特征在于,所述的渲染結(jié)果包括渲染圖像、渲染時間和渲染所需的顯存空間,所述步驟(3)包括如下步驟: (3-1)將每一個渲染圖像中所有像素點的顏色值按行或列排列成向量; (3-2)計算各個簡化著色器對應(yīng)的向量與由原始著色器對應(yīng)的向量之間的歐幾里得距離,作為該修正著色器的渲染結(jié)果與原始著色器的渲染結(jié)果之間的渲染誤差; (3-3)根據(jù)所有簡化著色器的渲染結(jié)果對應(yīng)的渲染誤差、渲染時間和渲染所需的顯存空間,采用帕累托前端方法選擇若干個簡化著色器作為簡化著色器。
15.一種基于表面信號擬合和曲面細(xì)分的圖形渲染方法,渲染采用的原始著色器包括原始頂點著色器和原始像素著色器,其特征在于,包括如下步驟: (51)設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型; (52)從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值; (53)根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器; (S4)從簡化后的著色器中選擇一個對待渲染模型進(jìn)行渲染。
16.一種基于表面信號擬合和曲面細(xì)分的著色器簡化裝置,待簡化的原始著色器包括原始頂點著色器和原始像素著色器,其特征在于,包括: 細(xì)分模塊,用于設(shè)定若干組細(xì)分參數(shù),按照每一組細(xì)分參數(shù)對待渲染模型進(jìn)行細(xì)分,得到相應(yīng)的細(xì)分模型; 信號擬合模塊,用于從原始像素著色器的函數(shù)中選擇若干個變量或表達(dá)式作為擬合目標(biāo),針對每一個擬合目標(biāo),分別生成與各個細(xì)分模型對應(yīng)的擬合器,所述的擬合器用于對該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上生成的表面信號進(jìn)行擬合,并根據(jù)擬合結(jié)果計算該擬合目標(biāo)在當(dāng)前細(xì)分模型中對應(yīng)的細(xì)分圖元上的取值; 著色器生成模塊,用于根據(jù)原始頂點著色器生成頂點著色器、幾何著色器,針對任意一個細(xì)分模型,根據(jù)該細(xì)分模型對應(yīng)的細(xì)分參數(shù)生成一個細(xì)分著色器,并從當(dāng)前細(xì)分模型對應(yīng)的所有擬合器中選擇若干個替換原始像素著色器中對應(yīng)的變量或表達(dá)式得到修正像素著色器,并將該修正像素著色器與頂點著色器、幾何著色器以及當(dāng)前細(xì)分模型對應(yīng)的細(xì)分著色器組合得到相應(yīng)的修正著色器,并以各個修正著色器作為簡化著色器。
17.如權(quán)利要求16所述的基于表面信號擬合和曲面細(xì)分的著色器簡化裝置,其特征在于,還包括篩選模塊,所述的篩選模塊用于利用原始著色器與各個修正著色器對待渲染模型進(jìn)行渲染,并根據(jù)渲染結(jié)果選擇若干個簡化著色器作為最優(yōu)簡化著色器。
【文檔編號】G06T15/10GK104183008SQ201410373494
【公開日】2014年12月3日 申請日期:2014年7月31日 優(yōu)先權(quán)日:2014年7月31日
【發(fā)明者】王銳, 鮑虎軍, 楊先津, 袁亞振 申請人:浙江大學(xué)