一種基于代碼移動(dòng)的著色器簡(jiǎn)化方法、裝置及圖形渲染方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及圖形渲染技術(shù)領(lǐng)域,尤其涉及一種基于代碼移動(dòng)的著色器簡(jiǎn)化方法、裝置及圖形渲染方法。
【背景技術(shù)】
[0002]圖形渲染的主要功能是根據(jù)給定的待渲染模型,在屏幕上生成(渲染)二維圖像。其中,場(chǎng)景物體在屏幕上的形狀和位置由待渲染模型本身的幾何、相機(jī)的方位和參數(shù)決定。而待渲染模型在屏幕上的外觀則由待渲染模型的材質(zhì)屬性、光源屬性、紋理和設(shè)置的光照明模型決定。圖形渲染的整個(gè)流程被分成一系列的階段,這些階段之間是線性串聯(lián)的關(guān)系,前一階段的輸出是后一階段的輸入,前一階段沒(méi)有完成,則后一階段不會(huì)啟動(dòng),這種形式稱之為渲染流水線或者渲染管線。由于計(jì)算性能對(duì)于渲染的重要性,當(dāng)前渲染流水線都由特制的計(jì)算機(jī)硬件--圖形處理單元(GPUs)來(lái)專門進(jìn)行計(jì)算。
[0003]由于圖形技術(shù)水平和圖形硬件的發(fā)展水平的限制,早期的圖形渲染大多使用的是固定功能的渲染流水線。所謂固定功能渲染流水線就是預(yù)先將渲染管線中各個(gè)階段的功能定義好,在渲染啟動(dòng)時(shí)只需要設(shè)置管線各個(gè)階段的渲染狀態(tài),再將頂點(diǎn)數(shù)據(jù)送入流水線,整個(gè)渲染流程不再施加額外的干預(yù)。在這種渲染方式中,管線的功能都已經(jīng)固化,故稱為固定功能渲染流水線。
[0004]隨著圖形技術(shù)和圖形硬件技術(shù)的發(fā)展,固定功能流水線已經(jīng)不能滿足人們對(duì)高品質(zhì)畫面追求。為了追求更出色的渲染效果,人們將固定管線中的一些階段進(jìn)行了改進(jìn),使之不再執(zhí)行固定的功能,而可以通過(guò)用戶定制的代碼來(lái)控制這個(gè)階段的操作,實(shí)現(xiàn)更豐富的功能。改進(jìn)過(guò)后的渲染流水線稱之為定制流水線,也稱之為可編程流水線。
[0005]在可編程流水線中,由用戶定制的代碼被稱為著色器(Shader)。根據(jù)渲染管線不同階段所提供可定制功能的不同,最新的可編程流水線提供了 5種著色器,根據(jù)數(shù)據(jù)渲染的流程,依次為頂點(diǎn)著色器(Vertex Shader)、細(xì)分著色器(Tesselat1n Shader,包含2種著色器,對(duì)于DirectX,細(xì)分著色器包括外殼著色器(Hull Shader)和域著色器(DomainShader);對(duì)于OpenGL,細(xì)分著色器包括細(xì)分評(píng)估著色器和細(xì)分控制著色器)、幾何著色器(Geometry Shader)和像素著色器(Fragment Shader) ο以上5個(gè)著色器按照功能可分為3類。第一類著色器是頂點(diǎn)著色器,處理頂點(diǎn)信息。第二類著色器是幾何處理著色器,包括幾何著色器和細(xì)分著色器,用于計(jì)算并輸出新的幾何圖元。第三類是像素著色器,其輸入為插值后的幾何屬性并且輸出為像素的顏色值。通過(guò)這些著色器,渲染流水線中不同階段的不同硬件資源、不同硬件處理模式被暴露出來(lái)可以供用戶操作與使用,從而編寫具有特定計(jì)算功能的著色器程序。
[0006]由于可編程流水線所提供的可定制功能的著色器,給使用者提供了廣闊的可定制功能,當(dāng)前的很多應(yīng)用程序如視頻游戲、可視化、高真實(shí)感繪制等都依賴于高性能的著色器計(jì)算。但是,著色器程序編寫的質(zhì)量很大程度上依賴于程序員的經(jīng)驗(yàn)。盡管有一些規(guī)則和工具集來(lái)處理交互式建模和著色器程序優(yōu)化,整個(gè)渲染過(guò)程仍然耗時(shí),并且也不是最高效的。因此,人們開展了一些工作進(jìn)行自動(dòng)的著色器優(yōu)化,并且取得了很好的結(jié)果。
[0007]自動(dòng)的著色器優(yōu)化方法,以用戶編寫的著色器代碼和待渲染場(chǎng)景為外部輸入數(shù)據(jù),通過(guò)對(duì)著色器代碼使用渲染流水線硬件資源的分析與處理,實(shí)現(xiàn)對(duì)繪制流水線硬件資源的優(yōu)化配置與調(diào)整,實(shí)現(xiàn)對(duì)待渲染模型渲染結(jié)果質(zhì)量、渲染所需時(shí)間以及渲染過(guò)程所需顯存空間的改變,從而提高圖形處理單元(GPUs)的計(jì)算性能,滿足用戶的需要。
[0008]一般地,對(duì)于整個(gè)著色器,最耗時(shí)的渲染計(jì)算都在像素著色器部分,因此以前的方法主要的目標(biāo)都在優(yōu)化像素著色器的計(jì)算。Pellacini提供了一個(gè)用戶可配置的著色器簡(jiǎn)化方法來(lái)進(jìn)行逐像素的過(guò)程建模。程序生成一系列由原始著色器逐步簡(jiǎn)化生成的著色器。該方法通過(guò)對(duì)著色器的代碼應(yīng)用指定的簡(jiǎn)化規(guī)則來(lái)生成一系列的候選變種,然后評(píng)估變種與原始著色器之間度量的差來(lái)選擇具有最小誤差的候選變種。這種選擇過(guò)程一直循環(huán)直到最后的著色器成為了常量。Sitth1-amorn使用遺傳編程來(lái)自動(dòng)簡(jiǎn)化渲染過(guò)程。與Pellacini類似,該算法同樣計(jì)算一系列逐步簡(jiǎn)化的著色器,但考慮了更多的代碼變換規(guī)貝1J,包括代碼中表達(dá)式語(yǔ)句中操作數(shù)與操作符的交換、語(yǔ)句的刪除和語(yǔ)句的插入等,同時(shí)該方法使用遺傳算法來(lái)選取更多的簡(jiǎn)化后的著色器,并且也能生成更快的和更可靠的結(jié)果。
[0009]而Nehab和Sitth1-amorn提供了一個(gè)像素重投影的方式來(lái)優(yōu)化像素渲染。該方法中提供了一個(gè)緩存策略,利用實(shí)時(shí)渲染中固有的時(shí)空一致性,在高幀率的環(huán)境下,當(dāng)每生成一幀時(shí),算法將可見(jiàn)表面點(diǎn)上的指定數(shù)據(jù)存儲(chǔ)到一個(gè)視口大小的離屏緩存里。當(dāng)在后續(xù)幀中生成像素時(shí),算法重投影像素的表面位置到上一幀中來(lái)判定該像素是否在上一幀中可見(jiàn),如果可見(jiàn),那么它的數(shù)據(jù)就在緩存中。如果數(shù)據(jù)在緩存中,算法就能重復(fù)使用先前緩存的變量值,而不是進(jìn)行冗余的計(jì)算。否則,算法從頭計(jì)算變量值,并且將其存儲(chǔ)在緩存中以便下一幀使用。該算法不需要復(fù)雜的數(shù)據(jù)結(jié)構(gòu),也不需要CPU到GPU的數(shù)據(jù)傳輸。從而提高了渲染的時(shí)效性。
[0010]從信號(hào)處理的角度來(lái)看,生成一個(gè)渲染模型表面上的視覺(jué)效果就相當(dāng)于該表面上的信號(hào)生成。因此,對(duì)像素著色器簡(jiǎn)化的問(wèn)題應(yīng)該看作是渲染流水線上多個(gè)著色器的整體優(yōu)化問(wèn)題,簡(jiǎn)化像素著色器的同時(shí)也優(yōu)化其他著色器,從而實(shí)現(xiàn)更優(yōu)的像素著色器簡(jiǎn)化。但是上述的這些方法,都只是僅僅生成簡(jiǎn)化的像素著色器。而沒(méi)有將像素著色器的簡(jiǎn)化看作是一個(gè)渲染流水線上的整體優(yōu)化問(wèn)題。
【發(fā)明內(nèi)容】
[0011]針對(duì)現(xiàn)有技術(shù)的不足,本發(fā)明提供了一種基于代碼移動(dòng)的著色器簡(jiǎn)化方法、裝置及圖形渲染方法。
[0012]一種基于代碼移動(dòng)的著色器簡(jiǎn)化方法,原始著色器包括像素著色器,包括:
[0013](I)從像素著色器的函數(shù)中選擇若干個(gè)變量或表達(dá)式作為移動(dòng)目標(biāo),根據(jù)各個(gè)移動(dòng)目標(biāo)對(duì)應(yīng)的程序點(diǎn)提取與計(jì)算當(dāng)前移動(dòng)目標(biāo)相關(guān)的語(yǔ)句作為對(duì)應(yīng)的目標(biāo)片段;
[0014](2)分別將每一個(gè)目標(biāo)片段移動(dòng)到原始著色器中與像素著色器相鄰的著色器中,得到相應(yīng)的修正著色器,并作為簡(jiǎn)化著色器。
[0015]步驟(I)中通過(guò)對(duì)原始著色器中的像素著色器進(jìn)行語(yǔ)法分析,獲取原始像素著色器的程序依賴圖,并根據(jù)得到的程序依賴圖提取像素著色器與計(jì)算該擬合目標(biāo)相關(guān)的部分形成該目標(biāo)片段(實(shí)際上先根據(jù)程序依賴圖得到目標(biāo)片段的抽象語(yǔ)法樹,然后再轉(zhuǎn)化為相應(yīng)的目標(biāo)片段)。像素著色器中相同的變量處于不同的位置視為不同的變量進(jìn)行處理。
[0016]本發(fā)明的著色器簡(jiǎn)化方法提取像素著色器中部分代碼(目標(biāo)片段),通過(guò)代碼移動(dòng),將像素著色器中部分耗時(shí)較大的像素著色器中的任務(wù)分配到任務(wù)相對(duì)較少的其他著色器中進(jìn)行,充分利用了執(zhí)行器(計(jì)算機(jī))的性能,大大提高了著色器的渲染效率和渲染的實(shí)時(shí)性。
[0017]作為優(yōu)選,所述步驟(I)中移動(dòng)目標(biāo)的個(gè)數(shù)為像素著色器函數(shù)中變量或表達(dá)式的個(gè)