Real-time Rendering 第六章 貼圖(下)

6.6 透明貼圖 Alpha Mapping

alpha值可以用于許多使用alpha混合或alpha測試的效果,例如高效渲染樹葉姓蜂、爆炸和遠處的物體等等。本節(jié)將討論alphas中紋理的使用医吊,并指出各種限制和解決方案钱慢。

一個與紋理相關(guān)的效果是貼花。例如卿堂,你想在茶壺上放一張花的照片束莫。你想要的不是整個畫面,而是花朵所在的部分草描。通過為texel分配一個alpha值(0)览绿,可以使它透明,這樣就不會產(chǎn)生任何效果穗慕。因此饿敲,通過正確設(shè)置貼花紋理的alpha值,您可以用貼花替換或混合底層表面逛绵。通常怀各,Clamp對應(yīng)函數(shù)與透明邊框一起使用倔韭,將貼花的單個副本(相對于重復(fù)紋理)應(yīng)用于表面。圖6.26顯示了如何實現(xiàn)標(biāo)記的示例瓢对。有關(guān)貼花的更多信息寿酌,請參見第20.2節(jié)。

image

alpha的一個類似應(yīng)用是在制作裁剪硕蛹。假設(shè)你制作了一個貼花的灌木圖像醇疼,并將它應(yīng)用到場景中的一個矩形上。原則與貼花是相同的法焰,除了不是與底面齊平秧荆,灌木將被繪制在它后面的任何幾何圖形的頂部。通過這種方式壶栋,使用單個矩形辰如,您可以呈現(xiàn)具有復(fù)雜輪廓的對象。

在灌木的例子中贵试,如果觀察者繞著它進行旋轉(zhuǎn)琉兜,那么圖像會顯示不正確拍皮,因為灌木沒有厚度捧搞。一種方法是復(fù)制這個矩形并沿樹干旋轉(zhuǎn)90度映穗。這兩個矩形形成了一個便宜的三維灌木挡育,有時被稱為“交叉樹”[1204]添诉,從地面上看为黎,這種錯覺相當(dāng)有效擦耀。參見圖6.27排惨。Pelzer[1367]討論了一個類似的配置运准,使用三個裁切面來表示草幌氮。在第13.6節(jié)中,我們將討論一種稱為billboarding的方法胁澳,它用于將這種呈現(xiàn)減少到單個矩形该互。如果觀眾移動到地面以上,這種錯覺就會消失韭畸,因為從上面可以看到灌木是兩個裁剪的宇智。參見圖6.28。為了解決這個問題胰丁,可以通過不同的方式添加更多的剪紙——切片随橘、樹枝、圖層——來提供更令人信服的模型锦庸。第13.6.5節(jié)討論了生成此類模型的一種方法;第857頁的圖19.31顯示了另一個机蔗。有關(guān)最終結(jié)果的示例,請參見第2頁和第1049頁上的圖像。

image
image

在灌木結(jié)合alpha貼圖和紋理動畫可以產(chǎn)生令人信服的特效蜒车,比如閃爍的火把讳嘱、植物生長、爆炸和大氣效果酿愧。

在灌木使用alpha映射呈現(xiàn)對象有幾個選項沥潭。Alpha blend (Section 5.5)允許部分透明值,這允許反鋸齒對象邊緣嬉挡,以及部分透明對象钝鸽。然而,alpha混合需要在不透明三角形之后渲染混合三角形庞钢,并按前后順序渲染拔恰。一個簡單的交叉樹是兩個裁剪紋理的例子,其中沒有正確的渲染順序基括,因為每個四邊形都在另一個的前面颜懊。即使理論上有可能排序并得到正確的順序,但這樣做通常也是低效的风皿。例如河爹,一塊土地上可能有成千上萬的草葉,這些草葉用裁切面表示桐款。每個網(wǎng)格對象可以由許多單獨的葉片組成咸这。顯式地對每個刀片進行排序是非常不切實際的。

在灌木在渲染時魔眨,這個問題可以通過幾種不同的方式得到改善媳维。一種是使用alpha測試,這是一個有條件地丟棄alpha值低于像素著色器中給定閾值的片段的過程遏暴。其中結(jié)果是這樣的:

image

其中.a是來自紋理查找的alpha值侄刽,參數(shù)alphaThreshold是用戶提供的閾值,它決定將丟棄哪些片段朋凉。這個二進制可見性測試允許三角形以任何順序渲染唠梨,因為透明片段被丟棄。我們通常希望對alpha值為0.0的任何片段執(zhí)行此操作侥啤。丟棄完全透明的片段還有一個額外的好處,即節(jié)省了進一步的著色器處理和合并的成本茬故,以及避免在z緩沖區(qū)中錯誤地將像素標(biāo)記為可見的[394]盖灸。對于裁剪,我們通常將閾值設(shè)置為高于0.0磺芭,比如0.5或更高赁炎,然后進一步忽略alpha值,而不是將其用于混合。這樣做可以避免無序的渲染瑕疵徙垫。但是讥裤,質(zhì)量很低,因為只有兩種透明級別(完全不透明和完全透明)可用姻报。另一種解決方案是為每個模型執(zhí)行兩個遍歷——一個用于實體裁剪己英,它被寫入z緩沖區(qū);另一個用于非實體裁剪的半透明的采樣。

在灌木alpha測試還有另外兩個問題吴旋,即放大太多[1374]和縮小太多[234,557]损肛。當(dāng)alpha測試與mipmapping一起使用時,如果不采用不同的處理方法荣瑟,效果可能無法令人信服治拿。圖6.29的頂部顯示了一個示例,其中樹的葉子變得比預(yù)期的更加透明笆焰。這可以用一個例子來解釋劫谅。假設(shè)我們有一個一維紋理,它有四個alpha值嚷掠,即(0.0,1.0,1.0,0.0)捏检。通過平均,下一個mipmap級別變?yōu)?0.5,0.5)叠国,然后最高級別為(0.5)∥撮荩現(xiàn)在,假設(shè)我們使用αt = 0.75。當(dāng)訪問mipmap level 0時粟焊,可以看到4個文本中有1.5個文本將通過丟棄測試冤狡。但是,當(dāng)訪問下兩個級別時项棠,將從0.5 < 0.75開始丟棄所有內(nèi)容悲雳。另一個例子見圖6.30。

image
image

Casta?no [234] 提個了一個簡單的解決方案使得mipmap可以正常工作香追。對于級別k的mipmap合瓢,覆蓋率ck被定義為:

image

nk是mipmap在等級k上的texel數(shù)量,α(k, i)是第k級mipmap在pixel i上面產(chǎn)生的alpha值,方程6.9和αt是用戶提供的α閾值。在這里,我們假設(shè)的結(jié)果α(k, i) > αt為真的時候是1,否則為0透典。注意晴楔,k = 0表示mipmap的最低級別,即峭咒,原始圖像税弃。對于每一個Mipmap水平,然后我們找到一個新的mipmap閾值 αk,而不是使用αt,這樣ck等于c0(或盡可能接近)。這可以通過二分查找來實現(xiàn)凑队。最后,所有k級的mipmap的texel產(chǎn)生的α值被縮放到αtk的水平则果。這種方法在圖6.29的底部使用,并且在NVIDIA的紋理工具中支持這種方法。Golus[557]給出了一個不修改mipmap的變體西壮,但是隨著mipmap級別的增加遗增,alpha值在著色器中被放大。

在灌木W(wǎng)yman和McGuire[1933]提出了一個不同的解決方案款青,其中公式6.9中的代碼行理論上被替換為:

image

在灌木隨機函數(shù)返回[0,1]中的一個均勻值做修,這意味著平均而言,這將得到正確的結(jié)果可都。例如缓待,如果紋理查找的alpha值為0.3,則有30%的幾率丟棄該片段渠牲。這是一種隨機透明的形式旋炒,每個像素只有一個樣本[423]。在實際應(yīng)用中签杈,為了避免時空高頻噪聲瘫镇,將隨機函數(shù)替換為哈希函數(shù):

image

三維哈希是通過對上述函數(shù)的嵌套調(diào)用形成的,即答姥, float hash3D(x,y,z){return hash2D(hash2D(x,y)铣除,z);返回一個[0,1]中的數(shù)字。散列的輸入是對象空間坐標(biāo)除以對象空間坐標(biāo)的最大屏幕空間導(dǎo)數(shù)(x和y)鹦付,然后clamping尚粘。為了獲得z方向運動的穩(wěn)定性,需要進一步的注意敲长,該方法最好與累積抗混疊技術(shù)相結(jié)合郎嫁。這種技術(shù)隨著距離的增加而逐漸消失,因此在近距離觀察時我們根本不會得到任何隨機效應(yīng)祈噪。這種方法的優(yōu)點是,平均每個片段都是正確的,Casta?no的方法[234]為每個mipmap等級創(chuàng)建單個αk泽铛。然而,這個值可能在每個mipmap級別上有所不同辑鲤,這可能會降低質(zhì)量并需要藝術(shù)家的干預(yù)盔腔。

Alpha測試顯示放大下的紋波瑕疵,這可以通過將Alpha映射作為距離場進行預(yù)計算來避免[580] (參見677頁的討論)月褥。

image

透明度轉(zhuǎn)換到覆蓋率弛随,以及類似的特性 transparency adaptive antialiasing。取片段的透明度宁赤,并且將其轉(zhuǎn)換為一個像素內(nèi)包含多少樣本[1250]撵幽。這個想法就像第5.5節(jié)中描述的紗門透明度,但是是亞像素級的礁击。假設(shè)每個像素有四個樣例位置,一個片段覆蓋一個像素,但是由于裁剪紋理哆窿,它是25%透明的(75%不透明)链烈。透明度轉(zhuǎn)覆蓋模式使片段變得完全不透明,但是它只覆蓋了四個樣本中的三個挚躯。這種模式對于重疊草葉的紋理裁剪非常有用强衡,例如[887,1876]。由于每個繪制的樣本都是完全不透明的码荔,所以最近的葉片將沿著邊緣以一致的方式隱藏后面的對象漩勤。正確混合半透明邊緣像素不需要排序,因為alpha混合是關(guān)閉的缩搅。

Alpha轉(zhuǎn)覆蓋率對于抗混疊的Alpha測試很好越败,但是當(dāng)Alpha混合時可能會產(chǎn)生瑕疵。例如硼瓣,具有相同alpha覆蓋率的兩個alpha混合片段將使用相同的亞像素模式究飞,這意味著一個片段將完全覆蓋另一個片段,而不是與之混合堂鲤。Golus[557]討論了使用fwidth()著色器指令使內(nèi)容的邊緣更清晰亿傅。參見圖6.31。

對于任何alpha映射的使用瘟栖,了解雙線性插值如何影響顏色值是很重要的葵擎。想象兩個texel鄰近:rgbα=(255,0,0,255)是一個實心的紅色,和它的鄰居,rgbα=(0,0,0,2),是黑色的,幾乎完全透明。二個texel之間的位置的rgba值應(yīng)該取什么?簡單的插值給出(127,0,0,128)半哟,結(jié)果rgb值是一個暗紅色酬滤。然而,這個結(jié)果實際上并沒有變暗镜沽,它是一個大紅色敏晤,已經(jīng)預(yù)先乘以alpha值了。如果你插值alpha值缅茉,為了得到正確的插值嘴脾,你需要確保被插值的顏色在插值之前已經(jīng)預(yù)先乘以alpha了。舉個例子,想象一下幾乎透明的臨近像素是用rgbα=(0 255 0,2),給出一個極小的綠色色調(diào)進行取代蔬墩。這個臨近texel的預(yù)乘版本是(0,2,0,2)译打,它給出了(127,1,0,128)的正確預(yù)乘結(jié)果。這個結(jié)果更有意義拇颅,因為預(yù)乘得到的顏色大多是紅色奏司,帶有一點難以察覺的綠色。

忽略雙線性插值的結(jié)果會得到一個預(yù)乘結(jié)果樟插,這可能會導(dǎo)致在貼花和裁剪對象周圍出現(xiàn)黑色邊緣韵洋「偷螅“變暗的”紅色的結(jié)果被處理成管道其余部分的未乘色,邊緣變成黑色搪缨。即使使用alpha測試食拜,這種效果也是可見的。最好的策略是在雙線性插值完成之前進行預(yù)乘[490,648,1166,1813]副编。WebGL API支持這一點负甸,因為組合對于web頁面非常重要。然而痹届,雙線性插值通常是由GPU執(zhí)行的呻待,著色器在執(zhí)行這個操作之前不能對texel值進行操作。圖像不會以PNG等文件格式進行預(yù)乘队腐,因為這樣做會失去顏色精度蚕捉。在使用alpha映射時,這兩個因素結(jié)合在一起會導(dǎo)致默認情況下的黑邊香到。一種常見的解決方法是對裁剪圖像進行預(yù)處理鱼冀,將透明的“黑色”紋理涂成附近不透明紋理的顏色[490,685]。所有透明區(qū)域通常都需要以這種方式重新繪制悠就,手工或自動繪制千绪,這樣mipmap級別也可以避免邊緣問題[295]。同樣值得注意的是梗脾,當(dāng)使用alpha值形成mipmaps時荸型,應(yīng)該使用預(yù)乘值[1933]。

6.7 凹凸貼圖 Bump Mapping

本節(jié)描述了一大類我們統(tǒng)稱為bump mapping的小規(guī)模細節(jié)表示技術(shù)炸茧。所有這些方法通常都是通過修改每個像素的著色例程來實現(xiàn)的瑞妇。它們比單獨的紋理映射提供了更三維的外觀,但沒有添加任何額外的幾何形狀梭冠。

對象上的細節(jié)可以分為三個尺度:覆蓋多個像素的宏觀特征辕狰、跨越幾個像素的中觀特征和實質(zhì)上小于一個像素的微觀特征。這些類別在某種程度上是不固定的控漠,因為在動畫或交互會話期間蔓倍,觀察者可以在許多距離上觀察同一個對象。

微幾何由頂點和三角形或其他幾何原語表示盐捷。當(dāng)創(chuàng)建一個三維人物時偶翅,四肢和頭部通常是在宏觀尺度上建模的。微幾何封裝在陰影模型中碉渡,通常在像素著色器中實現(xiàn)聚谁,并使用紋理映射作為參數(shù)。使用的陰影模型模擬了表面微觀幾何結(jié)構(gòu)的相互作用滞诺,例如形导,有光澤的物體在微觀上是光滑的环疼,而漫反射的表面在微觀上是粗糙的。角色的皮膚和衣服似乎有不同的材質(zhì)朵耕,因為它們使用不同的著色器秦爆,或者至少在這些著色器中使用不同的參數(shù)。

中幾何描述了這兩個尺度之間的一切憔披。它包含的細節(jié)過于復(fù)雜,無法有效地使用單個三角形呈現(xiàn)爸吮,但它足夠大芬膝,可以讓觀察者在幾個像素上區(qū)分表面曲率的單個變化。人物臉上的皺紋形娇、肌肉組織的細節(jié)锰霜、衣服上的褶皺和接縫都是中尺度的。一組統(tǒng)稱為凹凸貼圖技術(shù)的方法通常用于中尺度建模桐早。這些調(diào)整在像素級的陰影參數(shù)癣缅,這樣觀眾就能感覺到基本幾何形狀的小擾動,而基本幾何實際上是平坦的哄酝。不同類型凹凸貼圖的主要區(qū)別在于它們?nèi)绾伪硎炯毠?jié)特征。變量包括逼真度和細節(jié)特性的復(fù)雜性屡立。例如膨俐,數(shù)字藝術(shù)家通常將細節(jié)雕刻到模型中焚刺,然后使用軟件將這些幾何元素轉(zhuǎn)換成一個或多個紋理乳愉,比如凹凸紋理匾委,或者漸暗紋理氓润。

Blinn在1978年提出了在紋理中編碼中尺度細節(jié)的想法[160]咖气。他觀察到,如果在著色過程中斩松,我們用一個輕微擾動的正常表面代替真實的表面惧盹,那么表面似乎具有小規(guī)模的細節(jié)瞪讼。他把描述擾動到表面法線的數(shù)據(jù)存儲在數(shù)組中符欠。

關(guān)鍵的思想是希柿,我們不是使用紋理來改變光照方程中的顏色分量曾撤,而是使用紋理來修改表面法線盾戴。曲面的幾何法線保持不變;我們只是修改了照明方程中使用的法線尖啡。這個操作沒有物理上的等價;我們改變表面的法線衅斩,但表面本身在幾何意義上保持光滑畏梆。就像每個頂點都有法線會讓人產(chǎn)生三角形之間表面光滑的錯覺一樣奠涌,修改每個像素的法線會改變?nèi)切伪砻姹旧淼母兄锍鵁o需修改其幾何形狀慈格。

對于凹凸貼圖,法線必須相對于某些參照系改變方向稿械。為此美莫,在每個頂點上存儲一個切坐標(biāo)系茂嗓,也稱為切空間基。這個參照系被用來將光轉(zhuǎn)換到一個表面位置的空間(反之亦然)锣笨,以計算擾動法線的效果错英。對于一個應(yīng)用法線貼圖的多邊形曲面椭岩,除了頂點法線外判哥,我們還存儲了切向量和副切線向量(bitangent vectors)塌计。bitangent vector也被錯誤地稱為binormal vector[1025]锌仅。

切線矢量和副切線向量表示法線貼圖本身在物體空間中的坐標(biāo)軸热芹,因為目標(biāo)是將光線轉(zhuǎn)換為相對于貼圖的光線伊脓。參見圖6.32丽旅。

image

這三個向量邪狞,法向量n帆卓,切線向量t剑令,和副切線 b,構(gòu)成一個基矩陣:

image

這個矩陣碍脏,有時簡寫為TBN,將光的方向(對于給定的頂點)從世界空間轉(zhuǎn)換為切線空間钾埂。這些向量不必彼此垂直,因為法線貼圖本身可能會被扭曲以適應(yīng)曲面故源。然而绳军,非正交基會導(dǎo)致紋理傾斜矢腻,這意味著需要更多的存儲空間奶是,也會影響性能聂沙,即及汉,則矩陣不能被簡單的轉(zhuǎn)置所倒轉(zhuǎn)[494]房铭。一種節(jié)省內(nèi)存的方法是只存儲頂點處的切線和副切線,然后求它們的叉乘來計算法線凌蔬。然而,只有當(dāng)矩陣的旋向性總是相同時窃躲,這種方法才有效[1226]钦睡。模型通常是對稱的:飛機、人荞怒、文件柜和許多其他對象衰抑。因為紋理消耗大量內(nèi)存,所以它們常常被鏡像到對稱模型上。因此,只存儲對象紋理的一側(cè)锥涕,但是紋理映射將其放在模型的兩側(cè)。在這種情況下拉一,切空間的旋向性在兩邊是不同的,不能假設(shè)。在這種情況下,如果在每個頂點都存儲了額外的信息來表示利手性者蠕,仍然可以避免存儲法線大磺。如果設(shè)置好了待榔,這個位就用來抵消正切和位元的叉乘,從而得到正確的法線。如果切線幀是正交的工腋,也可以將基存儲為四元數(shù)(Section 4.3),這不僅更節(jié)省空間,而且每像素可以節(jié)省一些計算[494,1114,1154,1381,1639]。質(zhì)量上的小損失是可能的,盡管在實踐中很少見到。

切線空間的概念對于其它算法是很重要的。正如在下一章所討論的崩侠,許多著色方程只依賴于表面的法線方向淌喻。然而阵赠,拉絲鋁或天鵝絨等材料也需要知道相對于表面的觀察者的相對方向和光線匕荸。切線坐標(biāo)系對于定義材料在表面上的方向是有用的。冷耶爾[1025]和米特林[1226]的文章對這一領(lǐng)域進行了廣泛的覆蓋。sch¨uler[1584]提出了一種在像素著色器中動態(tài)計算切線空間基的方法,不需要為每個頂點存儲預(yù)先計算好的切線幀。Mikkelsen[1209]改進了這一技術(shù),推導(dǎo)出一種不需要任何參數(shù)化的方法羞秤,而是使用表面位置的導(dǎo)數(shù)和高度場的導(dǎo)數(shù)來計算擾動法線俐镐。然而取董,與使用標(biāo)準(zhǔn)的切線空間映射相比蹂午,這種技術(shù)帶來的顯示細節(jié)要少得多,而且可能會產(chǎn)生藝術(shù)工作流問題[1639]嚼沿。

6.7.1 Blinn’s Methods

Blinn的原始凹凸映射方法在紋理中的每個texel上存儲兩個帶符號的值bu和bv爆阶。這兩個值對應(yīng)的是沿著u和v圖像軸變化法線的量肢藐。也就是說痘煤,這些紋理值,通常是雙線性插值的调窍,用來縮放兩個垂直于法線的向量。這兩個向量加到法線上改變方向褐耳。兩個值bu和bv描述了曲面在該點的方向。參見圖6.33咧虎。這種類型的凹凸貼圖紋理稱為偏移矢量凹凸貼圖或偏移貼圖茁彭。

image

另一種表示凸起的方法是使用高度場來修改表面法線的方向年枕。每個單色紋理值表示一個高度霍弹,因此在紋理中耍缴,白色是一個高區(qū)域蚁趁,黑色是一個低區(qū)域(反之亦然)徘熔。有關(guān)示例窒升,請參見圖6.34。這是第一次創(chuàng)建或掃描凹凸貼圖時使用的一種常見格式酪呻,Blinn在1978年也引入了這種格式。高度場用于派生與第一種方法中使用的u和v符號值類似的值盐须。這是通過取相鄰列之間的差來得到u的斜率玩荠,取相鄰行之間的差來得到v的斜率[1567]。一種變體是使用Sobel過濾器贼邓,它給直接相鄰的texel更大的權(quán)重[535]阶冈。

image

6.7.2 法線貼圖 Normal Mapping

凹凸貼圖的一種常用方法是直接存儲法線貼圖。算法和結(jié)果與Blinn方法在數(shù)學(xué)上是一致的;只有存儲格式和像素著色器計算發(fā)生了變化塑径。

法線貼圖編碼(x, y, z)映射到[-1,1]女坑,例如,對于一個8位的紋理统舀,x軸值0代表-1.0,255代表1.0匆骗。圖6.35顯示了一個示例。顏色[128,128,255]為淡藍色誉简,表示所示顏色映射的平面碉就,即,法線為[0,0,1]闷串。

image

法線圖表示最初是作為世界空間法線圖引入的[274,891]瓮钥,在實踐中很少使用。對于這種類型的映射,擾動是很簡單的:在每個像素處骏庸,從映射中檢索法線,并直接使用它年叮,連同光的方向具被,來計算該位置在表面上的陰影。法線映射也可以在對象空間中定義只损,這樣模型就可以旋轉(zhuǎn)一姿,法線仍然有效。然而跃惫,world和object-space表示都將紋理綁定到特定方向的特定幾何形狀叮叹,這限制了紋理的重用。

相反爆存,擾動法線通常在切線空間中檢索蛉顽,即,相對于表面本身先较。這允許表面變形携冤,以及最大限度地重用正常紋理。切線空間法線映射也可以很好地壓縮闲勺,因為z分量的符號(與未擾動表面法線對齊的符號)通吃兀可以假定為正的。

image

法線映射可以很好地增強現(xiàn)實感菜循,參見圖6.36翘地。

與過濾顏色紋理相比,過濾法線貼圖是一個比較困難的問題癌幕。一般來說衙耕,法線和陰影顏色之間的關(guān)系不是線性的,所以標(biāo)準(zhǔn)的濾波方法可能會導(dǎo)致令人討厭的混疊勺远。想象一下臭杰,樓梯是由閃閃發(fā)光的白色大理石砌成的。在某些角度上谚中,樓梯的頂部或側(cè)面會吸收光線渴杆,并反射出明亮的高光。然而宪塔,樓梯的平均法線是45度角;它將從與原來樓梯完全不同的方向捕捉亮點磁奖。當(dāng)帶有高光的凹凸貼圖在沒有正確過濾的情況下被渲染時,由于高光在樣本降低的地方閃爍某筐,會產(chǎn)生分散注意力的閃爍效果比搭。

Lambertian曲面是一種特殊的情況,在這種情況下南誊,法線貼圖對著色的效果幾乎是線性的身诺。Lambertian著色幾乎完全是一個點積蜜托,這是一個線性操作。對一組法線求平均值并執(zhí)行點積霉赡,其結(jié)果相當(dāng)于對單個點積求平均值:

image

注意橄务,平均向量在使用之前沒有標(biāo)準(zhǔn)化。由式6.14可以看出穴亏,標(biāo)準(zhǔn)濾波和mipmaps對于Lambertian曲面幾乎產(chǎn)生了正確的結(jié)果蜂挪。結(jié)果并不完全正確,因為Lambertian渲染方程不是點積;它是一個clamp點積max(l·n, 0)嗓化,clamp操作使其非線性棠涮。這將使表面過度變暗,使光的方向發(fā)生偏光刺覆,但在實踐中严肪,這通常并不令人反感[891]畜埋。需要注意的是碉钠,通常用于法線映射的一些紋理壓縮方法(例如從其他兩個方法重構(gòu)zcomponent)不支持非單位長度法線,因此使用非標(biāo)準(zhǔn)化法線映射可能會造成壓縮困難慷彤。

在 non-Lambertian 曲面的情況下伦仍,將渲染方程的輸入作為一個整體過濾结窘,而不是單獨過濾法線貼圖,可能會產(chǎn)生更好的結(jié)果充蓝。實現(xiàn)這一點的技術(shù)將在第9.13節(jié)中討論隧枫。

最后,從高度圖h(x, y)中導(dǎo)出法線圖可能是有用的谓苟。首先官脓,在x和y方向上的導(dǎo)數(shù)的近似值是用中心差分來計算的

image

則在texel (x, y)處的非標(biāo)準(zhǔn)化法線為

image

必須注意紋理的邊界。

水平線映射[1027]可以通過讓凸起能夠?qū)㈥幱巴渡涞剿鼈冏约旱谋砻鎭磉M一步增強法線貼圖涝焙。這是通過預(yù)先計算額外的紋理來完成的卑笨,每個紋理都與表面平面的一個方向相關(guān)聯(lián),并為每個texel存儲地平線在那個方向的角度仑撞。有關(guān)更多信息赤兴,請參見第11.4節(jié)。

6.8 視差映射 Parallax Mapping

凹凸和法線貼圖的一個問題是凹凸不會隨著視角移動位置隧哮,也不會相互遮擋桶良。例如,如果你沿著真實的磚墻看沮翔,從某個角度你不會看到磚與磚之間的灰泥陨帆。墻壁的凹凸貼圖永遠不會顯示這種類型的遮擋,因為它只是改變了法線情況。更好的方法是讓凹凸實際影響表面上的哪個位置在每個像素處呈現(xiàn)疲牵。

視差映射的概念由Kaneko[851]于2001年提出承二,Welsh[1866]對其進行了改進和推廣。視差是指當(dāng)觀察者移動時纲爸,物體的位置相對移動亥鸠。當(dāng)觀眾移動時,這些凸起應(yīng)該看起來有高度缩焦。視差映射的關(guān)鍵思想是通過檢查發(fā)現(xiàn)的可見點的高度,對像素中應(yīng)該看到的內(nèi)容進行有根據(jù)的猜測责静。

image

對于視差貼圖袁滥,凹凸點存儲在一個高度場紋理中。當(dāng)查看給定像素處的表面時灾螃,會在該位置檢索高度場值题翻,并用于移動紋理坐標(biāo)以檢索表面的不同部分。移動的量是基于獲取的高度和眼睛到表面的角度腰鬼。參見圖6.37嵌赠。高度場值要么存儲在單獨的紋理中,要么打包在其他紋理的未使用顏色或alpha通道中(打包不相關(guān)的紋理時必須小心熄赡,因為這會對壓縮質(zhì)量產(chǎn)生負面影響)姜挺。在使用高度場值移動坐標(biāo)之前,會對其進行縮放和偏移彼硫。這個比例尺決定了高度場在地表之上或之下延伸的高度炊豪,而偏差給出了“海平面”的高度,在這個高度上不會發(fā)生位移拧篮。給定紋理坐標(biāo)位置p词渤,調(diào)整高度h,高度值vz和水平分量vxy的歸一化視圖向量v串绩,新的平行調(diào)整紋理坐標(biāo)padj

image

注意缺虐,與大多數(shù)著色方程不同,這里執(zhí)行計算的空間很重要——視圖向量需要在切線空間中礁凡。

雖然這只是一個簡單的近似高氮,但如果碰撞高度變化相對較慢,這種偏移在實際應(yīng)用中會相當(dāng)有效[1171]顷牌。附近相鄰的texel具有相同的高度纫溃,因此使用原始位置的高度作為新位置高度的估計值是合理的。然而韧掩,這種方法在淺視角下就行不通了紊浩。當(dāng)視圖向量接近地表地平線時,一個小的高度變化會導(dǎo)致較大的紋理坐標(biāo)偏移。由于檢索到的新位置與原始表面位置的高度相關(guān)性很小坊谁,甚至沒有相關(guān)性费彼,因此近似是失敗的。

為了改善這個問題口芍,Welsh[1866]引入了偏移限制的概念箍铲。這樣做的目的是限制移動量,使其永遠不會超過檢索到的高度鬓椭。方程是

image

注意颠猴,這個方程的計算速度比原來的方程快。幾何上的解釋是小染,高度定義了一個半徑翘瓮,超過這個半徑位置就不能移動。如圖6.38所示裤翩。

image

在陡(面)角處资盅,由于vz接近1,這個方程幾乎與原來的方程相同踊赠。在較淺的角度呵扛,偏移量的影響會受到限制。在視覺上筐带,這使得凹凸度在淺角度上減小今穿,但這比隨機采樣紋理要好得多。隨著視圖的變化伦籍,紋理也會出現(xiàn)問題荣赶,或者對于立體渲染,在這種情況下鸽斟,觀察者同時感知兩個必須提供一致深度提示的視點[1171]拔创。即使有這些缺點,視差映射與抵消限制成本只是幾個額外的像素著色器程序指令富蓄,并提供了一個相當(dāng)大的圖像質(zhì)量改善比基本的法線映射剩燥。Shishkovtsov[1631]通過沿著凹凸貼圖法線方向移動估計位置,改進了視差遮擋的陰影立倍。

6.8.1 視差遮擋映射 Parallax Occlusion Mapping

凹凸貼圖不修改基于高度場的紋理坐標(biāo);它只改變一個位置的Normal著色灭红。視差映射提供了一個簡單的高度場效應(yīng)近似,假設(shè)一個像素的高度與其相鄰像素的高度大致相同口注。這種假設(shè)可能很快就會被打破变擒。凹凸也不會相互遮擋,也不會產(chǎn)生陰影寝志。我們想要的是在像素處可見的東西娇斑,即視圖向量與高度場的第一個交點策添。

為了更好地解決這個問題,一些研究人員建議使用光線沿著視圖向量行進毫缆,直到找到一個(近似的)交點唯竹。這項工作可以在像素著色器中完成,其中高度數(shù)據(jù)可以作為紋理訪問苦丁。我們將對這些方法的研究歸納為視差映射技術(shù)的一個子集浸颓,這些技術(shù)以這樣或那樣的方式利用光線行進[192, 1171, 1361, 1424, 1742, 1743]。

image

這些類型的算法被稱為視差遮擋映射(POM)或浮雕映射方法旺拉,以及其他名稱产上。其關(guān)鍵思想是首先沿著投影向量測試一定數(shù)量的高度場紋理樣本。對于掠入射角度的視圖射線蛾狗,通常會生成更多的樣本晋涣,這樣就不會錯過最近的交點[1742,1743]。沿著光線的每個三維位置都被檢索出來淘太,轉(zhuǎn)換成紋理空間姻僧,并進行處理规丽,以確定它是在heightfield之上還是之下蒲牧。一旦找到了高度場下面的一個樣本,它下面的數(shù)量赌莺,以及之前的樣本上面的數(shù)量冰抢,將被用來找到一個交集位置。參見圖6.39艘狭。然后挎扰,使用所附的法線貼圖、彩色貼圖和任何其他紋理巢音,使用該位置對表面進行著色遵倦。多層高場可用于產(chǎn)生懸挑、獨立的重疊表面和雙面浮雕假體;參見13.7節(jié)官撼。高度場跟蹤方法也可以用來讓凹凸不平的表面投射陰影到它自己梧躺,無論是硬的[1171,1424]還是軟的[1742,1743]。比較請參見圖6.40傲绣。

image

關(guān)于這個話題有大量的文獻掠哥。雖然所有這些方法都是沿著一條射線前進的,但是有幾個不同之處秃诵⌒螅可以使用簡單的紋理來檢索高度,但是也可以使用更高級的數(shù)據(jù)結(jié)構(gòu)和更高級的rootfinding方法菠净。一些技術(shù)可能涉及著色器丟棄像素或?qū)懭肷疃染彌_區(qū)禁舷,這會損害性能彪杉。下面我們總結(jié)了大量的方法,但是請記住榛了,隨著gpu的發(fā)展在讶,最好的方法也在發(fā)展。這種“最佳”方法取決于ray行進過程中的內(nèi)容和步驟數(shù)霜大。

確定兩個規(guī)則樣本之間的實際交點問題是一個尋根問題构哺。在實踐中,高度場更多地被視為深度場战坤,矩形的平面定義了曲面的上限曙强。這樣,平面上的初始點就在高度場的上方途茫。Tatarchuk[1742, 1743]在找到了上面的最后一個點和下面的第一個點后碟嘴,利用割線法的單一步驟找到了一個近似解。Policarpo 等人[1424]使用二叉搜索發(fā)現(xiàn)的兩個點之間的一個更接近的交集囊卜。Risser等人[1497]通過使用secant 方法迭代來加速收斂娜扇。其折衷之處是可以并行地進行常規(guī)采樣,而迭代方法需要更少的總體紋理訪問栅组,但必須等待結(jié)果并執(zhí)行更慢的依賴紋理獲取雀瓢。蠻力方法似乎在整體上表現(xiàn)良好[1911]。

足夠頻繁地對高度場進行采樣是至關(guān)重要的玉掸。McGuire和McGuire[1171]提出對mipmap查找進行偏導(dǎo)刃麸,并使用各向異性mipmap來確保對高頻高度場(如表示尖峰或毛發(fā)的高場)的正確采樣。人們還可以存儲比法線貼圖分辨率更高的高度場紋理司浪。最后泊业,有些渲染系統(tǒng)甚至不存儲法線貼圖,而是使用交叉過濾器[40]動態(tài)地從高度場導(dǎo)出法線啊易。696頁的方程16.1給出了該方法吁伺。

提高性能和采樣精度的另一種方法是不首先定期采樣heightfield,而是嘗試跳過中間的空格租谈。Donnelly[367]將高度場預(yù)處理成一組體素篮奄,存儲在每個體素與高度場表面的距離中。通過這種方式垦垂,可以快速跳過中間的空間宦搬,代價是為每個heightfield增加存儲空間。Wang等[1844]使用五維位移映射方案來保持從所有方向和位置到表面的距離劫拗。這允許復(fù)雜的曲面间校、自陰影和其他效果,但代價是相當(dāng)大的內(nèi)存页慷。Mehra和Kumar[1195]出于類似的目的使用方向距離地圖憔足。Dummer[393]引入了錐階映射的思想胁附,并且Policarpo和Oliveira[1426]對錐階映射的思想進行了改進。這里的概念是為每個高度場位置存儲一個圓錐體半徑滓彰。這個半徑定義了光線上的一個區(qū)間控妻,其中與高度場交點最多為一個。這個屬性允許沿著光線快速跳躍而不丟失任何可能的交叉點揭绑,盡管代價是需要依賴的紋理讀取弓候。另一個缺點是創(chuàng)建圓錐步驟映射所需的預(yù)計算,這使得該方法不能用于動態(tài)更改高度字段他匪。Schroders和Gulik[1581]提出了四叉樹地形映射菇存,這是一種在遍歷過程中跳過卷的分層方法。Tevs等人[1760]使用“最大mipmap”允許跳過邦蜜,同時最小化預(yù)計算成本依鸥。Drobot[377]還使用存儲在mipmaps中的四叉樹結(jié)構(gòu)來加速遍歷,并提出了一種混合不同高度場的方法悼沈,其中一種地形類型轉(zhuǎn)換為另一種地形類型贱迟。

image

上述所有方法的一個問題是,沿著物體輪廓邊緣的錯覺會被打破絮供,這將顯示出原始表面的光滑輪廓衣吠。參見圖6.41。關(guān)鍵的思想是杯缺,呈現(xiàn)的三角形定義了像素著色器程序應(yīng)該評估哪些像素蒸播,而不是表面的實際位置睡榆。此外萍肆,對于曲面,輪廓的問題變得更加復(fù)雜胀屿。一種方法是由Oliveira和Policarpo[1325,1850]描述和開發(fā)的塘揣,它使用二次剪影近似技術(shù)。Jeschke等[824]和Dachsbacher等[323]都給出了正確處理輪廓和曲面的更通用和健壯的方法(并回顧了以前的工作)宿崭。赫什(Hirche)[750]首先探索的是將網(wǎng)格中的每個三角形向外擠壓亲铡,形成棱鏡。渲染這個棱鏡可以對所有可能出現(xiàn)高度場的像素進行評估葡兑。這種方法稱為shell映射奖蔓,因為擴展網(wǎng)格在原始模型上形成一個單獨的shell。通過保持棱鏡與光線相交時的非線性特性讹堤,可以實現(xiàn)對高度場的真實渲染吆鹤,盡管計算起來很昂貴。圖6.42顯示了這種技術(shù)令人印象深刻的用法洲守。

image

6.9 紋理燈光 Textured Lights

紋理也可以用來增加光源的視覺豐富性疑务,并允許復(fù)雜的強度分布或聚光燈功能沾凄。對于所有的光照都限制在一個錐體或錐體上的光,投射紋理可以用來調(diào)節(jié)光的強度[1192,1597,1904]知允。這允許使用形狀的聚光燈撒蟀、有圖案的燈,甚至是“幻燈機”效果(圖6.43)温鸽。這些燈通常被稱為gobo或cookie燈保屯,以專業(yè)劇院和電影照明中使用的剪紙的術(shù)語命名。有關(guān)投影映射以類似的方式投射陰影的討論涤垫,請參見第7.2節(jié)配椭。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雹姊,隨后出現(xiàn)的幾起案子股缸,更是在濱河造成了極大的恐慌,老刑警劉巖吱雏,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敦姻,死亡現(xiàn)場離奇詭異,居然都是意外死亡歧杏,警方通過查閱死者的電腦和手機镰惦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬绒,“玉大人旺入,你說我怎么就攤上這事】Γ” “怎么了茵瘾?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咐鹤。 經(jīng)常有香客問我拗秘,道長,這世上最難降的妖魔是什么祈惶? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任雕旨,我火速辦了婚禮,結(jié)果婚禮上捧请,老公的妹妹穿的比我還像新娘凡涩。我一直安慰自己,他們只是感情好疹蛉,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布活箕。 她就那樣靜靜地躺著,像睡著了一般氧吐。 火紅的嫁衣襯著肌膚如雪讹蘑。 梳的紋絲不亂的頭發(fā)上末盔,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音座慰,去河邊找鬼陨舱。 笑死,一個胖子當(dāng)著我的面吹牛版仔,可吹牛的內(nèi)容都是我干的游盲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛮粮,長吁一口氣:“原來是場噩夢啊……” “哼益缎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起然想,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤莺奔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后变泄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體令哟,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年妨蛹,在試婚紗的時候發(fā)現(xiàn)自己被綠了屏富。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛙卤,死狀恐怖狠半,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颤难,我是刑警寧澤神年,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乐严,受9級特大地震影響瘤袖,放射性物質(zhì)發(fā)生泄漏衣摩。R本人自食惡果不足惜昂验,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艾扮。 院中可真熱鬧既琴,春花似錦、人聲如沸泡嘴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酌予。三九已至磺箕,卻和暖如春奖慌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背松靡。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工简僧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雕欺。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓岛马,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屠列。 傳聞我的和親對象是個殘疾皇子啦逆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355