08
自己連了一個(gè)卡得不是很通的oldschool+的卡通材質(zhì)。并且還手寫了一遍,一些不懂的地方就是參考的連連看的代碼,然后有些自己踩的坑我也標(biāo)注出來了


然后作業(yè)我就不細(xì)看了,我想著先主要學(xué)新知識(shí)把。
時(shí)隔多天繼續(xù)學(xué),我想著第一步先把我的項(xiàng)目管理給搞好,之前雖然說每次新建一個(gè)shader都要重命名路徑,但最終為了方便,命名和路徑還是亂七八糟了(至少個(gè)人感覺是這樣的)。之前會(huì)搞得很亂主要還是因?yàn)闆]理清楚shader的路徑原理。Shader自身開頭的那個(gè)路徑,不代表文件路徑,而是在shader列表里面的路徑(個(gè)人目前理解)。因此在管理文件的時(shí)候,除了shader文件的路徑要管好,shader列表里的路徑也要管好(而且這邊要更有條理)。
然后莊懂講到了法線貼圖的使用。雖然之前也用過挺多法線貼圖,也能明白它的作用,但是其實(shí)還挺淺顯,也就是知道使用后能把復(fù)雜的凹凸信息給加到平面上。這次借著這個(gè)機(jī)會(huì),我正好深入點(diǎn)學(xué)習(xí)法線貼圖。(不過目前也只是初步地深入學(xué)習(xí),后續(xù)還會(huì)繼續(xù)往更深的地方了解)
首先,我們需要明確一個(gè)觀點(diǎn),物體本身已經(jīng)有了自己的法線,法線紋理貼圖只是偽造一個(gè)虛假的法線信息,使模型在計(jì)算光照時(shí)用上這些虛假的法線信息。
那么我們先從物體本身的法線信息入手。首先對(duì)于一個(gè)面來說,它的法線很好確定,兩條邊的叉乘即可。但是如果只有面的法線,在計(jì)算光照的時(shí)候,每個(gè)面之間就會(huì)有明顯的邊緣,因此,我們需要進(jìn)行平滑法線操作。即計(jì)算每個(gè)頂點(diǎn)的法線,然后對(duì)于面內(nèi)的點(diǎn),根據(jù)它與三個(gè)頂點(diǎn)的距離來進(jìn)行權(quán)重計(jì)算以此確定這個(gè)一個(gè)點(diǎn)的虛假法線(真實(shí)法線永遠(yuǎn)都是它所在面的法線的)。(頂點(diǎn)法線的計(jì)算方式也是一個(gè)坑,通常來說,對(duì)于一個(gè)頂點(diǎn)被三個(gè)面共享的情況,常見的做法是將該頂點(diǎn)的法線計(jì)算為這三個(gè)面的法向量之和,并對(duì)結(jié)果進(jìn)行歸一化。但復(fù)雜情況下,還要考慮面積權(quán)重等等。)

現(xiàn)在的模型基本都會(huì)自帶面和頂點(diǎn)法線信息,而即使沒有法線信息,unity也可以通過特定算法生成,原理很簡(jiǎn)單,這里不贅述。但總之,我們了解物體的法線的概念。
法線貼圖有兩種一種是模型空間下的法線貼圖,一種是切線空間下的法線貼圖,這兩種有什么區(qū)別呢?首先我要再重復(fù)一遍,法線紋理貼圖只是偽造一個(gè)虛假的法線信息,使模型在計(jì)算光照時(shí)用上這些虛假的法線信息。

然后說模型空間的法線貼圖。(寫到這突然發(fā)現(xiàn)我快想把這玩意寫成科普而不是筆記了,算了那種基礎(chǔ)的東西不寫了,比如顏色是啥意思)每個(gè)三維模型都有其自己的本地坐標(biāo)系,該坐標(biāo)系相對(duì)于模型自身而言是固定的。模型空間的原點(diǎn)通常位于模型的幾何中心或基準(zhǔn)點(diǎn)上。模型空間中的坐標(biāo)軸定義了模型的方向和尺度。而這個(gè)貼圖就是對(duì)它各個(gè)點(diǎn)(不是模型的點(diǎn),就是指它的表面微分到的最小單位)直接指定了新的法線方向,所以會(huì)有各種顏色(因?yàn)榉ň€朝向各個(gè)方向)
然后是切線空間中法線紋理,首先說說切線空間(Tangent Space),研究了半天,但還是有些模糊的地方。我就不說我認(rèn)知進(jìn)階的過程了,直接說我現(xiàn)在的認(rèn)知結(jié)果。對(duì)于一個(gè)模型來說,它表面的切向是由紋理映射的u坐標(biāo)決定的。即切向就是u軸方向。但是有以下幾點(diǎn),1:副切向(在切平面且垂直切向的),不是v軸方向,且v軸方向也不垂直u軸方向。2:這個(gè)切向不是切線空間中的切向。那么,切線空間的三個(gè)坐標(biāo)軸要怎么取得?,首先,我們目前拿到一個(gè)點(diǎn)(不管是頂點(diǎn)還是面上的),確定了它的法線和它的切向(u軸方向)。那么t軸和b軸就可由下面公式求得其實(shí)很好理解,切向不一定和法線正交,所以要正交化,然后正交化后獲得了t軸和n軸,那么b軸之間叉乘即可。

我現(xiàn)在的疑問就是,對(duì)于一個(gè)由幾個(gè)面共享的頂點(diǎn),如果它到底以哪個(gè)面的u方向?yàn)闇?zhǔn)呢?如果uv是斷開的,又怎么算呢?雖然說切向根本上是以下面這個(gè)公式來計(jì)算,但是也是需要確定好這個(gè)頂點(diǎn)屬于的面。還是說隨便用哪個(gè)面算出來的結(jié)果都是一樣的?不過我現(xiàn)在也不懂怎么驗(yàn)證。不知道以后能不能解決。



總之切線空間了解后,它的法線貼圖就很好理解了,物體默認(rèn)的法線在切線空間下統(tǒng)一為(0,0,1),而切線空間的法線貼圖也是之間指定了新的法線方向。(為什么通常只有淺藍(lán),因?yàn)槟J(rèn)法線就是淺藍(lán)色,改變的話才會(huì)變顏色,但因?yàn)橥ǔ6际莕軸正方向上的,所以都是偏藍(lán)色調(diào)的)
關(guān)于這兩種貼圖的優(yōu)劣和特質(zhì),《入門精要》里寫得挺清楚,不贅述。
回到莊懂這里,切向空間下的法線貼圖的使用,首先用unpacknarmal函數(shù)解碼法線貼圖(主要是解碼,區(qū)間重映射,要uv可能是因?yàn)橐_定法線貼圖的uv坐標(biāo)),然后構(gòu)建TBN矩陣(其實(shí)就是切線空間的基,由Tangent切線、Bitangent副切線、Normal法線的方向構(gòu)成),然后由解碼的切線空間法線乘TBN矩陣,就可以得到世界空間下的法線信息,然后那這個(gè)法線去搞光照模型。(其實(shí)就是基的變換,這里復(fù)習(xí)一下線代知識(shí):假如有兩個(gè)基,a基和b基(矩陣形式),有一個(gè)向量v,如果我想把b基下的向量v(即vb)轉(zhuǎn)換為a基下的向量v(即va)那么va等于(vb)乘(a基下的b基))
手寫注意事項(xiàng):
默認(rèn)是bump

隨時(shí)注意歸一化。
參考資料:
https://zhuanlan.zhihu.com/p/412917695
https://zhuanlan.zhihu.com/p/139593847
https://zhuanlan.zhihu.com/p/412555049
總感覺這筆記有點(diǎn)潦草,以后有啥悔悟再補(bǔ)吧。這次其實(shí)就是初步深入了解法線貼圖。而且其實(shí)還不夠深入。等以后用到的時(shí)候再繼續(xù)深入。