潮濕效果
物體表面是如何變濕的?
- 物體表面吸水使顏色變深
- 潮濕的顏色會變得暗淡且飽和
實作
-
增加飽和度且變暗

潮濕的物體表面的特點
- 當水作用在材質表面,材質表面的specualr會略微變弱且粗糙度會大幅降低
- 對于積水的表面,我們設定它的roughness = 0.07, specualr = 0.3,一個value = https://www.cnblogs.com/chenglixue/archive/2023/05/16/1用于控制潮濕程度,最后進行lerp即可
實作
-
潮濕程度為1的效果

-
潮濕程度為0的效果

-
加入多孔性
多孔性也就是吸水性,多孔性越高,顏色越暗

表面水珠(Rain Drop)效果
本節展示如何實作雨滴效果
雨滴紋理
為了實作表面水珠,我們需要一個雨滴紋理,它的RG通道表示雨滴法線;B通道表示時間偏移mask(使得雨滴在不同時間出現);alpha通道表示靜止和動態的雨滴
-
雨滴法線

-
時間偏移

-
動靜雨滴
黑點表示靜止的雨滴,白色表示動態雨滴

實作
處理normal
因為在紋理圖中normal的范圍為[0,1],而歸一化normal范圍為[-1,1],因此我們需要進行一個轉化

處理時間偏移
這里重點在于Frac(),因為G通道值大多各不相同,這樣減去時間的增量并取小數部分限制在[0,1]即可實作如下的閃爍效果


動態雨滴
只需將時間offset用于A通道即可實作動態雨滴效果
-
無normal
"Multiply" "subtract" 是因為這里想提取time offset的白色雨滴(大雨滴)



-
有Normal


靜態雨滴
-
因為在A通道中,黑色是靜態雨滴,白色是動態雨滴,在處理動態效果時只處理了白色的值,那么在處理靜態效果時進行一個反轉即可
注意,這里使用power()是因為我們只想要得到白色和灰色的效果并不想要灰色,但此時范圍是[-1,1],因此需要控制一下范圍


控制雨滴效果方向
-
在現實中,雨水來自天空,肯定只有上面才有雨滴效果,整個物體都有雨滴效果是不科學的,因此我們需要控制雨滴效果的方向——normal方向


控制水滴的粗糙度
-
目前已知表面偏向0,雨滴偏向1,而我們想要的效果是雨滴光滑表面粗糙,因此可以將之前得到的值進行反轉然后作用域roughness即可


流淌雨滴(Rain Drip)效果
流淌雨滴紋理
和雨滴效果相同,流淌雨滴紋理由法線貼圖(RG)、mask(B)、time offset(A)組成
映射到世界空間
-
為了應對物體從區域空間變化到世界空間的狀況,需要將紋理映射到世界空間,這樣無論物體進行任何矩陣運算,雨滴的流淌總是正確的
-
使用世界空間的位置作為采樣的紋理坐標,只需提取RB
這里的Multiply()是為了正確的比例,乘以的value越小,采樣得到的影像越大;value越大,采樣得到的影像越小
為什么還有負號呢?因為這樣可以對采樣方向取負

-
采樣側面
這里改變正負號是為了讓物體的側面和正面不再相同

-
混合正側面
采樣兩次紋理進行合并是很簡單的,但只采樣一次又該如何實作呢?
在這里采用世界空間的法線作為物體面的判斷基準



制作影片的mask紋理
它的rgb通道都是相同的,a通道沒有使用

實作流淌雨滴
-
將mask紋理映射至世界空間
下圖中,可以將白色部分視為雨滴,基于這個實作影片即可

-
初步雨滴影片


-
控制雨滴速度
雨滴在不同物體上的滑落速度是不一樣的,因此我們還需要讓這些雨滴的速度有所差異


-
雨滴法線


-
將雨滴效果控制在物體側面
3.5用于控制正方向的白色范圍,-1,5用于控制負方向的白色范圍


雨滴漣漪(Rain Ripple)效果
本節將展示如何實作雨滴打到水面產生的波紋效果
紋理
-
影片mask紋理(漸變紋理)
用該紋理可以實作圓從無到有,從小到大,最后漸漸消散

-
法線紋理
該紋理的R通道是影片mask紋理,GB通道是法線資訊


-
多個漣漪紋理
alpha通道包含time offset


波紋效果
-
實作紋理影片都需要Time節點,很容易實作以下內容


-
控制波紋邊緣的銳度(讓波紋邊緣不再是漸變色)


-
初步實作波紋
因為水波紋屬于正弦函式,因此在這里我們使用一個sin,并讓他在一個周期內產生五個波紋(因為UE5的sin函式默認周期為1)


-
標準的sin函式
UE5中的sin函式并不是標準的sin函式(一個周期為2Π),它的默認周期為1,因此我們需要將其改為6.283185

-
放大淡出效果
目前我們實作的效果是到最大然后消失,但我們希望的是放大淡出,目前的效果是因為能量是從0到1,而放大淡出的效果應該是從1到0


法線


多個漣漪
- 為每個漣漪賦予單獨的Time


多個漣漪相互疊加
-
目前的效果只是在固定位置不同時間段產生波紋,但沒有展現波紋的疊加效果
-
首先,我們需要對"1-x"進行修改,添加力的因素
- "Multiply 0.8"是因為需要考慮力的因素,讓漣漪的初始能量不為1
- "Add 0.2"是因為需要考慮雨滴重量不能為0的情況

-
漣漪的疊加
總體思路是使用四個不同的漣漪效果——不同的時間,不同的漣漪強度,對采樣結果進行疊加
-
求取四個不同的時間

-
求取四個不同的uv

-
求取四個不同的雨滴重量

-
normal混合

-
最終效果

水坑(Rain Puddle)效果
紋理
-
扭曲紋理,
對于扭曲紋理,我們將該紋理設定為"Linear Color"且無"sRGB",因為它只包含灰度值,第二張中,我們把該圖的黑色部分視為水坑,部分有水坑部分沒有符合現實常理(后面處理會進行"1-x"運算,將白色部分看成水坑)

映射至世界空間
-
初步映射

-
控制水坑大小
這是一個灰度圖,通過做減法即可放大水坑,但這里采用一種更加靈活的方式——lerp

-
控制水坑位置
讓上圖可以看到水坑的紋理延申到了其他面,但正常來說應該只有上面才會出現水坑,因此需要想辦法讓水坑只出現在物體上面

-
確保水坑只有白色

從上圖可以得知,有些部分是灰色的,因此我們需要再"Multiply"確保只存在白色和黑色

normal
-
水坑的漣漪不僅僅在水滴落下時會產生,當被風吹時也會產生,水滴落下的效果在之前已經實作了,對于風吹的漣漪我們采用UE5提供的紋理


-



-
控制漣漪位置
本小節的實作是水坑,那肯定是在水坑處產生漣漪啊!


融合所有效果
- 將以上所有效果融合即可實作一個完整的雨天shader
- 你可能不是很清楚,這里的mask究竟代表什么含義,仔細觀察下圖,不難發現mask其實就是我們所實作的效果



normal 混合
混合表面水珠normal 和流淌雨滴normal

- 采用Rain Drip作為alpha的原因:假定我們只考慮alpha為1/0的情況,若alpha為1,我們希望只有RainDrip效果沒有RainDrop,以Lerp效果來說確實如此;若alpha為0,我們希望只有RainDrop效果沒有RainDrop,從Lerp效果來說確實如此,但若以RainDrop作為alpha則不符合我們的條件
混合外部normal
- 因為目前這兩個normal只是內部實作的material function的normal,還需要與欲使用的材質的normal進行blend

水坑

濕度控制
- max():因為這三個效果是各自獨立的材質函式,如果分開運算會使得這三效果不一致,我們需要求得以這三之一的max以達到最好且一致的效果

吸水性

reference
Rustling Leaves Shader - UE4 Materials 101 - Episode 12 - YouTube
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552642.html
標籤:其他
下一篇:返回列表
