任文婕
(四川大學(xué)信息工程學(xué)院,成都610065)
近年來(lái),計(jì)算機(jī)圖形學(xué)迅速發(fā)展,已經(jīng)成為當(dāng)今計(jì)算機(jī)專業(yè)領(lǐng)域內(nèi)最為活躍的學(xué)科之一。它被廣泛應(yīng)用于當(dāng)今生產(chǎn)生活的各個(gè)方面。如何更加逼真地表現(xiàn)三維圖形的視覺(jué)效果是該領(lǐng)域中的一個(gè)很重要的課題。其中,紋理貼圖技術(shù),是近年來(lái)在計(jì)算機(jī)圖形學(xué)領(lǐng)域中發(fā)展最快的致力于增強(qiáng)圖形真實(shí)感的技術(shù)之一。它可以在不增加時(shí)間開(kāi)銷的前提下,更加方便地繪制真實(shí)感圖形,而不用在建模階段去考慮物體表面的細(xì)節(jié)。紋理貼圖技術(shù)應(yīng)用有助于增強(qiáng)場(chǎng)景繪制的真實(shí)感和降低模型的復(fù)雜度[1]。
傳統(tǒng)的紋理貼圖技術(shù)確有助益,但是當(dāng)近距離觀察采用紋理貼圖技術(shù)進(jìn)行繪制的物體時(shí),其效果就大打折扣了。利用傳統(tǒng)的紋理貼圖技術(shù)可以呈現(xiàn)出物體表面的一些凹痕和細(xì)小的裂紋,但是這些細(xì)節(jié)僅僅通過(guò)顏色變化而被表現(xiàn)出來(lái),它們更像是被直接涂染到物體表面上而并非客觀存在的,整體的真實(shí)感太低。而現(xiàn)實(shí)中的物體表面大多并非光滑平坦,而是表現(xiàn)出無(wú)數(shù)凹凸不平的細(xì)節(jié)。
為了能真實(shí)地反映出這些細(xì)節(jié),就必須研究更高級(jí)的紋理貼圖技術(shù)[2],那就需要對(duì)能進(jìn)一步提高場(chǎng)景渲染效果的技術(shù)進(jìn)行研究與實(shí)現(xiàn)。本文所論述的視差貼圖技術(shù)就是一種更高級(jí)的紋理貼圖技術(shù),它在法線貼圖的基礎(chǔ)上增加了對(duì)高度的考慮,可以更真實(shí)地呈現(xiàn)出物體表面凸起的自我遮擋和運(yùn)動(dòng)視差的效果[3-4]。此外,本文論述的視差貼圖技術(shù)還研究并實(shí)現(xiàn)了由于物體自遮擋而產(chǎn)生的自陰影的效果[5]。
基本的法線貼圖雖然能在一定程度上繪制出具有真實(shí)感的場(chǎng)景,但它也存在一些缺陷:它始終沒(méi)有考慮表面細(xì)節(jié)的高度問(wèn)題。當(dāng)以一個(gè)較偏的角度去觀察一個(gè)采用法線貼圖技術(shù)繪制的場(chǎng)景時(shí),這個(gè)問(wèn)題就變得非常明顯了:如圖1 所示,表面的凸起看起來(lái)似乎太“矮”了,它沒(méi)能擋住在藏它“身后”的凸起。這些凸起更像是被畫(huà)在了表面上而不是實(shí)際存在的,場(chǎng)景的真實(shí)感太低。
圖1 法線貼圖效果
圖2 視差貼圖效果
視差貼圖在法線貼圖的基礎(chǔ)上,充分考慮了物體表面的高度問(wèn)題。它利用一張存儲(chǔ)了片段高度值的高度圖(Height Map)來(lái)模擬表面的高度場(chǎng),通過(guò)修改片段對(duì)應(yīng)的紋理坐標(biāo)來(lái)使圖像中的一個(gè)片段看起來(lái)比其實(shí)際的高度更高或者更低。如圖3 所示,若利用高度圖所記錄的值來(lái)對(duì)物體表面進(jìn)行位移,那么當(dāng)沿著觀察向量的方向去觀察物體表面時(shí),能觀察到的應(yīng)該是點(diǎn)B 處的場(chǎng)景。但實(shí)際的表面并沒(méi)有被移動(dòng),觀察射線最終會(huì)與物體表面交于A 點(diǎn)。這里,視差貼圖巧妙地用點(diǎn)B 對(duì)應(yīng)片段的紋理坐標(biāo)去替代點(diǎn)A 對(duì)應(yīng)片段的紋理坐標(biāo),然后再利用該紋理坐標(biāo)去紋理圖中采樣顏色值并“貼”于A上,就可以獲得一種仿佛看到了B 點(diǎn)的假象。
圖3 高度對(duì)視覺(jué)效果的影響
因此,視差貼圖技術(shù)所要解決的最重要的問(wèn)題就是:如何根據(jù)點(diǎn)A 的位置、觀察向量以及表面高度場(chǎng)找到點(diǎn)B 的位置,從而獲得能體現(xiàn)深度感的,具有遮擋效果的場(chǎng)景。
實(shí)現(xiàn)高度場(chǎng)與觀察射線的交點(diǎn)計(jì)算是整個(gè)視差貼圖的關(guān)鍵所在。它直接決定了最終渲染效果的正確性和真實(shí)感程度。
首先,將高度圖取反,獲得一張存儲(chǔ)了表面深度值的深度圖,并將深度值規(guī)范化到[0,1]的范圍內(nèi)。如圖4所示,多邊形表面的深度值為0,最大的位移深度值為1。輸入的紋理坐標(biāo)為t0,偏移后的紋理坐標(biāo)為toff,視差偏移向量為P(視差偏移向量的值決定了最大紋理坐標(biāo)偏移量和偏移方向)。
圖4 逐層探索高度場(chǎng)與觀察射線的交點(diǎn)
接著,將整個(gè)高度場(chǎng)分為n 層,層與層之間的距離相等,記為L(zhǎng)ayerDepth(LayerDepth=1/n)。再將視差偏移向量P 除以層數(shù)n,得到每次采樣的步長(zhǎng)△t(△t=P/n),這樣做可以保證每次采樣都是沿著視差偏移向量P 進(jìn)行的。
然后,從輸入的紋理坐標(biāo)t0出發(fā),逐層采樣高度值:將當(dāng)前層的深度值記為CurrentLayerDepth,當(dāng)前紋理坐標(biāo)值記為CurrentTexcoords。利用當(dāng)前紋理坐標(biāo)值,去深度圖中采樣,獲得當(dāng)前采樣點(diǎn)的深度值CurrentSampleDepth。將CurrentLayerDepth 與CurrentSampleDepth 進(jìn)行比較:
(1)若CurrentLayerDepth 小于CurrentSampleDepth,則將CurrentLayerDepth 加上LayerDepth(即移動(dòng)到下一層),將CurrentTexcoords 加上采樣步長(zhǎng)△t(即移動(dòng)到下一個(gè)采樣點(diǎn)),然后重復(fù)上述操作;
(2)若CurrentLayerDepth 等于CurrentSampleDepth,則算法終止,此時(shí),CurrentTexcoords 就是最終要輸出的紋理坐標(biāo)toff;
(3)若CurrentLayerDepth 大于CurrentSampleDepth(表明采樣點(diǎn)高度已經(jīng)低于表面),則停止繼續(xù)采樣。如圖5 中的點(diǎn)t6所示,當(dāng)前層的深度值大于從深度圖中采樣得到的深度值,而上一個(gè)采樣點(diǎn)t5對(duì)應(yīng)的層的深度值小于采樣值。那么,此時(shí)觀察射線與高度場(chǎng)的交點(diǎn)一定在t5和t6之間的某個(gè)位置。這里,可以利用相似三角形的特性,近似地估計(jì)出交點(diǎn)的位置:
圖5 高度場(chǎng)與觀察射線交點(diǎn)的估計(jì)
成功地計(jì)算出了最終要輸出的偏移后的紋理坐標(biāo)toff后,就可以利用它去法線圖和顏色紋理圖中采樣獲取表面細(xì)節(jié)信息了。最后再利用這些細(xì)節(jié)信息進(jìn)行光照計(jì)算以獲得最終的視差效果。
通過(guò)上面交點(diǎn)的計(jì)算,物體表面的自我遮擋效果已經(jīng)得到了很好的表現(xiàn),但是因自我遮擋而產(chǎn)生的自陰影的效果卻完全沒(méi)有被表現(xiàn)出來(lái),所以還必須要額外地進(jìn)行表面自陰影的計(jì)算。
仍從交點(diǎn)O 出發(fā),沿著光照射線進(jìn)行逐層采樣。在采樣過(guò)程中,記錄下所有CurrentLayerDepth 值大于CurrentSampleDepth 值的采樣點(diǎn),記為d1-dn。如圖6所示,這些點(diǎn)阻擋了光照到達(dá)交點(diǎn)O。
圖6 遮擋情況圖
為了獲得軟陰影的效果,假設(shè)以一個(gè)面光源來(lái)照射物體,通過(guò)分析在面光源的照射下,遮擋物的大小以及遮擋物和被照射物體之間的距離與遮擋系數(shù)的關(guān)系,來(lái)粗略地表示出遮擋系數(shù)v。
圖7 遮擋物較小的情況
圖8 遮擋物較大的情況
首先觀察遮擋物的大小對(duì)陰影形成的影響。在圖7 中,被遮擋物遮擋的物體表面上一點(diǎn)O 能接收到的來(lái)自面光源的光照強(qiáng)度為△L。在圖8 中,其他條件均不變,僅遮擋物的大小變大(這里特指遮擋物向著遮擋面積變大的方向變大,表現(xiàn)在圖8 中,就是遮擋物向左延伸。原因是:當(dāng)遮擋物向右延伸時(shí),雖然遮擋物的大小變大,但是它對(duì)光照不產(chǎn)生任何影響),此時(shí)點(diǎn)O 能接收到的光照強(qiáng)度變?yōu)椤鱈’,△L’<△L。由此可得:在其他條件保持不變時(shí),當(dāng)遮擋物越大,物體表面接收到的光照強(qiáng)度就越小,最終的顏色也就越暗,相應(yīng)地,遮擋系數(shù)v 就應(yīng)該越大。即遮擋系數(shù)與遮擋物的大小成正相關(guān)。
圖9 遮擋物離物體較遠(yuǎn)的情況
圖10 遮擋物離物體較近 的情況
再來(lái)觀察遮擋物的位置對(duì)陰影形成的影響。在圖9 中,面光源在遮擋物的影響下,在物體表面形成的陰影大小為△S。而在圖10 中,在其他條件不變的情況下,將遮擋物向更靠近物體表面的方向移動(dòng)一定距離,形成的陰影大小變?yōu)榱恕鱏’。對(duì)比兩幅圖,可以明顯看出△S>△S’。由此可得:在其他條件保持不變的情況下,當(dāng)遮擋物與被照射物體之間的距離越小時(shí),面光源在遮擋物的影響下在物體表面形成的陰影面積就越小(即半影的面積越?。?,半影的面積越小說(shuō)明物體被遮擋得越嚴(yán)密,相應(yīng)地,遮擋系數(shù)就應(yīng)該越大。因此,遮擋系數(shù)和遮擋物與被照射物體之間的距離成反相關(guān)。
有了這兩條結(jié)論后,就能輕松的得到一個(gè)粗略的遮擋系數(shù)值。然后將該值應(yīng)用到光照計(jì)算中,通過(guò)色彩的明暗變化呈現(xiàn)出軟陰影的效果。
在本小節(jié)中,我們通過(guò)具體的實(shí)驗(yàn),將普通的紋理貼圖、法線貼圖和視差貼圖三者的繪制效果進(jìn)行對(duì)比來(lái)體現(xiàn)視差貼圖的特點(diǎn)。
普通的紋理貼圖技術(shù)直接將顏色紋理映射到矩形表面。在光照下,得到的效果如圖11 所示。它使得原來(lái)單調(diào)的矩形表面有了更豐富的色彩,呈現(xiàn)出了紋理圖中木質(zhì)地板的效果
法線貼圖技術(shù)在普通紋理貼圖技術(shù)的基礎(chǔ)上,增加了對(duì)法線向量信息的利用。通過(guò)物體表面因朝向不同而產(chǎn)生的明暗變化來(lái)表現(xiàn)凹凸不平的效果。圖12展示了矩形平面在一點(diǎn)光源照射下,利用法線貼圖技術(shù)實(shí)現(xiàn)的效果。
圖11 紋理貼圖效果
圖12 法線貼圖效果
視差貼圖技術(shù)在法線貼圖技術(shù)的基礎(chǔ)上,考慮了高度的問(wèn)題。它利用高度圖來(lái)模擬矩形表面的高度場(chǎng),通過(guò)修改紋理坐標(biāo)來(lái)使圖像中的一個(gè)片段看起來(lái)比實(shí)際的更高或者更低。圖13 展示了矩形平面在同一光源照射下,利用視差貼圖技術(shù)實(shí)現(xiàn)的效果。
在本文論述的視差貼圖技術(shù)中,我們還對(duì)因物體的自遮擋而產(chǎn)生的自陰影進(jìn)行了計(jì)算,并實(shí)現(xiàn)了軟陰影的效果,進(jìn)一步增加了場(chǎng)景的真實(shí)感。圖14 呈現(xiàn)了視差貼圖技術(shù)實(shí)現(xiàn)的表面自陰影效果。
圖13 視差貼圖效果
圖14 表面自陰影
本文詳細(xì)闡述并實(shí)現(xiàn)了視差貼圖技術(shù),該技術(shù)在運(yùn)動(dòng)視差、自遮擋和表面自陰影方面有著更好的表達(dá),使得繪制的物體看起來(lái)更加逼真。其中,著重描述了計(jì)算高度場(chǎng)與觀察射線交點(diǎn)的算法以及計(jì)算表面自陰影的算法。