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