做淘寶客網(wǎng)站教程短網(wǎng)址生成網(wǎng)站
一、Bump Mapping 介紹
- 我們想要在屏幕上繪制物體的細節(jié),從尺度上講,一個物體的細節(jié)分為:宏觀、中觀、微觀
- 宏觀尺度中其特征會覆蓋多個像素,中觀尺度只覆蓋幾個像素,微觀尺度的特征就會小于一個像素
- 宏觀尺度是由頂點或三角形或其他幾何圖元來表示,我們創(chuàng)建三維角色是,其四肢頭部等通常在宏觀尺度下建模
- 微觀尺度工作在著色模型中,著色模型通常在像素著色模型里實現(xiàn),并使用紋理貼圖作為參數(shù),著色模型模擬了物體表面微觀幾何形狀的相互作用,如:有光澤的物體在微觀尺度下是光滑的,而漫反射的物體在微觀尺度下是粗糙的,角色的皮膚或衣服看起來材質不同,因為他們使用了不同的著色模型或著色模型參數(shù)不同
- 而中觀尺度則表述了宏觀與微觀之間的特征,它包含的細節(jié)比較復雜,無法用單個三角形來渲染,但這些細節(jié)又足夠大,讓觀察者能看出幾個像素以上的表面曲率變化,比如人臉上的皺紋,肌肉組織的細節(jié),衣服的褶皺或者磚頭之間的縫隙等等,這些都屬于中觀尺度的特征
- 凹凸映射就是模擬中觀尺度的常用方法之一,它能夠讓觀察者觀察到比幾何模型的尺度更小的細節(jié),其基本思想在紋理中把尺度細節(jié)相關信息給編碼進去,在著色過程中用稍微受到干擾的表面代替真實表面,就得讓表面具有小尺度的細節(jié)
1.關于Bump Mapping
- 凹凸貼圖映射技術是對物體表面貼圖進行變化然后再進行光照計算的一種技術。
- 例如給法線分量添加噪音,或者在一個保存擾動值的紋理圖中進行查找。
- 這是一種提升物體真實感的有效方法,但卻不需要額外的提升物體的幾何復雜度。
- 這種方式在提升物體的表面細節(jié)或者表面的不規(guī)則性方面有顯著效果。
2.Bump Mapping分類
- Bump Mapping的種類主要有:法線映射、視差映射、浮雕映射。這幾種方法或者貼圖。
- 都是廣泛的被使用,來增加模型的細節(jié)效果,或者用來做特殊的畫面表現(xiàn)效果。
- 最常用的是法線映射,一般的增加法線貼圖后,會對局部的物體表面進行法線擾動,進而改變明暗關系,從而達到增加表面細節(jié)的效果。
- 其中三種映射中都用到的法線貼圖也是本次介紹的重點內容。
二、Normal Mapping 法線映射
1.關于Normal Mapping
- Normal Map 是一張存有物體局部表面法線信息的一張貼圖。
- 在計算光照的時候,程序會去讀取法線圖,并獲取到當前像素點的法線信息,結合光線信息進行光照計算。
- 使用法線貼圖計算光照,可以讓物體表現(xiàn)出更加豐富的細節(jié),并隨著光照方向的變換實時變化。這是普通紋理貼圖不能表現(xiàn)出的。
- 法線貼圖一般由高模映射到對應的底模上來生成。但像金屬,木頭等這些細節(jié)豐富的物體,可借助程序化的軟件如:Photo Shop,Substance Designer等生成對應法線貼圖。
2.法線映射的實現(xiàn)
切線空間
- 法線的存儲,一般會放到模型的切線空間中。
- 切線空間是以物體表面的切線,副切線和法線組成的幾何空間(如下圖)。
- 當我們計算光照時,需要把光照運算的向量放到統(tǒng)一坐標系下。讀取切線空間法線,需要世界坐標轉切線空間的轉換矩陣 或 切線空間轉世界空間的轉換矩陣,將向量統(tǒng)一到同一坐標系后再進行光照操作。
世界和切線空間轉換
- 將世界坐標系下的頂點法線(Normal)和切線(Tangent)以及副切線(Bitangent)作為切線空間坐標系的正交基。并用這三個向量的標準正交基來構建轉換矩陣。
- 對應關系為法線作為Z軸,切線作為X軸,副切線作為Y軸。
- 構建一個3*3的矩陣來做空間向量的坐標系轉換。一般的叫該矩陣為TBN矩陣。
- 其逆矩陣就是從切線空間到世界空間的轉換矩陣記TBN-1,因為TBN為正交陣,所以其逆矩陣為TBN的轉置矩陣。
- 矩陣構建完成后,接下來就是光照計算部分。
法線存在各個空間里都可以,但關鍵不只是存在哪里,還有后續(xù)的光照計算
切線空間的優(yōu)點:
- 自由度高。模型空間下是絕對法線信息(僅可以用在創(chuàng)建它時的那個模型),而切線空間下的是相對法線信息,是對當前物體法線的擾動。(可以復用)
- 可進行uv動畫。比如:移動uv坐標來實現(xiàn)凹凸移動效果
- 可以重用法線紋理。比如:一個立方體,6個面可以用一張法線貼圖
- 可壓縮。由于切線空間下貼圖中法線的Z方向總是正方向(模型空間下可以是負的),那么我們只存XY(切線和副切線)就能推出Z(法線)了,可以少存一個。
Unity中法線貼圖的壓縮格式
- 在unity中,非移動平臺上,Unity會把法線貼圖轉換成DXRT5nm格式。
- 這種格式只有兩個有效通道GA通道,這樣可以節(jié)省空間,而移動平臺Unity使用傳統(tǒng)的RGB通道
- 在DXRT5nm格式中,GA存儲對應法線的x、y分量,z分量需要通過一個簡單的運算求得。、
三、Parallax Mapping 視差映射
1.關于Parallax Mapping
法線映射雖然能展示較為逼真的模型表面細節(jié),但畢竟法線映射只能改變法線進而改變光照,并不能讓模型表面產(chǎn)生令人信服的遮擋效果。所有我們引入視差映射
Parallax Mapping中文為視差映射,是一種類似于法線映射的技術,但原理不同,類似法線貼圖,它是用以提供模型表面細節(jié)并賦予其遮擋關系的技術,并可以和法線貼圖一起使用提供令人信服的逼真效果
- 視差映射同樣引進一張新的貼圖,高度圖,高度圖一般是作為頂點位移來使用的,但模型要包含大量三角形才能獲得不錯的效果,否則看起來會成塊狀。
- 所有如何在有限的三角面上表示逼真的令人信服的效果?這就是視差映射技術,視差映射的核心是改變紋理坐標,但是如何改變,怎么改變?
- 這時就需要一張存儲模型信息的高度圖,利用模型表面高度信息來對紋理進行偏移
2.視差映射的實現(xiàn)
- 視差映射主要是要讓平面看起來立體,和法線貼圖一樣是欺騙眼睛的做法。
- 我們的模型在切線空間下,所有的點都位于切線和副切線組成的平面內(圖中0.0點),但實際上物體要有更豐富的細節(jié)。
- 例如圖中的情況:如果不使用視差貼圖,要計算當前視角下,片元A點(黃色)的信息,就是圖中的Ha,實際使用視差貼圖時,真實的情況應該是視線和A點延長線和物體的交點,也就是B點,相應的就是Hb
視差映射的具體算法:如何在知道A的uv值的情況下,算出B的uv值。
知道AB兩者的偏移量即可
偏移量的獲得:用近似的方法去求解
- 首先拿A的高度信息進行采樣,得到物體表面距離水平面(0.0)的深度值Ha。
- 用深度值Ha和視線的三角關系算出物體上等比的偏移方向,算出近似的B點(可以看到圖中近似點B和實際點B還是有挺大差距的,所以模擬度比較低)
- 得到偏移之后B點的uv,再去對法線貼圖進行采樣、計算時,就不會采樣A點了,而是B點
- 理解:視差貼圖是如何產(chǎn)生遮擋效果的
- 當視線看到的是A點這樣深度嗎 比較大的,那么視差貼圖計算出的偏移值也是非常大的,這樣A點最終被渲染出來的機會就比較小(偏移后就被采樣到其他點上了)
- 當視線看到B點這樣深度比較小的點,計算出來的偏移就比較下,甚至原來點的附近,所以被采樣的機會就比較大
- 深度大的點很容易被深度小的點覆蓋掉,這樣就會表現(xiàn)出遮擋的效果
3.陡視差映射 Steep Parallax Mapping
- 也是近似解,但比視差映射精確
基本思想:
- 將物體表面分為若干層,從最頂端開始采樣,每次沿著視角方向偏移一定的值
- 如果當前采樣的層數(shù),大于實際采樣的層數(shù),就停止采樣。
例如圖中D點,采樣到0.75層,實際是0.5層,就停止采樣,返回偏移坐標
陡視差映射的算法:(計算偏移點的過程)
- 首先對A點采樣,得到深度大約為0.8的位置,而其對應視線深度為0.0,不符合我們的基本思想,繼續(xù)采樣
- 采樣B點,深度為1,視線深度為0.25,不符合,繼續(xù)采樣
- 采樣C點,深度大約為0.8,視線深度為0.5,不符合,繼續(xù)采樣
- 采樣D點,采樣深度為0.5,視線深度約為0.75,符合上述的條件,認為是比較合理的一個偏移點,就返回結果(return)。
陡視差的問題:
- 在于分層機制,如果分層多,性能開銷就會大;分層小,渲染鋸齒就比較明顯。
- 一種做法:可以根據(jù)視角v和法線n的角度限定采樣層數(shù)
- 鋸齒問題會在浮雕貼圖上做改善
四、Relief Mapping 浮雕映射
1.關于Relief Mapping
- 可以更精確的計算uv偏移量(視差如果偏移量大的話就會失真)、提供更多的深度、還可以做自陰影以及閉塞效果
- 例如下圖:可以看到浮雕的凹凸深度明顯更大,且凹凸有自陰影效果
2.浮雕映射的實現(xiàn)
浮雕映射一般用射線步進和二分查找來決定uv偏移量
- 第一步:射線步進部分,和視差貼圖一樣
- 后邊:二分查找部分:通過射線步進找到合適的步進后,在此步進內使用二分查找來找到精確的偏移值
為什么不直接使用二分查找?
- 會產(chǎn)生比較大的誤差
- 下圖為例
- 如果直接使用二分查找,在深度0和1的中間的1點,進一步為2點 -> 3點 ->Q點。但我們要的結果是P點,可以看到結果很明顯是錯誤的
3.視差閉塞貼圖(POM = Parallax Occlusion Mapping)
- 相對于浮雕貼圖,不同之處在于最后一步
- 浮雕貼圖是在確認最后步進之后進行二分查找(在迭代次數(shù)比較多的情況下,還是挺耗的)
- 視差閉塞貼圖是在最后步進的兩端uv值進行采樣(下圖紅色箭頭),采樣之后再對這兩個結果進行插值,插值的結果作為P點最終的偏移值
優(yōu)點:
- 相對于浮雕映射,性能更好(最后只做插值,而浮雕要做二分查找)
- 相對于陡視差貼圖,精確性更好
要求:
- 因為最后要做插值,所以要求表面是相對比較平滑/連續(xù)的,如果有莫名的凸起結果可能會出錯
五、作業(yè)
結合先行版基礎光照介紹(一)將本次課程中所講的案例結合進先前的光照效果中