本發(fā)明涉及三維場景渲染技術(shù),特別是涉及一種陰影渲染方法。
背景技術(shù):
目前,在三維場景渲染應(yīng)用中,為了增加場景渲染的逼真效果,通常都會使用相關(guān)實(shí)時陰影技術(shù)來為場景中的渲染對象渲染陰影。例如,游戲場景的渲染中,為了增強(qiáng)游戲的顯示效果,通常都會使用相關(guān)實(shí)時陰影技術(shù)來為場景中運(yùn)動的游戲?qū)ο箐秩娟幱啊?/p>
現(xiàn)有的陰影渲染方案中,通常是在光源位置處先渲染出一張場景的深度圖,然后再在相機(jī)處對整個場景進(jìn)行渲染,并與之前渲染的深度圖進(jìn)行比較,得到場景的陰影效果。但是對于室內(nèi)的點(diǎn)光源來說,由于陰影的投射需要朝向光源周圍的所有方向,所以需要將光源周圍的所有深度信息都投射到深度紋理中。針對該情景,一般的做法是創(chuàng)建一個立方體紋理(CubeMap),然后在點(diǎn)光源處朝著點(diǎn)光源的6個方向構(gòu)建6個投影矩陣,將每個方向上的場景都渲染到CubeMap中對應(yīng)方向的深度紋理中,以供下一個通道的渲染使用。
上述傳統(tǒng)的陰影渲染方法,對于室內(nèi)點(diǎn)光源陰影的渲染場景,將光源周圍的深度信息渲染到一個CubeMap上需要使用6張陰影紋理,這樣,就會占用較大顯存空間,影響渲染效率,尤其是在低端機(jī)上會產(chǎn)生很多效率問題。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的主要目的在于提供一種陰影渲染方法,該方法可以提高室內(nèi)點(diǎn)光源陰影的渲染效率。
為了達(dá)到上述目的,本發(fā)明提出的技術(shù)方案為:
一種陰影渲染方法,包括:
將六個光源方向分成N組,將所述N組光源方向的深度信息分別渲染到N張陰影紋理中;所述六個光源方向與三維空間坐標(biāo)軸的六個方向相同;1≤N≤3;
對于待渲染對象的每個像素,根據(jù)該像素所在位置對應(yīng)的光源方向,確定該像素的深度信息所在的陰影紋理以及在陰影紋理中的位置;根據(jù)所述位置從所確定出的陰影紋理上采樣,得到該像素的深度信息;
根據(jù)所述像素的深度信息,確定所述待渲染對象的陰影并進(jìn)行相應(yīng)的渲染。
綜上所述,本發(fā)明提出的陰影渲染方法,通過將多個方向的深度信息渲染到同一張陰影紋理的方式,減少深度紋理的使用數(shù)量,從而可以大幅度減少顯存空間的占用,從而可以在保證渲染效果的前提下,提高室內(nèi)點(diǎn)光源陰影的渲染效率。
附圖說明
圖1為本發(fā)明實(shí)施例的流程示意圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖及具體實(shí)施例對本發(fā)明作進(jìn)一步地詳細(xì)描述。
本發(fā)明的核心思想是:通過將多個方向的深度信息渲染到同一張陰影紋理的方式,減少深度紋理的使用數(shù)量,在保證渲染效果的前提下,提高室內(nèi)點(diǎn)光源陰影的渲染效率。
圖1為本發(fā)明實(shí)施例的流程示意圖,如圖1所示,該實(shí)施例實(shí)現(xiàn)的陰影渲染方法主要包括:
步驟101、將六個光源方向分成N組,將所述N組光源方向的深度信息分別渲染到N張陰影紋理中;所述六個光源方向與三維空間坐標(biāo)軸的六個方向相同;1≤N≤3。
本步驟中,需要將六個光源方向進(jìn)行分組,然后將N組光源方向的深度信息分別渲染到N張陰影紋理中,也就是將同一組光源方向的深度信息渲染到一張陰影紋理中,不同組光源方向的深度信息渲染到不同的陰影紋理中。如此,通過將多個光源方向的深度信息渲染到一張陰影紋理中,可以減少所使用的陰影紋理的數(shù)量,相應(yīng)的可以減少顯存空間的開銷,從而可以大幅度提高室內(nèi)點(diǎn)光源陰影渲染效率,避免傳統(tǒng)方案中需要每個光源方向各使用一張陰影紋理所存在的渲染效率低的問題。
在實(shí)際應(yīng)用中,本領(lǐng)域技術(shù)人員可以根據(jù)實(shí)際需要來確定光源方向的分組數(shù)N的值。較佳地,可以將光源方向分成2組,即N=2。
較佳地,當(dāng)N=2時,可以采用四個光源方向組成一組,另兩個光源方向組成另一一組的方式將六個光源方向分成兩組,即從六個光源方向中選擇出四個光源方向,將所選擇出的四個光源方向劃分為一組,將未被選擇的兩個光源方向劃分為另一組。進(jìn)一步地,基于該分組方式,可以采用下述方法將六個光源方向分成兩組:
對于每個述光源方向,將該光源方向的序號與4相除,將相除結(jié)果取整后加1作為該光源方向所在組的序號。
上述方法僅是一用于確定各光源方向所屬組的具體示例,該方法易于實(shí)現(xiàn),在實(shí)際應(yīng)用中,并不限于此。
較佳地,可以采用下述方法將所述N組光源方向的深度信息分別渲染到N張陰影紋理中:
步驟x1、對于每組光源方向,根據(jù)陰影紋理的序號與該組光源方向的組序號相同的原則,確定該組光源方向的深度信息需要渲染至的陰影紋理。
步驟x1用于來確定各光源方向的深度信息需要渲染到哪張陰影紋理上,利用本步驟,根據(jù)光源方向所在組的序號確定陰影紋理的序號,可以確保同一組光源方向的深度信息渲染到一張陰影紋理中,不同組光源方向的深度信息渲染到不同的陰影紋理中。
步驟x2、對于每組光源方向,根據(jù)預(yù)設(shè)的紋理高度TexHeight和紋理寬度TexWidth,按照Pi=OffsetArray[i]*(TexHeight,TexWidth),計算其中每個光源方向的深度信息在需要渲染至的陰影紋理中的位置Pi,并按照所計算出的位置Pi將對應(yīng)光源方向的深度信息渲染至對應(yīng)的陰影紋理中。
其中,OffsetArray[i]為光源方向在陰影紋理中對應(yīng)的紋理坐標(biāo)偏移量,i=Index%k,%表示求余運(yùn)算,Index為光源方向的序號,k為一組光源方向中光源方向數(shù)量的最大值。
這里需要說明的是,由于是將一組光源方向的深度信息即多個光源方向的深度信息渲染到一張陰影紋理中,因此,一張陰影需要分成與一組中光源方向數(shù)量相同的若干部分,每個光源方向?qū)?yīng)其中的一部分,用于渲染本光源方向的深度信息。上述OffsetArray[i]為光源方向在陰影紋理中對應(yīng)的紋理坐標(biāo)偏移量,即光源方向在陰影紋理中對應(yīng)部分的坐標(biāo)偏移量,基于此,即可計算出光源方向的深度信息在需要渲染至的陰影紋理中的位置Pi,從而可以將光源方向的深度信息渲染至對應(yīng)部分的陰影紋理中。
較佳地,當(dāng)采用上述將六個光源方向分成2組,并且按照光源方向的序號與4相除取整加1作為光源方向所在組的序號時,可以采用下述方法將所述N組光源方向的深度信息分別渲染到N張陰影紋理中:
步驟b1、按照textureIndex=int(Index/4)+1,確定每個所述光源方向的深度信息需要渲染至的陰影紋理,其中,Index為光源方向的序號,textureIndex為所確定出的陰影紋理的序號,int()為取整函數(shù)。
步驟b2、按照Pi=OffsetArray[i]*(TexHeight,TexWidth),計算其中每個光源方向的深度信息在需要渲染至的陰影紋理中的位置Pi,并按照所計算出的位置Pi將對應(yīng)光源方向的深度信息渲染至對應(yīng)的陰影紋理中。
其中,OffsetArray[i]為光源方向在陰影紋理中對應(yīng)的紋理坐標(biāo)偏移量,i=Index%4,%為求余運(yùn)算,Index為光源方向的序號,OffsetArray[0]=(0,0),OffsetArray[1]=(0.5,0),OffsetArray[2]=(0,0.5),OffsetArray[3]=(0.5,0.5)。
步驟102、對于待渲染對象的每個像素,根據(jù)該像素所在位置對應(yīng)的光源方向,確定該像素的深度信息所在的陰影紋理以及在陰影紋理中的位置;根據(jù)所述位置從所確定出的陰影紋理上采樣,得到該像素的深度信息。
本步驟中,將從步驟101中得到的陰影紋理中,采樣得到待渲染對象的每個像素當(dāng)前位置對應(yīng)光源方向的深度信息,以便在步驟103中利用所獲得的各像素的深度信息實(shí)現(xiàn)對待渲染對象的陰影的渲染。
這里,對每個像素的深度信息進(jìn)行采樣時,需要根據(jù)像素所在位置對應(yīng)的光源方向確定深度信息所在的陰影紋理以及在其中的位置,以便從中采樣得到像素的深度信息。
較佳地,可以采用下述方法確定每個像素的深度信息所在的陰影紋理以及在陰影紋理中的位置:
按照t=int(r/4)+1,確定像素的深度信息所在的陰影紋理,其中,r為像素所在位置對應(yīng)的光源方向的序號,t為像素的深度信息所在的陰影紋理的序號,int()為取整函數(shù)。
按照Qs=OffsetArray[s]+0.5*(u,v),計算像素的深度信息在陰影紋理中的位置Qs,其中,(u,v)為像素的原始紋理坐標(biāo),OffsetArray[s]為光源方向r在陰影紋理中對應(yīng)的紋理坐標(biāo)偏移量,s=r%4,%表示求余運(yùn)算。
步驟103、根據(jù)所述像素的深度信息,確定所述待渲染對象的陰影并進(jìn)行相應(yīng)的渲染。
綜上所述,以上僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。