證)
植被圖集這件事在材質(zhì)圈里一直是個(gè)分水嶺。剛?cè)胄心菚?huì)兒我以為做樹(shù)葉就是找張好看的葉子照片摳出來(lái)往模型上一貼就完事。結(jié)果第一次把成品丟進(jìn)引擎美術(shù)總監(jiān)看了一眼就問(wèn)我你這樹(shù)葉怎么像紙片糊上去的風(fēng)一吹是不是還得嘩嘩響那一刻我才意識(shí)到植被圖集遠(yuǎn)不是貼圖兩個(gè)字能概括的它牽扯到Alpha通道的精度、法線的朝向、粗糙度的層次、以及整個(gè)圖集在引擎里的采樣效率。Substance Designer之所以成為這個(gè)環(huán)節(jié)的主力工具核心就在于它能把隨機(jī)性和可控性這兩件看似矛盾的事捏到一起——你既要有自然植被那種不規(guī)則的生長(zhǎng)感又得保證每一片葉子在UV里規(guī)規(guī)矩矩、不越界、不糊邊。這篇內(nèi)容我打算把整套植被圖集的制作鏈路從頭到尾捋一遍從圖集規(guī)劃、葉片單體生成、法線與粗糙度推導(dǎo)到最終打包導(dǎo)出和引擎驗(yàn)證。適合已經(jīng)摸過(guò)Substance Designer基礎(chǔ)節(jié)點(diǎn)、但一做植被就翻車(chē)的朋友也適合想從拼照片轉(zhuǎn)向程序化生成的材質(zhì)從業(yè)者。我不會(huì)只給你一串節(jié)點(diǎn)連線而是把每一步為什么這么做講清楚包括我自己踩過(guò)的那些坑——比如Alpha邊緣發(fā)灰、法線接縫、圖集打包后采樣模糊這些老問(wèn)題都會(huì)給出具體的排查思路和參數(shù)區(qū)間。1. 植被圖集到底在解決什么問(wèn)題1.1 從一張葉子一張圖到一張圖集打天下很多人剛開(kāi)始做植被習(xí)慣一片葉子導(dǎo)出一張貼圖覺(jué)得這樣清晰、好管理。但真到了場(chǎng)景里一棵樹(shù)幾百片葉子如果每片都獨(dú)立貼圖Draw Call會(huì)直接爆炸顯存也會(huì)被大量重復(fù)的小圖撐滿。植被圖集的核心思路就是把多種葉片、多種朝向、多種破損狀態(tài)全部塞進(jìn)一張或少數(shù)幾張大圖里讓引擎用同一份材質(zhì)實(shí)例去渲染成百上千個(gè)面片。這背后的邏輯其實(shí)和游戲里的UI圖集、角色裝備圖集是一回事合并采樣源降低狀態(tài)切換開(kāi)銷(xiāo)。但植被比UI麻煩的地方在于葉片有大量透明區(qū)域Alpha通道的處理直接決定了邊緣質(zhì)量和性能。圖集里如果Alpha分布不合理要么邊緣鋸齒嚴(yán)重要么透明區(qū)域浪費(fèi)了大量像素填充率。我一般會(huì)把一張圖集控制在2048×2048或4096×4096具體看項(xiàng)目目標(biāo)平臺(tái)。移動(dòng)端傾向2048PC和主機(jī)可以上4096。圖集內(nèi)部按網(wǎng)格切分比如8×8的格子每格256×256一片葉子占一格或兩格。這樣在UV映射時(shí)每片葉子的UV都落在固定區(qū)間內(nèi)方便程序化擺放和LOD切換。1.2 圖集規(guī)劃里最容易被忽略的三個(gè)約束第一個(gè)約束是Alpha的膨脹邊界。葉片貼圖在采樣時(shí)如果UV剛好落在葉片邊緣GPU的雙線性插值會(huì)把透明區(qū)域的RGB也混進(jìn)來(lái)導(dǎo)致邊緣發(fā)灰或發(fā)黑。解決辦法是在葉片周?chē)舫?到4像素的出血區(qū)把葉片的顏色向外膨脹Dilate出去。Substance Designer里有專(zhuān)門(mén)的Dilate節(jié)點(diǎn)但很多人忘了在圖集打包之后再做一次全局膨脹。第二個(gè)約束是法線的切線空間一致性。圖集里每片葉子的法線都必須是切線空間法線而且朝向要統(tǒng)一。如果你從不同來(lái)源拼葉子有的法線是物體空間、有的Y軸朝上有的朝下進(jìn)引擎后光照會(huì)亂成一團(tuán)。我的做法是在Designer里統(tǒng)一用Normal節(jié)點(diǎn)從高度圖生成保證所有葉片的法線基準(zhǔn)一致。第三個(gè)約束是Mipmap的衰減。圖集在遠(yuǎn)處會(huì)觸發(fā)Mipmap如果葉片之間間距太近低級(jí)別Mip會(huì)把相鄰葉片的顏色混進(jìn)來(lái)出現(xiàn)鬼影。所以圖集里每片葉子之間要留足空隙通常至少8像素重要葉片可以留16像素。1.3 一張合格植被圖集的驗(yàn)收標(biāo)準(zhǔn)我給自己定的驗(yàn)收標(biāo)準(zhǔn)有這么幾條Alpha邊緣在放大到400%時(shí)不出現(xiàn)明顯灰邊法線在引擎里打光時(shí)葉片正反面過(guò)渡自然沒(méi)有硬接縫粗糙度能區(qū)分出葉面蠟質(zhì)感和葉背的啞光感整張圖集在Mipmap第3級(jí)時(shí)仍然能辨認(rèn)出葉片輪廓。這幾條聽(tīng)起來(lái)簡(jiǎn)單但真做起來(lái)每一條都能卡住不少人。提示驗(yàn)收時(shí)一定要把圖集放進(jìn)實(shí)際引擎場(chǎng)景里看不要只在Designer的2D視圖里判斷。Designer的預(yù)覽和引擎的采樣、光照、Mip策略都有差異很多問(wèn)題只有進(jìn)引擎才暴露。2. 葉片單體的程序化生成思路2.1 用形狀節(jié)點(diǎn)搭出葉片的骨架做葉片單體我不建議一上來(lái)就畫(huà)。程序化的好處是可復(fù)用、可批量變體。我的常規(guī)做法是先用Polygon或Shape節(jié)點(diǎn)搭出葉片的基礎(chǔ)輪廓再用Warp、Directional Warp做邊緣的起伏。葉片的形狀本質(zhì)上是一條主脈加若干側(cè)脈驅(qū)動(dòng)的所以我會(huì)先畫(huà)一條從葉柄到葉尖的漸變作為主脈的權(quán)重然后用這個(gè)權(quán)重去驅(qū)動(dòng)邊緣的彎曲。具體節(jié)點(diǎn)鏈路上我通常用Linear Gradient 1做縱向漸變配合Radial Gradient做葉尖的收窄兩者用Blend疊加得到基礎(chǔ)葉形。接著用Directional Warp配合一張?jiān)肼曌屵吘壆a(chǎn)生自然的鋸齒和波浪。這里噪聲的強(qiáng)度要控制好太強(qiáng)葉子會(huì)像被蟲(chóng)啃過(guò)太弱又顯得太塑料。我一般把噪聲強(qiáng)度放在0.05到0.12之間頻率中等偏高。葉柄部分單獨(dú)用一條細(xì)長(zhǎng)的形狀疊加注意葉柄和葉片的連接處要平滑過(guò)渡不能有硬邊。我見(jiàn)過(guò)不少人葉柄和葉片是兩塊分開(kāi)的圖形結(jié)果Alpha一合并就出現(xiàn)斷裂。2.2 葉脈的層次感靠高度圖而不是顏色新手常犯的錯(cuò)誤是把葉脈直接畫(huà)在顏色圖上結(jié)果葉片看起來(lái)扁平。正確的做法是葉脈主要靠高度圖表達(dá)顏色圖只做輕微的明暗輔助。主脈的高度要比葉面高出一點(diǎn)側(cè)脈再低一些形成三級(jí)層次主脈 側(cè)脈 葉面。在Designer里我會(huì)用幾條不同粗細(xì)、不同方向的Gradient Line組合出葉脈網(wǎng)絡(luò)。主脈用一條較粗的線側(cè)脈用多條細(xì)線按角度分布。這里可以用Tile Sampler或者M(jìn)irror節(jié)點(diǎn)來(lái)批量生成對(duì)稱(chēng)的側(cè)脈效率比手動(dòng)畫(huà)高得多。側(cè)脈的角度和間距要有隨機(jī)變化完全對(duì)稱(chēng)會(huì)顯得假。高度圖的灰度值我一般這樣分配葉面基準(zhǔn)0.5側(cè)脈0.6主脈0.75葉柄0.65。這樣從高度圖生成法線后葉脈的立體感剛好不會(huì)過(guò)于夸張。2.3 顏色變化要模擬真實(shí)葉片的不完美真實(shí)葉片沒(méi)有一片是純色的。向陽(yáng)面和背陰面、老葉和嫩葉、健康區(qū)域和枯萎邊緣顏色都不一樣。我在顏色階段會(huì)疊三層基礎(chǔ)色、漸變變化、局部斑駁?;A(chǔ)色用一張低頻噪聲調(diào)出黃綠到深綠的過(guò)渡。漸變變化用縱向漸變模擬葉尖偏黃、葉基偏深。局部斑駁用高頻噪聲配合Levels做出一些枯黃的小斑點(diǎn)。這三層用不同的混合模式疊加基礎(chǔ)色用Normal漸變用Multiply斑駁用Overlay或Soft Light。這里有個(gè)經(jīng)驗(yàn)葉片的顏色飽和度不要拉滿。很多人做出來(lái)的葉子綠得發(fā)亮像塑料。真實(shí)葉片的飽和度其實(shí)偏低尤其是背光面。我通常會(huì)把最終顏色的飽和度壓到70%左右再在引擎里靠光照補(bǔ)回來(lái)。2.4 用HSL和漸變映射做批量變體一片葉子做完了怎么快速生成幾十種變體我的做法是用HSL節(jié)點(diǎn)配合漸變映射。把基礎(chǔ)葉形和高度圖固定只對(duì)顏色層做HSL偏移色相偏移±15度飽和度±20%明度±10%就能得到一批看起來(lái)同種但不同株的葉片。再配合漸變映射把綠色映射到秋天的黃橙色系就能快速產(chǎn)出一套秋季變體。這種批量變體的思路在項(xiàng)目里非常實(shí)用尤其是需要做季節(jié)變化或者不同生態(tài)環(huán)境的時(shí)候。你不需要重新做形狀只需要調(diào)整顏色參數(shù)效率能提升好幾倍。3. 從高度圖推導(dǎo)法線與粗糙度的關(guān)鍵細(xì)節(jié)3.1 法線生成不是點(diǎn)一下Normal節(jié)點(diǎn)就完事Substance Designer里從高度圖生成法線用的是Normal節(jié)點(diǎn)但參數(shù)設(shè)置有講究。默認(rèn)的強(qiáng)度Intensity往往偏大生成的葉脈法線過(guò)于銳利進(jìn)引擎后高光會(huì)炸。我一般把強(qiáng)度調(diào)到0.5到0.8之間具體看高度圖的對(duì)比度。如果高度圖本身對(duì)比就很強(qiáng)強(qiáng)度還要再降。另一個(gè)關(guān)鍵是法線的采樣精度。Normal節(jié)點(diǎn)內(nèi)部會(huì)對(duì)高度圖做差分計(jì)算如果高度圖的分辨率不夠或者有噪點(diǎn)法線會(huì)出現(xiàn)麻點(diǎn)。解決辦法是在生成法線之前先對(duì)高度圖做一次輕微的模糊Blur把高頻噪點(diǎn)壓掉但注意不要模糊過(guò)頭否則葉脈細(xì)節(jié)就沒(méi)了。我通常用Blur HQ Grayscale半徑1到2像素。還有一點(diǎn)法線生成后要檢查接縫問(wèn)題。如果葉片是左右對(duì)稱(chēng)的法線在對(duì)稱(chēng)軸上可能出現(xiàn)一條硬線。這是因?yàn)椴罘钟?jì)算在邊界處不連續(xù)。解決辦法是在生成法線前把高度圖做一次Mirror讓邊界連續(xù)生成法線后再裁回來(lái)。3.2 粗糙度要區(qū)分葉面和葉背葉片的粗糙度不是均勻的。葉面通常有一層蠟質(zhì)粗糙度偏低大約0.3到0.4葉背的絨毛多粗糙度偏高0.6到0.8。如果整片葉子用同一個(gè)粗糙度光照會(huì)顯得很平。我的做法是用一張遮罩區(qū)分葉面和葉背。這個(gè)遮罩可以從高度圖或者法線的朝向推導(dǎo)出來(lái)——葉背通常對(duì)應(yīng)法線朝下的區(qū)域。用Normal節(jié)點(diǎn)的輸出做點(diǎn)積或者直接用高度圖的梯度方向判斷。得到遮罩后用兩個(gè)不同的灰度值分別填充葉面和葉背再疊加一點(diǎn)噪聲做微觀變化。粗糙度圖里還可以加入一些破損信息比如蟲(chóng)蛀區(qū)域粗糙度偏高枯萎邊緣粗糙度也偏高。這些細(xì)節(jié)雖然小但在近景特寫(xiě)時(shí)能明顯提升真實(shí)感。3.3 環(huán)境光遮蔽AO在葉片上的特殊處理葉片的AO和普通物體不一樣。普通物體的AO是凹處暗、凸處亮但葉片很薄正反面的AO會(huì)互相影響。如果直接用常規(guī)AO生成葉片會(huì)顯得很臟。我的處理方式是AO只做葉脈和葉柄的局部遮蔽葉面大面積保持接近白色。葉脈的凹槽處稍微壓暗葉柄和葉片的連接處壓暗其余區(qū)域不動(dòng)。這樣進(jìn)引擎后葉片整體明亮只有細(xì)節(jié)處有自然的陰影層次。具體參數(shù)上AO的強(qiáng)度我一般控制在0.15到0.25之間不要超過(guò)0.3。超過(guò)0.3葉片就會(huì)顯得灰蒙蒙的失去通透感。3.4 高度圖、法線、AO三者的先后順序這三者的生成順序不能亂。正確的鏈路是先做高度圖再?gòu)母叨葓D生成法線和AO。因?yàn)榉ň€和AO都依賴(lài)高度信息如果先做法線再改高度法線就白做了。我見(jiàn)過(guò)有人先畫(huà)顏色再?gòu)念伾赐聘叨冉Y(jié)果葉脈的立體感完全不對(duì)。顏色是表面反射的結(jié)果高度是幾何結(jié)構(gòu)兩者不能互相替代。一定要先把幾何結(jié)構(gòu)高度定下來(lái)顏色和粗糙度都是在這個(gè)結(jié)構(gòu)上涂上去的。4. 圖集打包與UV布局的實(shí)操要點(diǎn)4.1 用Tile Sampler和Transformation 2D做批量擺放圖集打包的核心是把多個(gè)葉片單體按網(wǎng)格擺放到一張大圖上。Substance Designer里可以用Tile Sampler配合Transformation 2D來(lái)實(shí)現(xiàn)。Tile Sampler負(fù)責(zé)按行列復(fù)制Transformation 2D負(fù)責(zé)每個(gè)實(shí)例的旋轉(zhuǎn)、縮放、偏移。我的常規(guī)參數(shù)是8×8網(wǎng)格每個(gè)格子256×256葉片在格子內(nèi)居中縮放控制在格子的80%到90%留出邊緣空隙。旋轉(zhuǎn)角度我一般給±15度的隨機(jī)范圍讓葉片朝向有變化但不要完全隨機(jī)否則UV映射時(shí)會(huì)很麻煩。這里有個(gè)坑Tile Sampler的隨機(jī)種子要固定。如果種子是隨機(jī)的每次重新生成圖集葉片的位置都會(huì)變之前調(diào)好的UV映射就全廢了。所以一旦布局確定立刻把種子鎖死后續(xù)只改葉片內(nèi)容不改布局。4.2 Alpha通道的膨脹與邊緣處理圖集打包完成后Alpha的邊緣處理是最后一道關(guān)。前面提到過(guò)葉片周?chē)舫鲅獏^(qū)但光留還不夠還要做膨脹。Designer里的Dilate節(jié)點(diǎn)可以對(duì)RGB做膨脹但Alpha本身也需要處理。我的做法是先把所有葉片的Alpha合并成一張遮罩然后用Dilate節(jié)點(diǎn)對(duì)整張圖集的RGB做膨脹膨脹半徑2到4像素。膨脹之后再用這張遮罩去裁剪RGB保證膨脹只發(fā)生在葉片邊緣外側(cè)不會(huì)污染葉片內(nèi)部。膨脹的顏色來(lái)源要選對(duì)。如果膨脹用的是葉片邊緣的顏色效果最好如果用整張圖的平均色邊緣會(huì)出現(xiàn)色差。Designer的Dilate節(jié)點(diǎn)有Color Source選項(xiàng)選Nearest或者Average要看具體情況我一般用Nearest邊緣過(guò)渡更自然。4.3 UV布局與引擎采樣的對(duì)應(yīng)關(guān)系圖集做完最終是要在引擎里用的。UV布局必須和引擎的采樣方式對(duì)應(yīng)上。如果引擎用的是標(biāo)準(zhǔn)的UV采樣那圖集里每片葉子的UV區(qū)間要明確標(biāo)注出來(lái)方便美術(shù)在建模時(shí)對(duì)齊。我通常會(huì)在圖集旁邊附一張UV索引圖標(biāo)出每片葉子對(duì)應(yīng)的UV范圍比如第3行第5列對(duì)應(yīng)UV 0.25-0.375, 0.5-0.625。這張索引圖不導(dǎo)出到引擎只是內(nèi)部協(xié)作用。有了它建模的人就知道該把哪片葉子的UV對(duì)到哪個(gè)區(qū)間不會(huì)貼錯(cuò)。另外圖集的邊緣要留至少4像素的空白因?yàn)橐嬖诓蓸訒r(shí)可能會(huì)因?yàn)镸ipmap或者各向異性過(guò)濾而溢出到圖集邊界外。如果葉片緊貼圖集邊緣采樣時(shí)會(huì)出現(xiàn)邊緣拉伸或者黑邊。4.4 導(dǎo)出格式與壓縮策略導(dǎo)出的時(shí)候顏色圖用sRGB法線和粗糙度用Linear。格式上PC項(xiàng)目我一般用TGA或者PNG做中間格式最終進(jìn)引擎前再轉(zhuǎn)成平臺(tái)支持的壓縮格式。移動(dòng)端用ASTCPC用BC7主機(jī)看具體平臺(tái)。Alpha通道的壓縮要特別注意。很多壓縮格式對(duì)Alpha的支持不好會(huì)導(dǎo)致邊緣質(zhì)量下降。如果項(xiàng)目對(duì)邊緣要求高可以考慮把Alpha單獨(dú)存一張圖用更高的壓縮質(zhì)量。或者用Alpha Test而不是Alpha Blend這樣對(duì)壓縮的容忍度更高。注意導(dǎo)出前一定要在Designer里把圖集的色彩空間設(shè)置檢查一遍。顏色圖如果誤設(shè)成Linear進(jìn)引擎后會(huì)偏暗法線如果誤設(shè)成sRGB光照會(huì)完全錯(cuò)亂。這個(gè)錯(cuò)誤非常常見(jiàn)而且排查起來(lái)很費(fèi)時(shí)間。5. 進(jìn)引擎后的驗(yàn)證與常見(jiàn)翻車(chē)現(xiàn)場(chǎng)5.1 邊緣發(fā)灰、發(fā)黑的排查鏈路邊緣發(fā)灰是植被圖集最經(jīng)典的問(wèn)題。排查的時(shí)候按這個(gè)順序走先看Alpha邊緣有沒(méi)有膨脹再看Mipmap設(shè)置最后看材質(zhì)的混合模式。如果Alpha沒(méi)膨脹邊緣采樣時(shí)會(huì)把透明區(qū)域的黑色混進(jìn)來(lái)導(dǎo)致發(fā)黑。如果膨脹了還發(fā)灰那可能是Mipmap的問(wèn)題——低級(jí)別Mip把葉片和背景混在一起了。解決辦法是給Alpha通道單獨(dú)設(shè)置Mipmap偏移或者用Alpha Test配合較高的Cutoff值。還有一種情況是材質(zhì)的混合模式設(shè)成了Alpha Blend但圖集的Alpha是硬邊0或1這樣邊緣會(huì)有半透明的過(guò)渡帶看起來(lái)發(fā)灰。這種情況要么改用Alpha Test要么把Alpha的邊緣做成漸變。5.2 法線接縫與光照異常的定位法線接縫通常出現(xiàn)在葉片的對(duì)稱(chēng)軸或者圖集的格子邊界。如果接縫在葉片內(nèi)部多半是高度圖在對(duì)稱(chēng)軸處不連續(xù)導(dǎo)致的。如果接縫在圖集格子邊界那是相鄰葉片的法線互相干擾了。定位方法是在引擎里把法線圖單獨(dú)顯示出來(lái)放大看接縫位置。如果是高度圖的問(wèn)題回Designer重新生成法線生成前做Mirror。如果是格子邊界的問(wèn)題檢查圖集里葉片之間的間距加大到16像素以上。光照異常還有一種可能是切線空間不匹配。如果模型導(dǎo)入引擎時(shí)切線空間設(shè)置和Designer生成法線時(shí)的假設(shè)不一致光照會(huì)整體偏斜。這種情況要檢查模型的切線導(dǎo)入設(shè)置確保和法線的切線空間對(duì)齊。5.3 遠(yuǎn)處Mipmap導(dǎo)致的鬼影與模糊遠(yuǎn)處葉片模糊、出現(xiàn)鬼影是Mipmap的典型癥狀。圖集里葉片之間如果間距不夠低級(jí)別Mip會(huì)把相鄰葉片的顏色混進(jìn)來(lái)形成鬼影。解決辦法有兩個(gè)一是加大葉片間距二是給圖集設(shè)置合適的Mipmap生成策略。我一般會(huì)在引擎里給植被圖集的Mipmap做一點(diǎn)銳化或者用Sharpen過(guò)濾。有些引擎支持Mipmap Bias可以稍微偏移一下讓遠(yuǎn)處葉片更清晰。但注意不要偏移太多否則會(huì)出現(xiàn)閃爍。另外如果項(xiàng)目支持可以用Virtual Texture或者Streaming Texture來(lái)管理植被圖集這樣遠(yuǎn)處葉片可以加載更低分辨率的版本既省顯存又減少鬼影。5.4 性能與畫(huà)質(zhì)的平衡取舍植被圖集最終是要跑在實(shí)時(shí)的場(chǎng)景里的性能和畫(huà)質(zhì)必須平衡。我的經(jīng)驗(yàn)是近景葉片用高分辨率圖集遠(yuǎn)景用低分辨率或者簡(jiǎn)化的圖集??梢詼?zhǔn)備兩套圖集一套2048給近景一套512給遠(yuǎn)景引擎根據(jù)距離切換。Alpha Test的Cutoff值也要調(diào)。Cutoff太低邊緣保留太多透明區(qū)域的Overdraw嚴(yán)重Cutoff太高葉片邊緣會(huì)被裁掉顯得稀疏。我一般把Cutoff設(shè)在0.3到0.5之間具體看葉片的Alpha分布。還有一點(diǎn)如果場(chǎng)景里葉片數(shù)量極大可以考慮用Billboard或者Impostor技術(shù)把遠(yuǎn)處的整棵樹(shù)渲染成一張面向相機(jī)的貼圖。這樣能大幅降低面數(shù)和Draw Call代價(jià)是旋轉(zhuǎn)視角時(shí)會(huì)有輕微的紙片感。6. 我踩過(guò)的幾個(gè)典型坑與應(yīng)對(duì)經(jīng)驗(yàn)6.1 圖集打包后顏色變臟的問(wèn)題有一次我做完圖集在Designer里看顏色很正常導(dǎo)出進(jìn)引擎后整體偏暗、偏臟。排查了半天發(fā)現(xiàn)是圖集的色彩空間在導(dǎo)出時(shí)被改了。Designer默認(rèn)的工作空間是Linear但顏色圖需要sRGB。導(dǎo)出時(shí)如果沒(méi)勾選正確的色彩空間轉(zhuǎn)換顏色就會(huì)偏。后來(lái)我養(yǎng)成了一個(gè)習(xí)慣在Designer里給顏色圖單獨(dú)加一個(gè)Color Space節(jié)點(diǎn)明確標(biāo)記為sRGB導(dǎo)出時(shí)就不會(huì)錯(cuò)。法線和粗糙度則保持Linear不加轉(zhuǎn)換。6.2 葉片朝向不一致導(dǎo)致的光照錯(cuò)亂早期做圖集我從不同項(xiàng)目里拼了幾片葉子結(jié)果進(jìn)引擎后有的葉子亮、有的葉子暗打光完全不對(duì)。原因是這些葉子的法線朝向不一致有的Y軸朝上有的朝下。解決辦法是統(tǒng)一法線基準(zhǔn)。所有葉片的高度圖都按同一個(gè)方向生成法線Y軸統(tǒng)一朝上。如果某片葉子需要反向不要翻轉(zhuǎn)法線而是翻轉(zhuǎn)UV或者旋轉(zhuǎn)模型。這樣能保證圖集里所有葉片的法線在同一個(gè)切線空間里。6.3 Alpha膨脹過(guò)度導(dǎo)致的邊緣發(fā)胖膨脹是個(gè)雙刃劍。膨脹不夠邊緣發(fā)灰膨脹過(guò)度葉片邊緣會(huì)發(fā)胖看起來(lái)比實(shí)際大一圈。我一開(kāi)始為了保險(xiǎn)把膨脹半徑設(shè)得很大結(jié)果葉片邊緣多了一圈半透明的光暈。后來(lái)我把膨脹半徑控制在2到3像素并且膨脹后立刻用原始Alpha做一次裁剪把膨脹超出葉片輪廓的部分切掉。這樣既保證了邊緣顏色又不會(huì)讓葉片變形。6.4 圖集分辨率與顯存的權(quán)衡4096的圖集確實(shí)清晰但顯存占用也大。一張4096的RGBA圖集未壓縮時(shí)是64MB壓縮后也有16MB左右。如果項(xiàng)目里有多套植被圖集顯存很快就吃緊了。我的做法是按植被類(lèi)型分圖集而不是把所有植被塞進(jìn)一張。比如闊葉樹(shù)一套、針葉樹(shù)一套、灌木一套、草一套。每套圖集控制在2048這樣顯存壓力小而且不同植被可以用不同的材質(zhì)參數(shù)靈活性更高。6.5 從Designer到引擎的迭代效率問(wèn)題最后說(shuō)一個(gè)流程上的經(jīng)驗(yàn)。很多人做植被圖集是在Designer里做完導(dǎo)出進(jìn)引擎看效果不滿意再回Designer改再導(dǎo)出再進(jìn)引擎。這個(gè)循環(huán)很慢一天改不了幾次。我的優(yōu)化方式是在Designer里把關(guān)鍵參數(shù)暴露成參數(shù)節(jié)點(diǎn)Parameter比如顏色偏移、粗糙度范圍、膨脹半徑。這樣在引擎里如果發(fā)現(xiàn)小問(wèn)題可以先通過(guò)材質(zhì)參數(shù)微調(diào)不用回Designer重新導(dǎo)出。只有結(jié)構(gòu)性的改動(dòng)才回Designer。這個(gè)習(xí)慣能省下大量時(shí)間尤其是項(xiàng)目后期頻繁調(diào)優(yōu)的階段。植被圖集這個(gè)活兒說(shuō)到底是在自然感和工程約束之間找平衡。程序化生成給了你批量產(chǎn)出的能力但真正決定質(zhì)量的還是你對(duì)葉片結(jié)構(gòu)的理解和對(duì)引擎采樣行為的預(yù)判。我做了這么多年每次做新圖集還是會(huì)有新的小坑冒出來(lái)但只要把高度、法線、Alpha這三條線守住大部分問(wèn)題都能在排查鏈路里找到答案。