點(diǎn)實(shí)戰(zhàn):從零構(gòu)建《絕地求生》級(jí)動(dòng)態(tài)海面效果)
1. 項(xiàng)目概述從“調(diào)參”到“造浪”的思維躍遷每次看到《絕地求生》里那片隨著時(shí)間緩緩起伏、波光粼粼的海面你是不是也和我一樣第一反應(yīng)是去網(wǎng)上找個(gè)現(xiàn)成的Shader然后一頭扎進(jìn)材質(zhì)面板里對著十幾個(gè)滑塊瘋狂調(diào)試試圖“蒙”出那個(gè)感覺我曾經(jīng)也這么干過結(jié)果往往是調(diào)了半天水面要么像果凍一樣僵硬要么像沸騰的開水一樣詭異離“以假亂真”差了十萬八千里。后來我意識(shí)到問題不在于參數(shù)本身而在于我們根本不知道這些參數(shù)背后連接的是什么它們?nèi)绾蜗嗷プ饔米罱K驅(qū)動(dòng)了那片虛擬的海洋。這就是今天我想和你聊的核心別再只會(huì)當(dāng)個(gè)“參數(shù)調(diào)試員”了。我們要用Unity的ShaderGraph從最底層的原理出發(fā)親手“搭建”出那片海。這個(gè)過程本質(zhì)上是在用節(jié)點(diǎn)“編程”水的行為邏輯。我將為你拆解實(shí)現(xiàn)“吃雞”級(jí)海面效果的五個(gè)最關(guān)鍵的ShaderGraph節(jié)點(diǎn)它們就像搭建樂高積木的五個(gè)核心零件。掌握了它們你不僅能復(fù)刻出這個(gè)效果更能舉一反三創(chuàng)造出任何你想象中的水面——無論是寧靜的湖泊、湍急的河流還是風(fēng)暴中的怒濤。這篇文章適合所有對Shader感興趣但又被代碼嚇退的Unity開發(fā)者我們將完全在可視化界面中完成這場造浪之旅。2. 核心思路拆解如何用節(jié)點(diǎn)“模擬”一片海在動(dòng)手連接節(jié)點(diǎn)之前我們必須先想清楚一片看起來“真實(shí)”的海面在Shader里究竟是由哪些視覺元素構(gòu)成的。這決定了我們整個(gè)節(jié)點(diǎn)網(wǎng)絡(luò)的架構(gòu)方向。2.1 視覺元素分解海面不止是藍(lán)色首先我們得拋棄“一個(gè)顏色貼圖走天下”的簡單思維。一片生動(dòng)的海面是多種視覺信息疊加的結(jié)果基礎(chǔ)顏色與深度近處的海水清澈透亮顏色較淺遠(yuǎn)處的海水深邃呈現(xiàn)出更濃郁的藍(lán)色甚至墨綠色。這不僅僅是顏色變化還包含了光線在水體中散射和吸收的物理現(xiàn)象。波浪起伏頂點(diǎn)動(dòng)畫海面不是平的它由無數(shù)大小、方向、速度各異的波浪疊加而成。這是讓海面“活”起來的第一步需要通過動(dòng)態(tài)地改變模型頂點(diǎn)的位置來實(shí)現(xiàn)。表面細(xì)節(jié)法線即使是一個(gè)平滑的波浪曲面在微觀上也是粗糙不平的有細(xì)碎的波紋、漣漪和泡沫。這些細(xì)節(jié)決定了光線如何反射是產(chǎn)生“波光粼粼”質(zhì)感的關(guān)鍵通常由法線貼圖來表現(xiàn)。高光與反射陽光或月光照射在海面上會(huì)形成明亮的高光點(diǎn)Specular和周圍環(huán)境的反射Reflection。高光的形狀、強(qiáng)度和銳利度直接傳達(dá)了海面的“粗糙度”或“風(fēng)速”信息。菲涅爾效應(yīng)這是一個(gè)關(guān)鍵的物理現(xiàn)象——視線與表面法線夾角越小即掠射角觀察水面反射越強(qiáng)夾角越大垂直向下看越容易看到水下的折射內(nèi)容。這解釋了為什么我們總是看到海天交界處有一條亮線而腳邊的海水則相對透明。2.2 節(jié)點(diǎn)化實(shí)現(xiàn)路徑基于以上分解我們的ShaderGraph構(gòu)建路徑就清晰了頂點(diǎn)動(dòng)畫層使用Time和Position節(jié)點(diǎn)驅(qū)動(dòng)數(shù)學(xué)運(yùn)算生成波浪的位移信息。表面細(xì)節(jié)層使用Texture 2D Asset和Tiling Offset節(jié)點(diǎn)采樣并動(dòng)態(tài)滾動(dòng)法線貼圖模擬細(xì)碎波紋。視覺融合層使用Normal Blend等節(jié)點(diǎn)將多層細(xì)節(jié)如基礎(chǔ)波浪和細(xì)節(jié)漣漪平滑地混合在一起。光學(xué)響應(yīng)層使用Fresnel Effect節(jié)點(diǎn)和PBR Master節(jié)點(diǎn)的輸入如Smoothness來模擬海面對光線的復(fù)雜反應(yīng)。整個(gè)思路就是從“驅(qū)動(dòng)頂點(diǎn)運(yùn)動(dòng)”開始逐步疊加“表面細(xì)節(jié)”最后賦予其“正確的光學(xué)屬性”。下面我們就深入這五個(gè)決定成敗的關(guān)鍵節(jié)點(diǎn)。3. 五大關(guān)鍵節(jié)點(diǎn)深度解析與實(shí)戰(zhàn)連接這五個(gè)節(jié)點(diǎn)是構(gòu)建海面Shader的骨架理解它們每一個(gè)的作用和連接邏輯比記住一百個(gè)參數(shù)組合更有用。3.1 發(fā)動(dòng)機(jī)Time節(jié)點(diǎn)——讓一切動(dòng)起來為什么是它靜態(tài)的海面是死海。所有動(dòng)態(tài)效果——波浪的起伏、波紋的流動(dòng)、光斑的移動(dòng)——都依賴于一個(gè)持續(xù)變化的時(shí)間信號(hào)。Time節(jié)點(diǎn)就是ShaderGraph里的時(shí)鐘它輸出一個(gè)隨著游戲時(shí)間不斷增大的浮點(diǎn)數(shù)默認(rèn)是自場景加載以來的秒數(shù)。關(guān)鍵操作與原理僅僅輸出時(shí)間值還不夠我們需要用它來驅(qū)動(dòng)周期性的運(yùn)動(dòng)比如正弦波。這里就會(huì)引入一個(gè)經(jīng)典組合Time-Multiply乘以一個(gè)控制速度的系數(shù)-Sine正弦函數(shù)。Multiply的作用乘以一個(gè)系數(shù)比如0.5本質(zhì)是控制頻率。系數(shù)越大正弦波振蕩越快波浪就顯得更“急促”或“細(xì)密”。Sine的作用將線性增長的時(shí)間轉(zhuǎn)換為在[-1, 1]之間平滑、周期性振蕩的值。這個(gè)振蕩值可以直接用來偏移頂點(diǎn)的Y坐標(biāo)形成基礎(chǔ)的波浪形狀。實(shí)操心得直接使用Time節(jié)點(diǎn)的輸出變化會(huì)非常快。我通常會(huì)先連接一個(gè)Multiply節(jié)點(diǎn)乘以一個(gè)0.1到1之間的小數(shù)例如0.3得到一個(gè)“慢速時(shí)間”再用這個(gè)慢速時(shí)間去驅(qū)動(dòng)主要波浪這樣動(dòng)畫會(huì)更自然易于控制。對于需要不同速度的次級(jí)波紋則可以使用另一個(gè)乘以不同系數(shù)如0.7的“快速時(shí)間”分支。3.2 空間坐標(biāo)讀取器Position節(jié)點(diǎn)——知道“我在哪”為什么是它波浪不可能在所有位置都一樣高。我們需要根據(jù)頂點(diǎn)在世界空間或物體空間中的水平位置X和Z坐標(biāo)來計(jì)算其應(yīng)有的高度Y坐標(biāo)偏移。Position節(jié)點(diǎn)提供了頂點(diǎn)的位置信息。關(guān)鍵操作與原理默認(rèn)的Position節(jié)點(diǎn)輸出是一個(gè)三維向量 (X, Y, Z)。對于海面我們通常關(guān)心的是水平面即X和Z分量。拆分與重組使用Split節(jié)點(diǎn)將Position的XYZ分開取出X和Z。然后我們可能會(huì)用經(jīng)過Time驅(qū)動(dòng)的數(shù)學(xué)函數(shù)如Sine去處理X和Z得到兩個(gè)方向的偏移量再用Combine節(jié)點(diǎn)將新的Y值原始Y偏移量與X、Z重新組合成一個(gè)新的三維向量??臻g選擇Position節(jié)點(diǎn)有World、Object、View等空間選項(xiàng)。對于海面這種可能移動(dòng)的物體比如一艘船上的海面使用Object空間位置來計(jì)算波浪可以保證波浪形狀跟隨物體移動(dòng)更合理。如果是無限大的遠(yuǎn)景海面使用World空間則更簡單。一個(gè)基礎(chǔ)波浪的節(jié)點(diǎn)鏈?zhǔn)纠齈osition (Object Space) - Split - (取出X) \ Time - Multiply(Speed) - Add - Sine - Multiply(Amplitude) - Combine (作為新的Y) / Position (Object Space) - Split - (取出Z) - Multiply(WaveDirection) - Add這個(gè)流程的意思是用Time經(jīng)過速度縮放后加上由位置X和Z按一定方向混合的值作為正弦函數(shù)的輸入從而得到一個(gè)隨時(shí)間和空間位置變化的波浪高度。3.3 紋理動(dòng)畫控制器Tiling And Offset節(jié)點(diǎn)——制造流動(dòng)的細(xì)節(jié)為什么是它單靠頂點(diǎn)動(dòng)畫生成的波浪往往過于規(guī)則和光滑缺乏真實(shí)海面那種復(fù)雜的、多尺度的細(xì)節(jié)。這時(shí)就需要法線貼圖。但一張靜態(tài)的法線貼圖貼上去還是死的我們需要讓貼圖上的波紋“流動(dòng)”起來模擬風(fēng)驅(qū)動(dòng)力作用下水面的運(yùn)動(dòng)。Tiling And Offset節(jié)點(diǎn)的Offset輸入端口正是實(shí)現(xiàn)紋理滾動(dòng)的關(guān)鍵。關(guān)鍵操作與原理這個(gè)節(jié)點(diǎn)有兩個(gè)主要輸入Tiling縮放和Offset偏移。Tiling控制紋理的重復(fù)度。值越大同一區(qū)域內(nèi)重復(fù)的紋理次數(shù)越多意味著波紋越細(xì)密。對于海面我們可能需要兩層不同尺度的法線貼圖一層Tiling較大模擬大的波浪走向一層Tiling很大模擬細(xì)碎的漣漪。Offset這是一個(gè)二維向量輸入代表紋理在UV空間內(nèi)的偏移量。核心技巧來了我們將一個(gè)由Time驅(qū)動(dòng)的二維向量例如(Time * Speed, 0)連接到Offset紋理就會(huì)沿著U方向水平持續(xù)滾動(dòng)。如果向量是(Time * Speed1, Time * Speed2)紋理就會(huì)沿對角線方向滾動(dòng)。實(shí)現(xiàn)雙層流動(dòng)細(xì)節(jié)為了打破單調(diào)性幾乎所有的海面Shader都會(huì)使用至少兩層法線貼圖。第一層主波紋使用一張方向性較強(qiáng)的法線貼圖Tiling較小如0.05Offset速度較慢模擬主要波浪的走向和光影。第二層細(xì)節(jié)漣漪使用另一張或同一張法線貼圖Tiling較大如0.15Offset速度較快且方向與第一層略有不同例如一個(gè)向左一個(gè)向右上。這能疊加出非常豐富的細(xì)節(jié)避免出現(xiàn)明顯的重復(fù)圖案。3.4 細(xì)節(jié)混合器Normal Strength 與 Normal Blend節(jié)點(diǎn)——合成真實(shí)質(zhì)感為什么是它們當(dāng)我們有了兩層或更多滾動(dòng)的法線貼圖后不能簡單地把它們疊加在一起那樣會(huì)導(dǎo)致信息混亂。我們需要有控制地混合它們。Normal Strength節(jié)點(diǎn)這個(gè)節(jié)點(diǎn)經(jīng)常被忽略但它至關(guān)重要。它允許我們在混合前單獨(dú)調(diào)整某一張法線貼圖的“強(qiáng)度”或“影響力”。輸入一個(gè)法線向量來自Sample Texture 2D一個(gè)強(qiáng)度系數(shù)Float。作用當(dāng)強(qiáng)度系數(shù)為1時(shí)輸出原法線大于1時(shí)增強(qiáng)法線細(xì)節(jié)使凹凸感更強(qiáng)在0到1之間時(shí)減弱細(xì)節(jié)為0時(shí)相當(dāng)于一個(gè)平坦的藍(lán)色法線(0,0,1)。實(shí)戰(zhàn)應(yīng)用我們可以為“主波紋”和“細(xì)節(jié)漣漪”分別設(shè)置不同的Normal Strength。比如讓主波紋強(qiáng)度為0.8細(xì)節(jié)漣漪強(qiáng)度為0.4。這樣細(xì)節(jié)層就不會(huì)喧賓奪主而是在主波紋的基礎(chǔ)上增加一些微妙的擾動(dòng)。Normal Blend節(jié)點(diǎn)這是將多張法線貼圖安全、正確混合的標(biāo)準(zhǔn)節(jié)點(diǎn)。它采用一種特殊的算法能避免直接加法混合導(dǎo)致的向量長度變化即法線信息失真。操作它有兩個(gè)輸入口Base基礎(chǔ)法線和Blend混合法線。我們將調(diào)整好強(qiáng)度的主波紋法線連入Base將細(xì)節(jié)漣漪法線連入Blend。輸出就是一個(gè)融合了兩者信息的、新的法線向量。進(jìn)階技巧你可以進(jìn)行多次混合。例如Normal Blend的輸出可以作為新的Base再與第三層泡沫或特殊效果的法線進(jìn)行第二次Normal Blend。避坑指南千萬不要用普通的Add或Lerp節(jié)點(diǎn)去混合法線法線是歸一化向量長度為1直接相加會(huì)破壞其長度導(dǎo)致光照計(jì)算錯(cuò)誤出現(xiàn)奇怪的黑斑或過度明亮區(qū)域。Normal Blend節(jié)點(diǎn)是為此場景量身定做的。3.5 光學(xué)特性塑造器Fresnel Effect節(jié)點(diǎn)——模擬水岸交界為什么是它這是實(shí)現(xiàn)“海水為什么越遠(yuǎn)越亮越近越透”這一視覺特性的物理鑰匙。菲涅爾效應(yīng)描述了反射率隨觀察角度變化的規(guī)律。關(guān)鍵操作與原理在ShaderGraph中Fresnel Effect節(jié)點(diǎn)根據(jù)表面法線Normal和觀察方向View Direction計(jì)算出一個(gè)漸變系數(shù)。這個(gè)系數(shù)在視線與表面平行時(shí)掠射角接近1在垂直時(shí)接近0。連接將我們混合好的最終法線向量連接到Normal輸入口View Direction通常使用默認(rèn)的攝像機(jī)視圖方向。輸出應(yīng)用這個(gè)0到1之間的系數(shù)有兩個(gè)最主要的用途控制顏色混合創(chuàng)建一個(gè)Lerp線性插值節(jié)點(diǎn)。將深水顏色連到A淺水或高光顏色連到B將Fresnel的輸出連到T。這樣在視線掠射的海平面遠(yuǎn)處將顯示更多的B亮色在垂直視角的近處顯示更多的A深色??刂品瓷?高光強(qiáng)度可以將Fresnel輸出連接到PBR Master節(jié)點(diǎn)的Smoothness或Environment Reflections的強(qiáng)度上讓邊緣的反射更強(qiáng)。參數(shù)調(diào)整 節(jié)點(diǎn)上的Power參數(shù)控制著菲涅爾效應(yīng)的過渡銳利度。Power值越小過渡越平緩、范圍越大值越大過渡越尖銳亮暗分界線越明顯。對于海面一個(gè)中等偏大的Power值如3-5可以模擬出比較清晰的水天線效果。4. 完整節(jié)點(diǎn)網(wǎng)絡(luò)搭建與參數(shù)調(diào)試實(shí)錄理解了核心節(jié)點(diǎn)后讓我們把它們像拼圖一樣組裝起來并看看每個(gè)旋鈕該怎么調(diào)。4.1 節(jié)點(diǎn)網(wǎng)絡(luò)架構(gòu)圖文字描述版由于無法使用圖表我用層級(jí)結(jié)構(gòu)描述整個(gè)網(wǎng)絡(luò)的數(shù)據(jù)流時(shí)間與空間輸入層Time節(jié)點(diǎn)輸出經(jīng)過兩個(gè)不同的Multiply節(jié)點(diǎn)生成SlowTime系數(shù)~0.3和FastTime系數(shù)~0.7。Position節(jié)點(diǎn)Object Space提供頂點(diǎn)原始坐標(biāo)。頂點(diǎn)位移生成層使用SlowTime和Position的XZ分量通過一系列Add、Multiply、Sine運(yùn)算生成一個(gè)低頻、大振幅的波浪高度偏移量WaveOffsetA。用同樣的邏輯但使用不同的方向和頻率參數(shù)生成另一個(gè)波浪高度偏移量WaveOffsetB。將WaveOffsetA和WaveOffsetB用Add節(jié)點(diǎn)相加得到總的頂點(diǎn)Y軸偏移。再與原始的X、Z通過Combine節(jié)點(diǎn)組合輸出到PBR Master的Vertex Position端口。法線細(xì)節(jié)生成層主波紋法線Texture 2D Asset法線貼圖 -Sample Texture 2D。其UV輸入來自UV節(jié)點(diǎn) -Tiling And OffsetTiling0.05, Offset(SlowTime*0.1, 0)-Normal StrengthStrength0.8。細(xì)節(jié)漣漪法線同一張或另一張Texture 2D Asset-Sample Texture 2D。其UV輸入來自UV節(jié)點(diǎn) -Tiling And OffsetTiling0.15, Offset(FastTime0.2, FastTime0.1)-Normal StrengthStrength0.4。法線混合Normal Blend節(jié)點(diǎn)將主波紋法線連入Base細(xì)節(jié)漣漪法線連入Blend。輸出為Final Normal。顏色與光學(xué)計(jì)算層Fresnel Effect節(jié)點(diǎn)輸入Final Normal和默認(rèn)View DirectionPower設(shè)為4。Color節(jié)點(diǎn)創(chuàng)建深藍(lán)色DeepColor如#006994FF和淺藍(lán)綠色ShallowColor如#00FFE5FF。Lerp節(jié)點(diǎn)A連DeepColorB連ShallowColorT連Fresnel Effect輸出。結(jié)果輸出到PBR Master的Albedo。Final Normal輸出到PBR Master的Normal。一個(gè)Vector1節(jié)點(diǎn)設(shè)為公開參數(shù)Smoothness默認(rèn)值0.9輸出到PBR Master的Smoothness。你也可以用Fresnel輸出來進(jìn)一步調(diào)制Smoothness增加邊緣反射。4.2 關(guān)鍵參數(shù)調(diào)試心法參數(shù)沒有絕對的正確值只有適合你場景的“感覺”。以下是調(diào)試順序和邏輯先調(diào)“形”再調(diào)“色”首先關(guān)閉顏色和法線貼圖只保留頂點(diǎn)動(dòng)畫。調(diào)整波浪的Speed頻率和Amplitude振幅直到得到一個(gè)你覺得自然的基礎(chǔ)起伏節(jié)奏。太大像海嘯太小像水塘。法線貼圖強(qiáng)度打開法線貼圖先將Normal Strength都設(shè)為0然后慢慢調(diào)高。主波紋的強(qiáng)度如0.5-0.8決定了波浪的“形體感”細(xì)節(jié)漣漪的強(qiáng)度如0.2-0.4決定了表面的“粗糙度”。兩者強(qiáng)度差不宜過小否則層次不清。Tiling與Offset速度Tiling決定波紋的尺度。遠(yuǎn)景海面主波紋Tiling要小如0.02-0.05近景或特寫可以大一些。Offset的速度要與頂點(diǎn)動(dòng)畫的Speed相匹配。通常紋理滾動(dòng)的視覺速度應(yīng)略慢于或等于頂點(diǎn)起伏的速度否則會(huì)產(chǎn)生“滑移”的失真感。菲涅爾與顏色調(diào)整Fresnel的Power改變深水區(qū)與淺水區(qū)亮部的過渡范圍。然后調(diào)整Lerp兩端的顏色。DeepColor影響海水主體的顏色ShallowColor影響邊緣高光和水面反光的色調(diào)。晴天用明亮的藍(lán)綠色陰天用灰藍(lán)色。光滑度與金屬度海水的Metallic通常為0非金屬Smoothness較高0.85-0.95。提高Smoothness能增強(qiáng)鏡面反射高光的銳利度和環(huán)境反射的清晰度。你可以嘗試將Fresnel輸出連接到Smoothness實(shí)現(xiàn)“邊緣更光滑中心更粗糙”的物理效果。4.3 性能優(yōu)化小貼士貼圖尺寸用于海面的法線貼圖512x512分辨率通常足夠甚至可以嘗試256x256。因?yàn)門iling通常很小貼圖會(huì)被拉伸高分辨率收益不大。節(jié)點(diǎn)簡化復(fù)雜的數(shù)學(xué)運(yùn)算如多個(gè)Sine、Fraction會(huì)帶來性能成本。在滿足效果的前提下盡量簡化頂點(diǎn)位移部分的計(jì)算。有時(shí)用一張高度圖Height Map驅(qū)動(dòng)頂點(diǎn)位移性能可能更好。LOD支持為海面材質(zhì)配置多級(jí)LODLevel of Detail。在遠(yuǎn)處可以使用更簡單的Shader變體例如減少一層法線混合甚至關(guān)閉頂點(diǎn)動(dòng)畫只用紋理動(dòng)畫。5. 常見問題排查與效果進(jìn)階即使按照步驟搭建也可能會(huì)遇到一些奇怪的問題。這里記錄了幾個(gè)我踩過的坑和對應(yīng)的解決方案。5.1 水面閃爍或抖動(dòng)Z-fighting現(xiàn)象海面與海底或其他物體交界處出現(xiàn)閃爍的像素。原因海面網(wǎng)格與海底網(wǎng)格在深度Z值上過于接近深度緩沖精度不足以區(qū)分誰在前誰在后。解決方案輕微抬高海面在頂點(diǎn)著色器中將海面整體向上Y軸偏移一個(gè)微小值如0.001單位。可以在頂點(diǎn)位移計(jì)算完成后在最終的Y值上加一個(gè)很小的常數(shù)。調(diào)整渲染隊(duì)列確保海面材質(zhì)的渲染隊(duì)列Render Queue在透明物體之前但在不透明物體之后。通常設(shè)置為Geometry1即2501。使用深度偏移在ShaderGraph的PBR Master節(jié)點(diǎn)或材質(zhì)的Inspector面板中調(diào)整Depth Offset參數(shù)。這是一個(gè)非常有效的解決方案。5.2 波浪邊緣出現(xiàn)鋸齒Aliasing現(xiàn)象波浪的輪廓特別是由頂點(diǎn)動(dòng)畫形成的尖銳波峰在移動(dòng)時(shí)出現(xiàn)閃爍的鋸齒。原因頂點(diǎn)位移幅度過大導(dǎo)致三角形在屏幕空間的變化速率超過采樣頻率。解決方案開啟抗鋸齒在項(xiàng)目質(zhì)量設(shè)置或攝像機(jī)中確保MSAA或后處理抗鋸齒如SMAA、FXAA是開啟的。柔化波浪降低頂點(diǎn)動(dòng)畫的振幅或者讓波浪形狀更平滑例如使用Sine函數(shù)而不是更尖銳的函數(shù)。增加曲面細(xì)分如果使用支持曲面細(xì)分Tessellation的渲染管線如HDRP可以通過增加網(wǎng)格細(xì)分程度來提供更多的頂點(diǎn)細(xì)節(jié)從而平滑波浪曲線。但這會(huì)顯著增加性能開銷。5.3 法線貼圖接縫明顯現(xiàn)象流動(dòng)的法線貼圖在UV邊界通常是0和1的位置出現(xiàn)明顯的、不連續(xù)的接縫。原因法線貼圖沒有設(shè)置為Wrap模式或者Tiling不是整數(shù)導(dǎo)致邊緣顏色對不上。解決方案檢查導(dǎo)入設(shè)置在Unity Project面板中選中法線貼圖在Inspector中確保Wrap Mode設(shè)置為Repeat重復(fù)而不是Clamp鉗制。使用無縫貼圖確保你使用的法線貼圖本身是“無縫”的即它的左右邊緣、上下邊緣可以完美拼接。很多在線工具可以制作無縫紋理。節(jié)點(diǎn)技巧在ShaderGraph中可以在UV進(jìn)入Tiling And Offset之前先經(jīng)過一個(gè)Fraction節(jié)點(diǎn)確保UV值始終在[0, 1)范圍內(nèi)避免因浮點(diǎn)數(shù)精度問題導(dǎo)致的接縫。5.4 效果進(jìn)階增加泡沫與焦散一個(gè)頂級(jí)的海面還需要泡沫和海底焦散Caustics效果。泡沫可以基于波浪的“陡度”生成。在Shader中計(jì)算頂點(diǎn)位移后相鄰頂點(diǎn)的斜率或高度差當(dāng)差值超過某個(gè)閾值時(shí)使用一張泡沫貼圖進(jìn)行混合。簡單實(shí)現(xiàn)可以采樣一張泡沫噪聲圖用波浪的Y方向?qū)?shù)通過DDX/DDY節(jié)點(diǎn)近似來驅(qū)動(dòng)其顯示。焦散這是光線透過水面在海底形成的光影圖案。實(shí)現(xiàn)方法是在海底或水下物體的材質(zhì)上投影一張動(dòng)態(tài)的、扭曲的焦散貼圖。貼圖的UV偏移可以用與海面頂點(diǎn)動(dòng)畫相似的Time和Sine函數(shù)驅(qū)動(dòng)但速度更慢以模擬光線的緩慢移動(dòng)。掌握了這五個(gè)核心節(jié)點(diǎn)和背后的原理你就從被參數(shù)支配的“調(diào)試者”變成了創(chuàng)造視覺規(guī)律的“設(shè)計(jì)師”。下一次當(dāng)你想實(shí)現(xiàn)某種特定的水面效果時(shí)不妨先停下來思考我需要驅(qū)動(dòng)哪些屬性用什么節(jié)點(diǎn)來生成這種變化如何混合多層信息這個(gè)過程本身就是Shader藝術(shù)最迷人的地方。