GAMES101筆記(4)——Texture Mapping

課程鏈接:GAMES101-現(xiàn)代計算機圖形學(xué)入門-閆令琪
課程講師:閆令琪
本系列筆記為本人根據(jù)學(xué)習(xí)該門課程的筆記翎冲,僅分享出來供大家交流骚揍,希望大家多多支持GAMES相關(guān)講座及課程宏榕,如涉及侵權(quán)請聯(lián)系我刪除:albertlidesign@gmail.com

如下圖治力,我們可以看到兩個臺燈在照亮一個地板和一個球眶熬,我們是可以得到光的強度妹笆,但是比如球上面,自身有不同的顏色娜氏,盡管上面所有的點共用的是同一個著色模型拳缠,但是不同位置的漫反射系數(shù)發(fā)生了改變。對于地板來說也是如此贸弥,它有自己的漫反射系數(shù)窟坐,這個系數(shù)反映了木質(zhì)的質(zhì)感。因此我們希望在模型的不同位置定義不同的屬性绵疲,這就要引入紋理映射的最基本的思路哲鸳,它的根本作用是定義一個點的屬性。


那么怎么定義任何一個點它的基本屬性呢盔憨?我們需要理解我們要定義在物體表面上徙菠,那么我們應(yīng)該怎么樣去理解物體表面呢?首先郁岩,任何一個三維物體的表面其實都是二維的婿奔。例如下圖,地球儀可以被展開成世界地圖问慎,這也就是說三維物體的表面其實是二維的萍摊,多個物體也可以被展開成多個平面,因此通過這種方式如叼,我們可以和一張圖來做一個一一對應(yīng)關(guān)系冰木。因此所謂紋理,其實就是一張圖笼恰,這張圖我們可以任意地裁切片酝,用其中一部分,也可以拉伸挖腰、壓縮等操作雕沿,最后把它蒙在三維物體的表面,這個過程就叫做紋理映射(Texture Mapping)猴仑。

來看一個具體的例子审轮,左上角是一個渲染結(jié)果肥哎,即Blinn-Phong得到的結(jié)果,我們想得到有質(zhì)感的模型該怎樣做呢疾渣?根據(jù)剛才的思路篡诽,要把一張圖貼在模型上,我們自然要知道怎么貼榴捡。三維空間中最基本的東西是三角形杈女,那么三角形在物體上應(yīng)該如何映射到紋理上呢?也就是物體上的某一個三角形在紋理上對應(yīng)的位置在哪吊圾?對于任何一個三角形上的頂點都能找到它在紋理上的點达椰。

對于任何一個模型,我們要能夠?qū)⑺归_成一個平面项乒,并且希望其產(chǎn)生的三角形盡可能地少扭曲啰劲,這是一個很重大的研究方向叫做參數(shù)化(Parameterization),是幾何上非常厲害的研究檀何。我們這里不管怎么把三角形映射到紋理上這件事蝇裤,就假設(shè)我們已經(jīng)知道如何把三角形貼在紋理上,并且知道三角形上的頂點在紋理上的坐標频鉴。既然提到了紋理上的坐標栓辜,那我們就該在紋理上定義一個坐標系,這個坐標系通常會使用來表示紋理上任何一個點垛孔。例如下圖所示

一般來說藕甩,都認為紋理的范圍是在中,這可以方便處理似炎,不管分辨率、長寬比是多少悯姊。

紋理可以應(yīng)用在各種各樣的物體表面羡藐,如果我們把紋理的坐標顯示出來,就會看到下圖結(jié)果

紋理映射就像貼瓷磚一樣不斷地重復(fù)紋理悯许,最后的渲染結(jié)果就是下圖

因此紋理可以重復(fù)多次仆嗦,但是紋理在重復(fù)的過程中會產(chǎn)生縫隙,就容易被人發(fā)展破綻先壕。但是上圖這個例子中瘩扼,它使用的紋理設(shè)計的好,使得這些紋理復(fù)制和重復(fù)的時候可以做到無縫銜接垃僚,這種紋理的設(shè)計需要各種各樣的算法集绰,其中一個叫Wang Tiled。

下一個問題就是谆棺,我們已經(jīng)知道了三角形三個頂點對應(yīng)的紋理坐標栽燕,那么我們?nèi)绾沃廊切蝺?nèi)部的點對應(yīng)的紋理坐標的uv呢?這里就又涉及到了插值問題。

Barycentric coordinates

讓我們來看看如何在三角形內(nèi)部進行插值碍岔,為了實現(xiàn)這一方法浴讯,我們引入了一個叫做重心坐標(Barycentric coordinates)的概念。

為什么我們要在三角形內(nèi)部做插值蔼啦?

(1)首先是因為我們都是對三角形頂點進行操作的榆纽,我們希望在三角形內(nèi)部可以平滑地過渡。也就是說捏肢,當(dāng)頂點處被賦予一個值時奈籽,三角形內(nèi)部地任何一個人也能得到一個過渡的值,這樣這個值就能從一個頂點過渡到另外一個頂點猛计。
(2)插值的內(nèi)容可以有很多唠摹,比如貼圖坐標,顏色奉瘤,法向量等勾拉。比如在紋理映射中,我們可以把三角形頂點映射到貼圖上對應(yīng)的(u,v)盗温,那么三角形內(nèi)部的點對應(yīng)的uv坐標就可以通過插值來計算得到藕赞。基本上可以說卖局,插值可以對三角形的任意屬性進行插值斧蜕。

怎么做插值?

使用重心坐標砚偶。首先批销,重心坐標是定義在一個三角形上的,即給定一個三角形染坯,可以得到一套重心坐標均芽。重心坐標是說,在給定三角形的平面內(nèi)的任何一點都可以表示成三角形A,B,C三個點的線性組合单鹿,如下圖所示掀宋,其中\alpha , \beta , \gamma合在一起構(gòu)成一個坐標用來表示三角形內(nèi)的點(x,y)。也就是說仲锄,為了描述一個點的位置劲妙,我們不需要構(gòu)建直角坐標系,給定任意三個點儒喊,只要有一個點在這三個點所在的平面上镣奋,我們就可以得到用這三個點的線性組合來表示出該點。


觀察公式怀愧,也就是說實際上我們只需要知道其中兩個唆途,就可以求出第三個富雅。除此之外,還需注意肛搬,這個點如果在三角形內(nèi)没佑,那么要求必須都是非負的,換句話說如果滿足三個值都是非負的且它們的和等于1温赔,那么這個點一定在三角形內(nèi)蛤奢。

  • 如下圖示例,問A點自己的重心坐標是什么陶贼?我們可以從定義可知啤贩,令\alpha = 1, \beta = 0, \gamma = 0來得到A點的重心坐標。
  • 那么為什么重心坐標的三個值之和為1呢拜秧?這是為了限制所得到的點是在三角形所在的平面內(nèi)痹屹。
  • 如果在三角形內(nèi)有任意一點,我們該如何計算它的重心坐標呢枉氮?其實可以根據(jù)這個點與三點的連線所劃分出的三角形的面積來求得志衍,如下圖所示。


  • 除此之外聊替,根據(jù)重心的定義方法我們可以得到一個非常特殊的點楼肪,就是三角形的重心,重心有一個非常好的性質(zhì)惹悄,即如果將重心與三角形的三點相連春叫,會得到三個等面積的小三角形,所以重心的重心坐標就是(\frac{1}{3},\frac{1}{3},\frac{1}{3})
  • 上面我們知道計算重心坐標需要計算面積泣港,下面給出一個更為簡化的方法暂殖,直接使用重心坐標的一般表達式(當(dāng)然也可以用面積來推出這個公式):

    接下來我們就可以用重心坐標來做插值了。有了重心坐標当纱,我們可以用這樣的方法來計算頂點上的任意屬性呛每,可以是位置、紋理坐標惫东、顏色莉给、深度毙石、材料屬性等等廉沮。

    需要注意的是,盡管重心坐標應(yīng)用非常好用徐矩,但是它不能應(yīng)用于投影滞时。假如上圖中三角形是空間中的三角形,但是如果我們把它投影到某一平面上滤灯,我們可以計算出三個點在投影之后的坐標坪稽,但是如果對投影之后的三角形來計算重心坐標就會得到一個不一樣的坐標曼玩。這是說重心坐標不能保證投影后不變,如果我們想插值三維空間中的屬性窒百,就應(yīng)該取三維空間中的坐標黍判,來計算重心坐標而不能在投影之后再做。這就涉及到了關(guān)于深度的問題篙梢。在做光柵化顷帖,我們把三角形投影到了屏幕上,它會覆蓋很多像素渤滞,這些像素都有中心贬墩,我們可以計算出中心所在的投影之后的三角形的位置,那么我們不可以在投影之后的三角形里面的深度做插值妄呕,而是應(yīng)該找到這個位置對應(yīng)在三維空間中的坐標陶舞,然后在三維空間中計算出正確的插值,再把結(jié)果拿回來绪励。至于怎么把投影到屏幕上的三角形再投影回去肿孵,應(yīng)用逆變換就可以了。
    因此在三維空間中的屬性一定要在三維空間中做插值优炬。根本原因就是重心坐標在投影操作下會發(fā)生變化颁井。

Applying Textures

了解了重心坐標,下一步就是去了解怎么把紋理應(yīng)用在實際的渲染中〈阑ぃ現(xiàn)在我們知道屏幕上的點在三角形上有一個位置(像素中心)雅宾,我們也可以計算出貼圖上任何一個點對應(yīng)在三角形上的位置了,使用重心坐標做插值即可葵硕,我們只需要從紋理上查詢對應(yīng)的顏色眉抬,就可以得到屏幕上的點的顏色,我們可以將其視為Blinn-Phong模型中漫反射的系數(shù)k_d懈凹,這就相當(dāng)于把貼圖貼在了物體上蜀变。但是這樣簡單的操作可能會產(chǎn)生一些問題歇由。

問題一:Txture Magnification (過小的貼圖)

假設(shè)要渲染一堵墻嗦明,定義渲染分辨率為4k,但是使用的紋理只有256×256禀横,這時任意一個點去查找顏色的時候會查到一些非整數(shù)的值们陆。也就是說寒瓦,紋理太小了,紋理就會被拉大坪仇,拉大了就會出現(xiàn)如下圖所示的現(xiàn)象杂腰。一個解決方法是,當(dāng)查到非整數(shù)的值時椅文,直接四舍五入Round成整數(shù)喂很,這樣在一定范圍內(nèi)惜颇,很多像素要查找的是相同的紋理上的像素(texel),這樣就會得到下左圖結(jié)果少辣。


那么我們?nèi)绾尾拍艿玫缴蠄D右側(cè)兩張圖的結(jié)果呢凌摄?本質(zhì)上看就是如何把查詢得到的一個非整數(shù)的值來做一個模糊的效果。

Bilinar Interpolation

雙線性插值是其中一個方法漓帅。假設(shè)我們的高分辨率像素的中心映射到了一個非整數(shù)的位置上望伦,下圖4×4的格子為texels,假設(shè)映射到了下圖紅點處煎殷,那么我們?nèi)绾沃兰y理在這個點處的值是多少屯伞。


在四舍五入的方法中,相當(dāng)于直接去找離它最近的texel的中心豪直,那當(dāng)然在該texel里的所有像素都顯示了相同的顏色劣摇。一個巧妙的方法是先找該點鄰近的四個texels。

接下來弓乙,再連接四個texels的中心末融,連成一個四邊形,我們可以找出紅點距離該四邊形左下角的點的分別在水平和豎直方向上的距離暇韧,分別記作勾习,我們定義兩個相鄰texel的距離為1,因此這兩個值一定在之間懈玻。

然后我們定義一個操作巧婶,叫線性插值:,如果我們用來作線性插值涂乌,我們可以求出和艺栈,水平向的插值完成后,我們還可以再對豎直方向做一次插值湾盒,使用將兩個值插值即可湿右,即。

因此我們發(fā)現(xiàn)罚勾,紅點處的顏色綜合考慮了它周圍四個點的顏色毅人,并且這個紅點處的顏色是這四個點平滑過渡的顏色。由于做了水平向和豎直向兩類線性插值(順序無關(guān))尖殃,因此稱為雙線性插值(Bilinar Interpolation)丈莺。

使用雙線性插值方法,就消除了因為貼圖過小而造成的鋸齒效果分衫,但是它的質(zhì)量并不是最好的场刑,比如在問題一中的圖般此,還有一種方法稱為Bicubic插值方法蚪战,它和Bilinar插值的區(qū)別在于牵现,它取了周圍16個texels做插值,只不過每次用4個做插值邀桑,這就有三次的插值瞎疼。因此它的計算量要大,消除鋸齒的效果更好壁畸。

問題二:Txture Magnification (過大的貼圖)

那么如果紋理過大會怎樣呢贼急?紋理大了會引起更嚴重的問題,如下圖所示捏萍,假設(shè)一張面貼了一張紋理太抓,紋理是格子,如果我們還是用像素的中心找紋理坐標令杈,再把這個值寫回像素走敌,我們就會得到下右圖結(jié)果,遠處效果為摩爾紋逗噩,近處為鋸齒掉丽,即走樣問題。



我們來分析一下問題在哪异雁,因為近處捶障,覆蓋的紋理上的區(qū)域相對較小,在遠處纲刀,一個像素覆蓋了很大的一個區(qū)域项炼。也就是說屏幕上的像素覆蓋了紋理上的區(qū)域的大小是各不相同的。之前我們做抗鋸齒使用了MSAA示绊,也就是對一個像素使用更多的樣本來采樣芥挣,這里我們同樣也可以這么做,這樣得到的結(jié)果也是可以的耻台,但是計算量過大空免。


=

走樣問題就是信號變化過快,我們采樣的頻率跟不上信號變化的頻率盆耽。在這個問題上體現(xiàn)在蹋砚, 當(dāng)紋理特別大的時候,一個像素里面可能包含很大的頻率摄杂,這樣就需要更高頻的采樣方法才能夠跟上紋理變化的頻率坝咐。如果我們不想用這么多的采樣點改怎么辦?我們這里可以避免采樣析恢,原本我們做采樣是像素在紋理上覆蓋很大一塊區(qū)域墨坚,但如果我們立刻就可以知道這個區(qū)域里的平均值是多少就好了。我們要解決的問題就是映挂,對于任何一個區(qū)域我們立刻就能求出它的平均值泽篮,我們可以使用Mipmap盗尸。

Mipmap

Mipmap是一個在圖形學(xué)中廣泛運用的經(jīng)典概念,它能做范圍查詢(fast, approx, square)帽撑。這個算法快泼各,但是只能做近似的、方形范圍查詢亏拉。Mipmap就是從一張圖生成一系列圖扣蜻,例如有一張紋理為128×128,稱之為第0層紋理及塘,我們可以生成更多更高層的紋理莽使,每一層都是上一層縮小到一半的結(jié)果。例如第0層為128×128笙僚,第一層為64×64吮旅,第二層為32×32,直到最后變成一個像素味咳,這樣一共就有log層庇勃。


我們可以在渲染之前把這些Mipmap都生成,問題在于槽驶,我們生成了這所有的Mipmap相比于原本的圖责嚷,占用了多大的存儲量呢?答案是掂铐,也就是說罕拂,原本的圖存儲量是,生成它的所有Mipmap只比原來多占用了原本存儲量的全陨。

接下來我們要用Mipmap近似地在一個正方形區(qū)域內(nèi)做范圍查詢爆班,要立刻得到范圍內(nèi)的平均值∪枰蹋可以想象到柿菩,任何一個像素都可以映射到紋理上一個區(qū)域,那我們該如何得到這個區(qū)域呢雨涛?很簡單枢舶,例如圖中我們像素上的藍色和紅色采樣點,藍色點有它的鄰居替久,紅色點也有它的鄰居凉泄,如果我們想算紅點所占據(jù)的像素的覆蓋面積,我們可以取它自己的中心和它鄰居的中心分別投影到貼圖空間上去蚯根,在屏幕空間中后众,所有點到其鄰點的距離都是一個像素,那么我們能求得它們映射到紋理貼圖上的距離,映射后會得到一個不規(guī)則的區(qū)域蒂誉,我們可以使用一個正方形來近似這個不規(guī)則的區(qū)域教藻。



下面的問題是,我們?nèi)绾胃鶕?jù)計算好的Mipmap來計算這個邊長為的正方形的區(qū)域的平均值拗盒?我們只需求,即可求出這個正方形應(yīng)該所在的層數(shù)锥债,這樣就能查出這個區(qū)域的平均值了陡蝇。

這樣一來,離攝像機近的點就會在很低層去查詢哮肚,離攝像機遠的就會在很高的層去查詢登夫。但是會發(fā)現(xiàn),不同層之間點的顏色可能不是連續(xù)的允趟,因為我們只算了離散的若干層恼策,例如我們算了第層,算了第層潮剪,但是不知道第層的結(jié)果涣楷。

怎么解決這個問題呢?還是插值抗碰,我們得到了第層和第層狮斗,那我們對這兩層內(nèi)部分別使用雙線性插值,做出來之后我們可以把這兩層雙線性插值的值合在一塊就可以在層與層之間再做一次插值弧蝇,這樣就是第三個不同的插值碳褒,這里我們叫三線性插值(Trilinear Interpolation)。這樣看疗,在紋理的內(nèi)部沙峻,不管坐標是否為整數(shù)坐標都可以雙線性插值出一個平滑過渡的值,在層與層之間也可以插值出一個平滑過渡的值两芳,這樣就可以對于任何一個像素中心摔寨,做一次查詢就可以得到所覆蓋的區(qū)域的平均值。使用三線性插值怖辆,我們得到了下圖所示結(jié)果(由于幾何造成的問題暫時忽略)祷肯,它在游戲、實時渲染領(lǐng)域得到了非常廣泛的運用疗隶,因為它可以得到一個完全連續(xù)的表達佑笋,并且開銷很小。

回到我們前面的示例斑鼻,Mipmap是否能夠真的解決問題呢蒋纬?我們假設(shè)一個像素做512個采樣點來得到的結(jié)果是一個準確的結(jié)果,如下圖所示。

那如果我們使用Mipmap蜀备,得到如下結(jié)果关摇,會發(fā)現(xiàn)在遠處Mipmap把所有的細節(jié)全部都忽略掉了,遠處出現(xiàn)了完全不應(yīng)該糊掉的區(qū)域碾阁,我們稱之為Overblur输虱。為什么會出現(xiàn)這種情況呢?因為它只能查詢一個方塊的區(qū)域內(nèi)的平均值脂凶,如果不是方形那就沒辦法宪睹。

Antisotropic Filtering

有一個辦法可以部分解決Mipmap產(chǎn)生的問題,就是各向異性過濾(Antisotropic Filtering)蚕钦。它的效果要比Mipmap要好亭病。Mipmap本身是將原始的一張圖,將其長寬各不斷地縮小一半嘶居,Mipmap其實是計算反映在對角線上的圖片罪帖,而各向異性過濾比Mipmap多了不均勻的水平和豎直的壓縮,各向異性就是水平向和豎直向都有壓縮邮屁,如下圖所示整袁,比如對于衛(wèi)星來說,每一行都是高度不變佑吝,寬度變葬项,每一列都是高度變,寬度不變迹蛤。也就是說通過這種方式的預(yù)計算民珍,我們可以查詢到任何一個被壓扁的圖上的一個位置,這樣我們就可以查詢到一個矩形的區(qū)域而不被限制在正方形盗飒。


這是因為屏幕上的像素映射到紋理上以后很有可能是一個不規(guī)則矩形嚷量,如果我們近似成一個正方形,就會求一個很大的區(qū)域逆趣,這樣就會造成overblur蝶溶。如果我們使用了各向異性過濾,就可以得到一個矩形區(qū)域宣渗,自然得到的結(jié)果就會好很多抖所。但是假如一個像素對應(yīng)到貼圖中是一個斜45度的矩形,各向異性過濾仍然不能很好的解決問題痕囱,因此它只是部分解決問題田轧。

因此人們又發(fā)明了另外一種方法,稱為EWA過濾鞍恢,它是將映射后的不規(guī)則的形狀拆成很多不同的圓形去覆蓋這個不規(guī)則形狀傻粘,比如一個橢圓可以被拆成三層橢圓進行多次查詢來得到結(jié)果每窖,但是代價就是查詢量大。

注意弦悉,各向異性過濾的額外開銷是原本的3倍窒典,而Mipmap僅為原本的。在游戲中我們經(jīng)常能看到有個“多少”的選項稽莉,意思就是計算多少層瀑志,比如就是方向上壓縮一次,就是各方向壓縮兩次污秆,隨著的增加最后存儲量達到原始的倍劈猪,它和顯存關(guān)系很大和計算力關(guān)系不大,這意味著如果顯存足夠可以把各向異性過濾開到最高混狠,對性能幾乎不會有影響岸霹。

到目前為止疾层,除了陰影沒講解将饺,其他整個渲染過程都已經(jīng)完成了。

Apllications of textures

根據(jù)前面的內(nèi)容痛黎,我們知道給定一個網(wǎng)格予弧,我們可以做著色,例如Flat Shading得到一個個格子的shading湖饱,也可以做Phone Shading掖蛤。接著可以對它做各種貼圖,下面講解一些高級的紋理應(yīng)用井厌。


首先紋理就是一張圖蚓庭,我們說它可以做各種各樣的應(yīng)用,在現(xiàn)代GPU貼圖仅仆,我們可以把紋理理解成一塊內(nèi)存器赞,并且我們可以對紋理上的這塊區(qū)域進行一個范圍查詢(或著說過濾),并且查詢速度非衬拱荩快港柜。因此紋理完全可以理解成一塊數(shù)據(jù),可以做不同類型的查詢咳榜,沒有必要完全限制在一個圖像上夏醉。從這個角度出發(fā),它可以表示的東西就太多了涌韩。

環(huán)境光照

環(huán)境光照畔柔,也有叫環(huán)境光映射或者環(huán)境貼圖。假如我們站在一個房間里面往四面八方看臣樱,會發(fā)現(xiàn)有來自四面八方的光释树,如果我們把任何一個方向的光記錄下來肠槽,就能得到環(huán)境貼圖(環(huán)境光照),因此我們可以用這幅圖來做渲染奢啥,使它能夠反射出任何方向來的光秸仙,例如下圖中的茶壺反映出了窗戶。因此我們可以用紋理去描述環(huán)境光桩盲,這就比只用一個點光源要好很多寂纪,具體的計算方法后面再說。



正常來講赌结,我們記錄環(huán)境光信息不能只記錄方向捞蛋,物體在空間內(nèi)的不同位置會有不同的環(huán)境光效果,但是這里在環(huán)境光貼圖中只記錄環(huán)境光的方向柬姚。



環(huán)境光是怎么得到的呢拟杉?我們可以在空間中放一個鏡面球,它所反射出來的就是環(huán)境光量承。因此我們可以把環(huán)境光存儲在一個球上搬设,然后把它展開得到環(huán)境光貼圖。這就是Spherical Environment Map撕捍。

但是如果我們把它展開拿穴,這里會有一個扭曲問題,這可以參考世界地圖忧风,南極洲的實際大小受到了球展開時扭曲的影響默色。后來,人們就發(fā)現(xiàn)了一個辦法來解決這個問題狮腿,他們將球用一個包圍盒包住腿宰,接著我們用從球心到球上某一位置的連線作延長,直到接觸到包圍盒的表面上缘厢,這樣就將這些信息存到了立方體的表面上吃度,就能得到六張圖,因為一個立方體可以展開成六個面昧绣。因此规肴,我們可以把環(huán)境光記錄在一個立方體所對應(yīng)的各個表面上再展開,立方體的各個面都是均勻的夜畴,因此它能夠避免扭曲拖刃,這一方法稱為Cube Map。但是這一方法也有它的問題贪绘,給定一個方向兑牡,如果要找對應(yīng)的顏色則需要先判斷它在立方體的哪張面上,增加了計算量税灌。



凹凸貼圖

紋理的另一個很重要的應(yīng)用是凹凸貼圖均函。之前我們用紋理是為了替換Blinn-Phong模型里的參數(shù)k_d亿虽,除此之外,紋理還可以定義任何屬性苞也。比如它可以定義在一個模型上的點的相對高度洛勉。一個球假設(shè)它原本有一個基礎(chǔ)的表面,然后紋理可以定義這個表面上的點沿著法線方向的相對高度如迟。


比如上右圖所示收毫,一個類似橘子的球,如果我們用三角形來表示則需要無數(shù)個三角形面殷勘,而如果我們用紋理來定義橘子表面上的凹凸質(zhì)感此再,就可以定義任何一個點的相對高度。我們知道玲销,相對高度變了意味著法線就會變输拇,法線變換后著色就會變化,人們在看到一定程度的明暗變化后就會認為這里有凸起的質(zhì)感贤斜,因此策吠,使用貼圖可以人為地制作出假的法線,從而得到一個假的著色結(jié)果最終欺騙人眼蠢古,就能既做出凹凸貼圖的質(zhì)感又能避免復(fù)雜的幾何奴曙。這就是凹凸貼圖的基本原理别凹。

我們再具體來看草讶,我們知道了,通過凹凸貼圖炉菲,我們可以定義一個復(fù)雜的紋理堕战,但是并不改變幾何信息,也就是說三角形數(shù)不變拍霜。然后我們對每一個像素的法線做一個擾動嘱丢,通過定義的不同位置的高度,根據(jù)鄰近不同位置的高度差來重新計算它的法線祠饺。也就是說越驻,紋理定義的是任何一個點相對高度的移動。如上圖所示道偷,黑色線為原始的物體表面缀旁,然后我們運用了一個貼圖,來告訴我們這個點的相對高度應(yīng)該如何變化勺鸦。對于任何一個點并巍,它原本的法線應(yīng)該是垂直于黑色表面的,但是凹凸貼圖改變了它的相對高度换途,其法線自然也發(fā)生了改變懊渡,變成了垂直于黃色線表面刽射。那么我們應(yīng)該如何計算它的變化呢?

如上圖所示剃执,我們先從一維來考慮誓禁,假設(shè)原本的表面是一個平面,藍色為凹凸貼圖定義出來的肾档,那么原本點的法線應(yīng)該是∠趾幔現(xiàn)在要求凹凸貼圖變化后的點的法線,只需先求出該點在凹凸貼圖定義的函數(shù)上的點的導(dǎo)數(shù)阁最,這里定義了為一個常數(shù)戒祠,來表示凹凸貼圖的影響。這樣我們就得到了切線速种。接著姜盈,我們知道法線就是垂直于切線的方向,只需要將切線逆時針旋轉(zhuǎn)90°即可得到法線配阵,法線為馏颂。
所以整個思路就是,我們用凹凸貼圖來定義切線棋傍,再通過切線來計算法線救拉。
那么在三維中,假設(shè)表面上的法線瘫拣,那么貼圖如何影響該點的法線呢亿絮?我們?nèi)匀豢梢韵惹蟪鏊奶荻龋春汪镏簦@表明了點在和兩個不同方向上的變化派昧,這樣就表示出了切線方向,最后法線方向即為拢切。注意蒂萎,這里我們定義了一個局部坐標系,即認為所有的點一開始的法線都是淮椰,我們是在這個坐標系中對法線進行了更改五慈,最后再將這個法線變換到世界坐標系中。

Displacement mapping

除了凹凸貼圖主穗,還有一個更現(xiàn)代化的做法泻拦,叫做位移貼圖(Displacement mapping)。它和凹凸貼圖一樣黔牵,都是通過紋理去定義任何一個點的相對高度差聪轿,因此輸入完全一樣,使用了完全相同的紋理猾浦,只不過位移貼圖會真的將頂點做移動陆错,而不是通過移動位置換算成法線變化來實現(xiàn)假的效果灯抛。凹凸貼圖不會改變物體的幾何,這會在物體的邊緣處“露餡”音瓷,邊緣處的凹凸質(zhì)感不會被表達出來对嚼,凸起的部位也不會投影到自身。而位移貼圖會實際地改變物體的幾何绳慎,它不會有上述問題纵竖,但是它對模型的三角形數(shù)量有著嚴格要求,即三角形的數(shù)量要足夠多來使采樣率比紋理定義的頻率高(又是采樣問題)杏愤。

前面所說的各種紋理的應(yīng)用都是二維的靡砌,即我們?nèi)匀粚⒓y理當(dāng)圖來看,其實紋理也可以是三維的珊楼,如下圖所示通殃,有一個球,如果我們將其砍掉一半厕宗,我們希望能夠看到它的內(nèi)部是怎樣的画舌,這就要求紋理能夠定義空間中任何一個點的值∫崖可想而知曲聂,實際上這樣的紋理的圖并沒有被生成,只是定義在一個三維空間中的噪聲函數(shù)佑惠,這樣給定空間中任何一個點都能算出它的值是多少朋腋,這個噪聲可以經(jīng)過一系列處理,就可以變成我們需要的樣子兢仰,比如大理石的質(zhì)感乍丈。


紋理還可以記錄一些之前已經(jīng)算好的信息剂碴,我們已經(jīng)知道了怎么做著色把将,但是還不了解陰影。下圖我們發(fā)現(xiàn)忆矛,最右側(cè)眉毛凸起的部位遮擋住了眼圈察蹲,這就是說這里產(chǎn)生了陰影,我們之前算shading的時候會考慮不到這里催训。我們是可以通過環(huán)境光遮蔽(Ambient Occlusion)來計算出這里的陰影洽议,這里先簡單提一句,這個方法就是先計算好這些陰影漫拭,再把它寫進一張貼圖亚兄,最后再貼回來,所謂貼回來也就是相乘采驻,可見就是1不可見就是0审胚,也就是說匈勋,著色的結(jié)果乘以計算好的環(huán)境光遮蔽的紋理就能得到右圖的結(jié)果了。也就是說很多計算我們可以提前去做膳叨,然后用紋理來記錄這些信息洽洁,之后就取決于如何解釋。

最后菲嘴,紋理還可以運用到體積渲染中去饿自,原本我們說光照模型只考慮一個表面,然而在醫(yī)學(xué)里龄坪,我們會用CT呈像掃描人體最后返回出三維空間的信息昭雌,我們可以通過記錄這些信息來做渲染,這些信息我們也稱其為紋理健田。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末城豁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抄课,更是在濱河造成了極大的恐慌唱星,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跟磨,死亡現(xiàn)場離奇詭異间聊,居然都是意外死亡,警方通過查閱死者的電腦和手機抵拘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門哎榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人僵蛛,你說我怎么就攤上這事尚蝌。” “怎么了充尉?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵飘言,是天一觀的道長。 經(jīng)常有香客問我驼侠,道長姿鸿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任倒源,我火速辦了婚禮苛预,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笋熬。我一直安慰自己热某,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昔馋,像睡著了一般芜繁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绒极,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天骏令,我揣著相機與錄音,去河邊找鬼垄提。 笑死榔袋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铡俐。 我是一名探鬼主播凰兑,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼审丘!你這毒婦竟也來了吏够?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滩报,失蹤者是張志新(化名)和其女友劉穎锅知,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脓钾,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡售睹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了可训。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昌妹。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡冗尤,死狀恐怖逐抑,靈堂內(nèi)的尸體忽然破棺而出产雹,到底是詐尸還是另有隱情忍宋,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布榄棵,位于F島的核電站汹胃,受9級特大地震影響砰逻,放射性物質(zhì)發(fā)生泄漏畜眨。R本人自食惡果不足惜昼牛,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望康聂。 院中可真熱鬧,春花似錦胞四、人聲如沸恬汁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氓侧。三九已至脊另,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間约巷,已是汗流浹背偎痛。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留独郎,地道東北人踩麦。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像氓癌,于是被迫代替她去往敵國和親谓谦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355