廣州知名網(wǎng)站建設(shè)性價(jià)比高競價(jià)推廣是做什么的
參考:
凹凸貼圖、法線貼圖、置換貼圖-CSDN博客
視差貼圖 - LearnOpenGL CN
1,Learn about Parallax(視差貼圖) - 知乎
“視差貼圖”的工作流程及原理(OpenGL) - 嗶哩嗶哩
法線與置換貼圖原理講解以及烘焙制作! - 知乎
1. Bump Mapping 凹凸貼圖
BumpMap是一種灰度圖,用表面上灰度的變化來描述目標(biāo)表面的凹凸,因此這種貼圖是黑白的,也可以把貼圖的Alpha通道用作Bump。值得注意的是,這種貼圖表面上存儲的東西是高度域--即每個點(diǎn)和原始表面的高度差,而不是色彩,是高度,一個數(shù)值!因此,對這個貼圖做任何的操作都會影響到這個物體 3d的外觀質(zhì)感。不能憑感覺用事。
在游戲中所使用的算法叫做fake bump mapping,假凹凸貼圖。因?yàn)樵谟螒蛑蠦umpMap并沒有改變物體的表面,而只是影響光照的結(jié)果,欺騙眼睛而已。
最簡單的做法是,直接把BumpMap疊加在已經(jīng)渲染好的表面上,造成亮度上的擾動,從而讓人以為是凹凸的--這個很容易理解,把一面白色的墻面有技巧的部分劃成灰色就會變成蝕痕,這些諸位會比小的更擅長。而計(jì)算復(fù)雜度是基本加減法。這個所謂的FakeBumpMapping 從Geforce2就開始硬件支持,但是從來沒有大范圍的應(yīng)用過。
不過有趣的是,BumpMap這個東西卻從未過時,在后來的渲染算法中,其儲存表面高度域的特性仍然發(fā)揮著巨大的作用。
2. Normal Mapping 法線貼圖
NormalMapping是一種凹凸貼圖技術(shù),也叫做Dot3bump mapping。
用于實(shí)現(xiàn)它的控制紋理是一張叫做Normal Map的紋理,這張圖中存儲的東西是每個原始表面法線的迭代。舉例在3D模型上,表面法線就像是一根站立于桌面的鋼筆,垂直向上。而NormalMap中存儲的東西就是我們這支表示表面法線方向的鋼筆所“應(yīng)該”指向的方向--比如說朝左邊傾斜15度。
NormalMap有兩種主要形式,一種叫做模型空間的NormalMap,一種叫做切線空間的NormalMap。第一種在游戲中沒有實(shí)用價(jià)值,我們說第二種,也就是大家最常見的一種。
模型空間下的法線紋理看起來是“五顏六色”的。這是因?yàn)樗蟹ň€所在的坐標(biāo)空間是同一個坐標(biāo)空間,即模型空間,而每個點(diǎn)存儲的法線方向是各異的。
而切線空間下的法線紋理看起來幾乎全部是淺藍(lán)色的。 這是因?yàn)?#xff0c;每個法線方向所在的坐標(biāo)空間是不一樣的,即是表面每點(diǎn)各自的切線空間。這種法線紋理其實(shí)就是存儲了每個點(diǎn)在各自的切線空間中的法線擾動方向。也就是說,如果一個點(diǎn)的法線 方向不變,那么在它的切線空間中,新的法線方向就是z軸方向,即值為(0,0, 1), 經(jīng)過映射后存 儲在紋理中就對應(yīng)了RGB(0.5,0.5, 1)淺藍(lán)色。而這個顏色就是法線紋理中大片的藍(lán)色。這些藍(lán)色 實(shí)際上說明頂點(diǎn)的大部分法線是和模型本身法線一樣的,不需要改變。
切線空間法線優(yōu)點(diǎn):
- 自由度很高,模型空間下的法線紋理記錄的是絕對法線信息,僅可用千創(chuàng)建它時的那個模型, 而應(yīng)用到其他模型上效果就完全錯誤了。而切線空間下的法線紋理記錄的是相對法線信息,把該紋理應(yīng)用到一個完全不同的網(wǎng)格上,也可以得到一個合理的結(jié)果。
- 可進(jìn)行UV動畫
- 可以重用法線紋理
- 可壓縮??梢詢H存儲 XY方向,而推導(dǎo)得到Z方向。
法線貼圖是凸凹貼圖(Bump mapping)的一種常見應(yīng)用,簡單說就是在不增加模型多邊形數(shù)量的前提下,通過渲染暗部和亮部的不同顏色深度,來為原來的貼圖和模型增加視覺細(xì)節(jié)和真實(shí)效果。簡單原理是在普通的貼圖的基礎(chǔ)上,再另外提供一張對應(yīng)原來貼圖的,可以表示渲染濃淡的貼圖。通過將這張附加的表示表面凸凹的貼圖的因素于實(shí)際的原貼圖進(jìn)行運(yùn)算后,可以得到新的細(xì)節(jié)更加豐富富有立體感的渲染效果。
關(guān)于法向貼圖的更多信息,可以參考
http://en.wikipedia.org/wiki/Normal_mapping
NormalMap最大的缺點(diǎn)是它的視角問題。因?yàn)镹ormalMap只是改變的表面上的光照結(jié)果,并沒有改變表面上的形狀,不能實(shí)現(xiàn)自身內(nèi)部的遮擋,因此不能表現(xiàn)平面上凹凸起伏比較大的場合。比如說我們一個桌面上突出一塊,然后在突出的這塊東西邊上放一支牙簽。根據(jù)經(jīng)驗(yàn),這個凸起會很輕易的擋住我們的視線,讓我們看不見那支牙簽??墒荖ormalMap卻不會這么做,因此我們一直能看見障礙物背后的東西。
這樣一來,NormalMap只能用在大家對遮擋關(guān)系不敏感的場合,比如場景等,不是不能用于人物,而是用NormalMap的人物不太經(jīng)得起特寫,放大了,角度刁鉆了都容易穿幫。
P.S.關(guān)于NormalMap的一點(diǎn)秘籍。注意理解……NormalMap其實(shí)并不是從低模的表面凸出高模的細(xì)節(jié)的,而是把高模中比最高點(diǎn)的位置低的地方凹進(jìn)去的!因此低模要比高模大一點(diǎn)點(diǎn)才會很準(zhǔn)。大家可以想像成我們是用一個比高模稍微大一點(diǎn)點(diǎn)尺寸的低模石膏模型來把高模雕刻出來的。
3. Parallax mapping 視差貼圖
視差貼圖是一種Normal Mapping算法的增強(qiáng)算法,其本質(zhì)上和Normal Mapping沒有區(qū)別。優(yōu)勢是只需要增加3個HLSL語句和一個控制紋理通道(只需要幾個GPU指令,代價(jià)小到可以忽略)就可以顯著的增加物體表面的深度感。但是NormalMap中出現(xiàn)的問題,Parallax mapping基本上都有--特別是視角接近平行的時候,凹凸感消失的問題,并沒有明顯改善?;蛘逷arallax mapping才是真正具有實(shí)用價(jià)值的Normal Mapping。
Parallax mapping使用的還是單張的控制紋理,也就是一張切線空間的NormalMap,但是Alpha通道里存儲的是對應(yīng)這張NormalMap的BumpMap。
視差貼圖屬于位移貼圖(Displacement Mapping)技術(shù)的一種,它對根據(jù)儲存在紋理中的幾何信息對頂點(diǎn)進(jìn)行位移或偏移。一種實(shí)現(xiàn)的方式是比如有1000個頂點(diǎn),根據(jù)紋理中的數(shù)據(jù)對平面特定區(qū)域的頂點(diǎn)的高度進(jìn)行位移。這樣的每個紋理像素包含了高度值紋理叫做高度貼圖。一張簡單的磚塊表面的高度貼圖如下所示:
整個平面上的每個頂點(diǎn)都根據(jù)從高度貼圖采樣出來的高度值進(jìn)行位移,根據(jù)材質(zhì)的幾何屬性平坦的平面變換成凹凸不平的表面。例如一個平坦的平面利用上面的高度貼圖進(jìn)行置換能得到以下結(jié)果:
置換頂點(diǎn)有一個問題就是平面必須由很多頂點(diǎn)組成才能獲得具有真實(shí)感的效果,否則看起來效果并不會很好。一個平坦的表面上有1000個頂點(diǎn)計(jì)算量太大了。我們能否不用這么多的頂點(diǎn)就能取得相似的效果呢?事實(shí)上,上面的表面就是用6個頂點(diǎn)渲染出來的(兩個三角形)。上面的那個表面使用視差貼圖技術(shù)渲染,位移貼圖技術(shù)不需要額外的頂點(diǎn)數(shù)據(jù)來表達(dá)深度,它像法線貼圖一樣采用一種聰明的手段欺騙用戶的眼睛。
視差貼圖技術(shù)的主要任務(wù)是通過移動UV修改貼圖來讓平面看著像3D。這個效果會在片段著色器中顯示的所有像素進(jìn)行計(jì)算。
如下圖,Level0代表沒有坑洞,Level1代表最深的孔。模型實(shí)際上沒有變而且一直在Level0處,曲線代表的是儲存在高度圖中的值。當(dāng)下的像素坐落在黃色方形處,這個像素對應(yīng)的UV是T0。V是從攝像機(jī)到該像素的向量。
- 如果按照T0采樣高度圖的話能得到值
H(T0) = 0.55
,值不等于0,所以該像素并不在表面,在像素之下有坑,所以你必須延申V到由高度圖定義曲面的交點(diǎn)T1。 - 這個交點(diǎn)正在深度為H(T1),然后用T1去采樣diffuseMap和normalMap,得到
H(T1)=0.15
。
因此所有視差算法的目標(biāo)都是去計(jì)算攝像機(jī)向量V和高度圖所定義表面的交點(diǎn)。
根據(jù)這張圖可以大概知道攝像機(jī)相對片元的面上的位移越大(切線空間下的x,y軸),UV的偏移值就越大。由三角形的等比例可知
viewDir.xy / viewDir.z = texcoordOffset / height
其中height為視差貼圖中采樣得出的值,texcoordOffset為表面的偏移。因此
texcoordOffset = viewDir.xy / viewDir.z * height
再加一個可控的高度系數(shù)heightScale
texcoordOffset = viewDir.xy / viewDir.z * height * heightScale
現(xiàn)在這樣的表達(dá)式可以說是比較完善了,即:
texcoord = Texcoord - texcoordOffset
(Texcoord為VAO中自帶的UV值)
但是對于技術(shù)研究者來說,這樣的表現(xiàn)顯然還是不夠令人滿意的。因此,順著視差貼圖的思路向下發(fā)展,借助ShaderModel3.0的出現(xiàn)。出現(xiàn)了一個真正從物理上改變物體表面的算法,這就是Displacement Mapping。
4. Displacement mapping 位移貼圖(置換貼圖)
和前面說的幾種方式不同,Displacement Mapping是一種真正改變物體表面的方式。
通過一種稱為micro polygons(微多邊形)tessellate(鑲嵌)的技巧來實(shí)現(xiàn)真正的改變物體表面的細(xì)節(jié)。具體流程是這樣的。
- 首先,根據(jù)屏幕的分辨率,在模型的可見面上鑲嵌和最終象素尺寸相同的微多邊形。這個過程叫做鑲嵌。
- 然后讀取一張Bump貼圖。根據(jù)表面的灰度確定高度。
- 然后根據(jù)鑲嵌所得到的多邊形,沿著原先的表面法線方向移動微多邊形。
- 接著再為新的多邊形確定好新的法線方向。此時,物體的表面確實(shí)已經(jīng)真的增加出了細(xì)節(jié)。
其實(shí)這種技巧,我們在使用ZBrush的時候就可以看見了。大家用過Zbrush的時候會知道,在表面刷過的細(xì)節(jié),只有在畫面靜止下來之后才會越來越清晰。而微多邊形鑲嵌起到的就是類似的作用。只增強(qiáng)面對屏幕的多邊形的表面粗糙細(xì)節(jié),而不是整個模型。因此性能代價(jià)并不會像直接上高模那么大。
相比來說位移貼圖在效果上是沒有任何瑕疵的,但是也未必沒有缺點(diǎn)。首先就是,對硬件的要求很高,同時鑲嵌對于性能的消耗也不小。它可以用來實(shí)時生成大面積的戶外地形!這是其他任何凹凸貼圖方式所不能比擬的!
三種利用切空間光線追蹤先進(jìn)算法的技術(shù),三種方法分別是光線跟蹤,光束跟蹤和圓錐跟蹤算法。當(dāng)然可以說后面的都是第一種的改進(jìn)。這些都是面向未來的技術(shù),很有前途。ReliefMapping甚至現(xiàn)在可以實(shí)現(xiàn)扣環(huán)這樣的復(fù)雜幾何表面,并且可以處理不能平視的問題!