作業(yè)一筆記2:對大佬的模仿和總結(jié)
看大佬們的作業(yè),真是太卷了,不過也學(xué)習(xí)到了很多,于是自己嘗試模仿大佬作業(yè)并自己做一些嘗試。

首先是這個有點偏水晶材質(zhì)的模仿,第一步是半蘭伯特光照的映射,這里注意的一點就是映射圖的繪制。首先它的亮部是暗的而暗部是亮的,同時最右邊的高光處又要亮一點。

然后是兩個小高光點的制作,首先把光照方向加上一個vector4進行偏移,然后歸一化防止出問題,然后再點乘法向,然后用step把想要的高光范圍截出來,最后用max混合在一起后使用clamp鉗制,因為點乘的時候出現(xiàn)負數(shù)了。


然后以這個作為alpha值,lerp一個高光顏色和上面的半蘭伯特光照映射。

然后接下來制作菲涅爾效果。(現(xiàn)在看來我當初自制描邊的步驟有很多可以優(yōu)化的地方,比如這里有菲涅爾,比如if函數(shù)和step函數(shù)可以直接截取等等)菲涅爾節(jié)點乘以顏色就可以改變菲涅爾描邊的顏色。

最后把上面兩個成果混合,這個混合節(jié)點我還不太懂他的原理。

最終成品

下面是第二個紋理材質(zhì)的模仿。首先我測試了下屏幕坐標節(jié)點的使用,感受了一下不乘深度和乘了深度的區(qū)別。
我靠,看了下別的大佬的筆記,感覺人家好屌,我這筆記真膚淺。不過還是記錄下吧。

首先是直接連屏幕位置到紋理上去,這時候會把整個屏幕分為一個-1到1的范圍。這也是為什么會出現(xiàn)四個圖。(雖然看起來像兩個,那是因為上下連起來了)(不過screen uvs模式則只有一個圖)


Depth節(jié)點,輸出該點到攝像機的距離,越遠則值越大(而且通常都很大,只有挨得很近才會小于1),將Depth和屏幕位置相乘,就會有紋理大小會隨著縮放改變的感覺(不懂怎么形容,自己去試就懂了),經(jīng)大佬解釋,原理應(yīng)該是這樣的,比如最基礎(chǔ)的坐標是-1到1的范圍,而乘以depth后,離得遠的時候,depth變大,-1到1會變成-10到10,顯示圖片從4張變成400張,而離得近則相反,這樣子,采樣的貼圖就會近大遠小了。

到這里的下一步本來要用上step節(jié)點,但我在那上面那個黃色漸變圖測試的時候發(fā)現(xiàn)一個問題。

把它和蘭伯特光照step后的結(jié)果竟然是這樣,中間有藍色出現(xiàn)。首先白色和黑色的地方可以理解,因為從貼圖采樣的數(shù)值只在0到1之間,而蘭伯特的范圍是-1到1,所以會出現(xiàn)黑和白的地方。但中間的藍色是怎么來的呢?我搜了一下,看到了一個大佬對step節(jié)點的解釋后才恍然大悟。
這里不多解釋了,直接放鏈接:https://zhuanlan.zhihu.com/p/342055482
然后通過這個理解,我來嘗試解釋下為什么會出現(xiàn)上面的結(jié)果。
首先A是刀口,B是待切割的蘭伯特光照。


以R通道為刀口,如果我給的貼圖是純色,那么R通道也是一個單一數(shù)值(0-1之間的),而我這里給的貼圖是紋理,因此他的R通道也是紋理,那么,紋理怎么做刀口呢,其實也是簡單的比大小問題,把兩個圖重疊,B上比A顏色深(數(shù)值小)的部分,全部為黑,比A顏色淺(數(shù)值大)的部分,全部為白。

同理切割其他三個通道,再組合起來,即可獲得結(jié)果。

然后接下來是導(dǎo)入條紋紋理圖片,我自己在ps做了一個,但是導(dǎo)入后出現(xiàn)了個問題,條紋不重復(fù)了。研究了一下才搞懂,紋理圖片的Wrap Mode要設(shè)置成repeat(之前導(dǎo)入映射圖片都習(xí)慣改成clamp了)。

然而在解決好紋理后又出現(xiàn)一個問題,我step出來的材質(zhì)是這樣的,逆光半球一片黑,而面光半球則還是規(guī)則的黑白條紋,根本看不出高光。

我研究了半天,才弄明白怎么回事,首先還是用上面的刀片和被切割物體來解釋,step就是把被切割物體分為比刀片亮(值大)的部分(全白)和比刀片暗(值?。┑牟糠郑ㄈ冢τ诒磺懈钗矬w來說,逆光的半球小于0,都比刀片暗(刀片的值是黑色條紋為0,白色條紋為1)。所以逆光的被切割物體全黑,這是沒問題的。而到了面光半球,對于黑色條紋刀片來說,被切割物體的范圍是0到1,都比他亮,所以切割后黑色條紋部位變?nèi)祝粚τ诎咨珬l紋刀片來說,被切割物體都比他暗,所以切割后白色條紋部位變?nèi)凇?/p>
最后,我換了黑白直接有漸變的紋理,終于達到了我要的效果。


然后以此為alpha,lerp明暗顏色,然后之前的光照模型再利用,乘以一個顏色后加到lerp的結(jié)果后面。然后再加描邊。

接下來是第三個材質(zhì),首先要了解這個frac節(jié)點。他說是取小數(shù)的節(jié)點。以屏幕坐標的u為例,直接輸出u的時候,左邊是小于0的全黑,右邊是0到1的漸變(可看上面屏幕坐標的解釋)。

而加入frac節(jié)點后,左邊-1到0的顏色也變成0到1的顏色了(我印象中其實在ue里面用過這個節(jié)點,不過忘了是什么時候了,好像是之前學(xué)過一個多重顏色的后處理霧效不過我沒做筆記),其實我感覺這不算是真正意義上的取小數(shù),-0.9你取小數(shù)怎么是0.1呢,不過大致懂這個意思就行了,就是讓0到1不斷重復(fù)。

然后把屏幕位置乘以一個值后再frac,就會有下面的結(jié)果。因為原本是-1到1,四個格子,然后乘以10變成-10到10,但看上去還是四個格子,因為uv軸都是負為黑正為白,但加上frac節(jié)點后,就會以1為單位劃分格子了。

然后接下來使用一個remap映射節(jié)點在上面的每個格子中,橫軸縱軸取值都是0到1,而remap節(jié)點可以把這0到1的映射改到其他范圍,這里改成-0.5到0.5,也就是變成每個格子是以原點為中心uv軸范圍都是-0.5到0.5。

然后再通過一個length節(jié)點,生成一個程序化點陣。length節(jié)點的作用是獲取向量的模長,上面那個圖中,中心為(0,0)模長就是0,所以是黑色,其他點以此類推。

這時候看另外一邊,這一部分是熟悉的蘭伯特光照,但乘了一個投影節(jié)點,可以讓材質(zhì)接受自身和其他物體的投影。

然后接下來這一步就很重要,它把1到0remap成-0.5到2。這是為什么呢?

首先了解下power節(jié)點,其實就是求val的exp次冪。val是上面我們求的屏幕空間點陣,我們現(xiàn)在想把他變成亮處的點變小,暗處的點變大。這些點陣的值的范圍是0到1,小數(shù)求冪有幾種結(jié)果:負數(shù)冪時,結(jié)果肯定大于1,都為白;小數(shù)冪時,結(jié)果會變大,冪越小值越大但始終小于1大于它自身;大于1的冪時,冪越大,值越小,且范圍是0到它自身。得到這個規(guī)律后,我們想看,點變小,也就是黑色范圍變小,也就是值變大,如果從亮部過渡到暗部我們給她power一個0到1的漸變,是不是就符合要求了。


但這個還不夠徹底,我們想要亮部死白和暗部死黑,所以需要負數(shù)和大于1的部分,這就是為什么上面吧1到0remap成-0.5到2的原因。

然后再通過round節(jié)點,進行四舍五入,保留非黑即白,則可得到結(jié)果。


至于個人嘗試。。。。好吧,暫時沒靈感。