遊戲裡的草為什麼會隨風擺動
效能調校彈性
高(可切 Instancing/SRP Batcher)
很高(可搭 Nanite/Lumen 但成本高)
中(需自行管理批次)
適合場景
手機、中小型專案、跨平台
3A 級大場景、PC/主機
獨立遊戲、教學、輕量專案
四、為什麼你的草看起來像「果凍」?五個常見錯誤與修正
這一段是實戰踩雷區。以下五個症狀,幾乎每個做過草的人都遇過。
4.1 整片草同步擺動,像體操隊
原因:所有草用了同一個時間函數,沒有加入位置相位差。
解法:把草的世界座標(不是模型本地座標)與風向做點積,乘上一個頻率係數後加進相位。這樣越靠下游的草,擺動的時間點越晚,就會形成波浪推進的視覺。
如果你用的是模型本地座標,所有草因為本地原點都一樣,相位還是同步,等於沒改。這個坑非常多人踩。
4.2 草根也在動,整體像在平移
原因:高度遮罩沒接、接錯通道,或忘了做 pow 衰減。
解法:確認頂點色的通道對應正確(美術可能存成 B 或 Alpha),並且把權重過一次 pow(w, 1.5~2.0)。此外,位移量要乘以高度,Y 軸不要跟著抬,否則草會離地。
4.3 擺太快、振幅太大,變成電風扇
原因:調參時只看單株草,沒有在整片草原檢視。
解法:振幅建議從草高度的 5%~12% 開始試,速度從每秒 1.5~3.0 弧度開始試。近距離觀察自然、遠距離觀察也不暈,才算過關。
4.4 草在動,但光影完全沒變
原因:法線沒有跟著重新計算,或陰影階段沒有套用同樣的頂點位移。
解法:輕量做法是把擺動量的一小部分回饋到法線上;務實做法是在陰影深度材質裡套用同樣的 WPO 函式,讓影子同步擺動。
4.5 遠景草叢閃爍、密集處出現黑塊
原因:草的透明或 Alpha Test 造成排序問題,或 Mipmap 與 Alpha 裁切值不匹配。
解法:草一律使用 Alpha Clip(Cutout) 而不是半透明混合;裁切值與 Mip 生成倍率要一起調整,通常裁切值落在 0.3~0.5 之間並隨距離微調。
五、效能:草是效能殺手,怎麼省?
草是遊戲裡最典型的「用數量堆出美感」的物件。一片看起來普通的草地,畫面上可能同時存在三萬根草、每根 8 個頂點、加上 Overdraw,效能壓力非常可觀。以下是業界常用的省法。
5.1 Draw Call 與 Instancing:先解決 CPU 瓶頸
如果你讓每一株草都是一個獨立物件,CPU 光是送繪製指令就會爆掉。正確做法是用 GPU Instancing(Unity)或 Instanced Static Mesh(Unreal),把上萬株草壓成少數幾個 Draw Call。更極端的做法是用 Compute Shader 或 Geometry Shader 在 GPU 端生成草的位置,CPU 完全不參與。
5.2 LOD 與距離淡出:遠處的草不值得那麼貴
常見的三段式策略:
淡出這一步千萬別省。草的邊緣如果硬切,會出現明顯的「圓形草圈」;用 Dither 或距離透明度做過渡,視覺上幾乎看不出來。
5.3 剔除與密度:看不見的就別畫
視錐剔除(Frustum Culling)是基本盤,但真正省的是距離剔除與遮蔽剔除。另外,草密度可以用噪聲貼圖做不均勻分布——玩家不會發現空地變多了,但 GPU 會感謝你。
5.4 效能取捨參考表
平台
建議草頂點數/株
近景草密度
陰影
備註
高階手機
4–6
關閉草的投影
優先保幀率
PC/主機
8–12
可開,需同步 WPO
可搭配 GPU 生成
VR
4 以下
盡量關閉
擺動幅度要收斂避免暈眩
Web/低階裝置
3–4
關閉
改用貼圖為主的表現
六、進階技巧:讓草從「會動」變成「有生命」
基礎的風場只能讓草「有反應」。但要讓玩家產生「這片草原活著」的感受,還需要幾個加分項。
6.1 角色互動:走過的草會彎腰
把玩家的世界座標與半徑傳進著色器,在頂點階段算出「離玩家多遠」,距離越近、草被壓得越低,方向則是從玩家往外推。這種互動成本極低(只是幾個乘加),但回饋感極強,是許多 3A 遊戲提升沉浸感的標配。
6.2 天氣與時間聯動
把風速、風向、擺動幅度做成全域參數,由天氣系統控制。晴天微風、陰天起風、暴風雨時草幾乎貼地。這種「玩家不一定注意到、但拿掉就會覺得怪」的細節,是氛圍設計的核心。
6.3 草與光線的互動
草的擺動如果能帶動法線變化,光穿過草叢時就會出現流動的光影斑駁,這比單純的位移真實得多。進階做法還會加入次表面散射(Subsurface Scattering)近似,讓逆光的草尖透出黃綠色。
6.4 音效與擺動同步
風聲的音量與草的擺動幅度共用同一組參數。當風突然變強,草浪掃過、音量同時拉高,兩個感官訊號一致,大腦就會判定「這是真的風」。
七、結語:一行三角函數撐起的整片草原
回到最初的問題——遊戲裡的草為什麼會隨風擺動?答案其實樸素得有點好笑:因為有人寫了一段 sin(),然後把它乘上高度權重與相位差,最後加在頂點座標上。
但就是這個「樸素」的數學式,撐起了遊戲裡最容易讓人停下腳步的畫面之一。它是效能預算與視覺幻覺之間的完美平衡:不做物理、不計算碰撞、不需要真實,卻能讓玩家相信那裡真的有一陣風。
如果你是玩家,下次看到草浪翻湧,可以留意一下它是「整片同步」還是「有波浪推進」,這大概就能看出開發團隊在細節上花了多少心思。如果你是開發者,記住三件事就好:相位差要靠世界座標、彎曲要用高度遮罩、遠處的草一定要淡出。把這三件事做好,你的草原就已經贏過一半的遊戲了。
至於那些草會不會真的被吹倒——放心,它們永遠不會。它們只是在你看不見的地方,安靜地做著三角函數。
```
💬 想說點什麼?
歡迎到留言板分享你的想法、心得或疑問。
💬 前往留言板 →