本發(fā)明涉及一種軟陰影繪制方法。更具體地,涉及一種基于陰影圖的軟陰影繪制方法。
背景技術(shù):
隨著基本的圖形處理趨于完善,越來越多的人將注意力聚集在圖形表現(xiàn)的真實(shí)性上,陰影在提升3D圖形的真實(shí)感方面發(fā)揮著極大的作用,陰影不但可以幫助人們理解物體相對(duì)場(chǎng)景的位置,陰影接受者的表面特征和陰影投射者的幾何特征,還可以反映出場(chǎng)景中光源所在的位置。相對(duì)于硬陰影而言,軟陰影考慮了更為真實(shí)的情況,更加真實(shí)的模擬了光照中的陰影,它將影子分為本影和半影,通過改進(jìn)計(jì)算半影所在的光照強(qiáng)度,實(shí)現(xiàn)半影到本影的漸變過程,達(dá)到真實(shí)感繪制的效果。傳統(tǒng)的基于陰影圖的軟陰影算法在逼真顯示及效率方面存在矛盾,若要保證高顯示質(zhì)量,則其效率有限,無法滿足大型復(fù)雜場(chǎng)景的實(shí)時(shí)渲染需求,若保證效率,但陰影的精確性不高,因此,無法滿足當(dāng)今計(jì)算機(jī)圖形應(yīng)用的要求,急需對(duì)傳統(tǒng)的基于陰影圖的軟陰影算法進(jìn)行改進(jìn)。
因此,需要提供一種基于陰影圖的軟陰影繪制方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種基于陰影圖的軟陰影繪制方法。
為達(dá)到上述目的,本發(fā)明采用下述技術(shù)方案:
一種基于陰影圖的軟陰影繪制方法,包括如下步驟:
S1、選取并組合模型面向光源的輪廓邊,得到模型面向光源的輪廓;
S2、擴(kuò)充模型面向光源的輪廓,得到模型面向光源的輪廓的平滑面;
S3、在模型面向光源的輪廓的平滑面中繪制軟陰影。
優(yōu)選地,步驟S1進(jìn)一步包括如下子步驟:
S1.1、遍歷所有構(gòu)成模型的三角形面,選取其中面向光源的三角形面;
S1.2、遍歷選取的面向光源的三角形面的邊,選取模型面向光源的輪廓邊;
S1.3、組合模型面向光源的輪廓邊,得到模型面向光源的輪廓。
優(yōu)選地,步驟S1.1中選取面向光源的三角形面的方法為:計(jì)算光源方向的法向量與遍歷的所有構(gòu)成模型的三角形面法向量的點(diǎn)積,如果點(diǎn)積大于0,則這個(gè)三角形面面向光源,如果點(diǎn)積小于等于0,則這個(gè)三角形面背向光源。
優(yōu)選地,步驟S1.2進(jìn)一步包括如下子步驟:
S1.2.1、建立堆棧并把遍歷的第一條面向光源的三角形面的邊加入堆棧;
S1.2.2、依次把面向光源的三角形面的邊壓入堆棧并且比較堆棧中的邊與當(dāng)前遍歷的邊,如果堆棧中存在與當(dāng)前遍歷的邊相同的邊,則不把該邊加入堆棧且把在堆棧中的與該邊相同的邊刪除;如果堆棧中不存在與當(dāng)前遍歷的邊相同的邊,則把當(dāng)前遍歷的邊加入堆棧;
S1.2.3、依次遍歷完所有的面向光源的三角形面的邊之后,堆棧中的邊即為模型面向光源的輪廓邊。
優(yōu)選地,步驟S3中繪制軟陰影的方法為:利用模型平滑面生成半影深度圖和半影Alpha紋理圖,完成模型的軟陰影的繪制。
本發(fā)明的有益效果如下:
本發(fā)明所述技術(shù)方案提高了陰影渲染速度,為實(shí)時(shí)陰影繪制提供了新的途徑,提高了三維場(chǎng)景繪制的逼真度。
附圖說明
下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)的說明。
圖1示出基于陰影圖的軟陰影繪制方法的流程圖。
圖2示出模型多邊形輪廓邊示意圖。
圖3示出以邊V2-V3為例的模型多邊形擴(kuò)充示意圖。
具體實(shí)施方式
為了更清楚地說明本發(fā)明,下面結(jié)合優(yōu)選實(shí)施例和附圖對(duì)本發(fā)明做進(jìn)一步的說明。附圖中相似的部件以相同的附圖標(biāo)記進(jìn)行表示。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,下面所具體描述的內(nèi)容是說明性的而非限制性的,不應(yīng)以此限制本發(fā)明的保護(hù)范圍。
如圖1所示,本實(shí)施例提供的基于陰影圖的軟陰影繪制方法的具體步驟為:
S1、選取并組合模型面向光源的輪廓邊,得到模型面向光源的輪廓:
選取并組合模型面向光源的輪廓邊的方法為:選取模型的輪廓邊即為選 取面向光源的構(gòu)成模型面向光源的多邊形的面的邊,模型面向光源的輪廓邊是在遍歷構(gòu)成模型面向光源的多邊形面(此實(shí)施例中為三角形面)時(shí)出現(xiàn)且僅出現(xiàn)一次的邊,因此兩個(gè)面共享的邊肯定不是輪廓邊,如圖2所示。面向光源的相鄰的三角形面V1-V5-V4和V4-V5-V3有一條公共邊,因方向不同,分別命名為邊1和邊2。在一個(gè)封閉的曲面中,任何兩個(gè)三角形面共享的邊肯定不是輪廓邊,因此,在遍歷完整個(gè)曲面之后,那些不是共享的邊,即僅僅出現(xiàn)一次的邊,就是輪廓邊。把這些僅僅出現(xiàn)一次的邊逆時(shí)針連接,就得到了輪廓邊,然后組合面向光源的輪廓邊,得到模型面向光源的輪廓。
S2、擴(kuò)充模型面向光源的輪廓,得到模型面向光源的輪廓的平滑面:
多邊形擴(kuò)充是一種常用的幾何處理方法,大量使用在工程實(shí)施和計(jì)算機(jī)圖形學(xué)方面,如圖3所示。開放圖形庫0penGL中,逆時(shí)針方向的三角形面為正面三角形面,即為面向光源的三角形面,以邊V2-V3為例,延長(zhǎng)點(diǎn)V2至點(diǎn)V6、點(diǎn)V3至點(diǎn)V7,就可以得到平滑面上的兩個(gè)三角形面V2-V7-V3和V2-V6-V7,而且這兩個(gè)三角形面也是面向光源的。為了得到平滑的具有漸變特點(diǎn)的平滑面,使用高洛德著色方式,把V2-V3上的點(diǎn),即輪廓邊上的點(diǎn)設(shè)置為黑色繪制為黑色,把V6-V7上的點(diǎn),即平滑面外側(cè)的邊上的點(diǎn)繪制成白色,這樣可以得到由內(nèi)到外光照值依次增強(qiáng)的平滑面了。
S3、在模型面向光源的輪廓的平滑面中繪制軟陰影:
利用模型平滑面生成半影深度圖和半影Alpha紋理圖,完成模型的軟陰影的繪制。半影深度圖是指由平滑面在光源下所生成的深度紋理圖,其原理與本影紋理生成方法相同,半影Alpha紋理圖是指直接渲染平滑面的顏色到紋理產(chǎn)生的紋理,其原理為平滑面運(yùn)用高洛德著色模式生成的一張從內(nèi)到外有漸變特點(diǎn)的紋理,這張紋理從內(nèi)到外的光照強(qiáng)度漸次增強(qiáng)。半影深度圖和半影Alpha紋理圖都是在光源空間的坐標(biāo)下生成的。
其中
步驟S1“選取并組合模型面向光源的輪廓邊,得到模型面向光源的輪廓”具體包括如下子步驟:
S1.1、遍歷所有構(gòu)成模型的三角形面,選取其中面向光源的三角形面,具體方法為:計(jì)算光源方向的法向量與遍歷的所有構(gòu)成模型的三角形面法向量的點(diǎn)積,如果點(diǎn)積大于0,則這個(gè)三角形面面向光源,如果點(diǎn)積小于等于0,則這個(gè)三角形面背向光源;
S1.2、遍歷選取的面向光源的三角形面的邊,選取模型面向光源的輪廓邊;
S1.3、組合模型面向光源的輪廓邊,得到模型面向光源的輪廓。
步驟S1.2“遍歷選取的面向光源的三角形面的邊,選取模型面向光源的輪廓邊”具體包括如下子步驟:
S1.2.1、建立堆棧并把遍歷的第一條面向光源的三角形面的邊加入堆棧;
S1.2.2、依次把面向光源的三角形面的邊壓入堆棧并且比較堆棧中的邊與當(dāng)前遍歷的邊,如果堆棧中存在與當(dāng)前遍歷的邊相同的邊,就可以證明當(dāng)前遍歷的邊是共享的邊,不把該邊加入堆棧且把在堆棧中的與該邊相同的邊刪除,如果堆棧中不存在與當(dāng)前遍歷的邊相同的邊,則把當(dāng)前遍歷的邊加入堆棧;
S1.2.3、依次遍歷完所有的面向光源的三角形面的邊之后,堆棧中的邊即為模型面向光源的輪廓邊。
步驟S2“擴(kuò)充模型面向光源的輪廓,得到模型面向光源的輪廓的平滑面”的具體過程為:
在給一個(gè)模型添加平滑面時(shí),用模型的中心點(diǎn)向這個(gè)模型的輪廓邊連線并延長(zhǎng),形成平滑面。延長(zhǎng)連線時(shí)設(shè)定系數(shù)t來決定延長(zhǎng)線的長(zhǎng)短,系統(tǒng)t的取值范圍為[0,1],系數(shù)t取值為0時(shí)只有硬陰影,而取值越大,其軟陰影的范圍越大,具體的數(shù)值根據(jù)實(shí)際需求而定,同時(shí),延長(zhǎng)線的長(zhǎng)短決定了平滑面的大小,也就決定了生成的偽半影的大小。設(shè)輪廓邊上的點(diǎn)為A(i),i=1,2,…,n,n構(gòu)成輪廓邊的點(diǎn)的個(gè)數(shù),點(diǎn)A(i)在模型的坐標(biāo)系中的位置為VA(i),c為模型的中心點(diǎn)位置;點(diǎn)A(i)經(jīng)過延長(zhǎng)后的點(diǎn)為B(i),點(diǎn)B(i)在模型的坐標(biāo)系中的位置為VB(i),設(shè)定一標(biāo)準(zhǔn)化向量V0(i),用normal(V0(i))表示,其中V0(i)=VA(i)-c,則點(diǎn)B(i)在模型的坐標(biāo)系中的位置為VB(i)的計(jì)算公式為:
VB(i)=normal(V0(i))*t+VA(i)。
計(jì)算出輪廓邊上所有點(diǎn)延長(zhǎng)后在模型的坐標(biāo)系中的位置,組成平滑面的邊,再由輪廓邊和平滑面的邊構(gòu)成模型面向光源的輪廓的平滑面。
顯然,本發(fā)明的上述實(shí)施例僅僅是為清楚地說明本發(fā)明所作的舉例,而并非是對(duì)本發(fā)明的實(shí)施方式的限定,對(duì)于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可以做出其它不同形式的變化或變動(dòng),這里無法對(duì)所有的實(shí)施方式予以窮舉,凡是屬于本發(fā)明的技術(shù)方案所引伸出的顯而易見的變化或變動(dòng)仍處于本發(fā)明的保護(hù)范圍之列。