使用貼花
備註
貼花僅支援於 Forward+ 與 Mobile 算繪器,不支援 Compatibility 算繪器。
如果使用 Compatibility 算繪器,請考慮改用 Sprite3D 將貼花投射到(大多為)平坦表面上。
裝飾是應用於 3D 不透明或透明表面的投影紋理。此投影是即時發生的,不依賴網格生成。這允許您在每一影格移動裝飾,即使在複雜的網格上應用時,也只會對性能產生很小的影響。
雖然貼花無法在投影表面新增實際幾何細節,但仍可利用 PBR 算繪,讓貼花擁有與完整 PBR 材質類似的特性。
在本指南中,我們將學到:
如何在 3D 編輯器中設定裝飾。
如何在遊戲過程中為 3D 場景建立裝飾(例如彈孔)。
如何為裝飾的配置進行性能和品質之間的平衡。
也參考
Godot 的範例專案庫中包含了一個「3D 貼花」示範專案:3D decals demo。
若你想在表面上顯示任意 3D 文字,請使用 3D 文字 並將其貼近表面,而不要用 Decal 節點。
使用例
靜態裝飾
有時,為場景新增紋理細節的最快方法是使用裝飾。對於有機細節尤其如此,例如散佈在大表面上的污垢或沙子。裝飾可以幫助打破場景中的紋理重複並使圖案看起來更自然。在較小的規模上,裝飾也可用於建立物件的細節變化。例如,裝飾可用於在硬表面幾何體頂部新增螺母和螺栓。
因為貼花可以在投影表面上疊加自己的 PBR 特性,也能用來製作像是腳印或積水等效果。
使用裝飾在關卡幾何頂部新增污垢
動態遊戲元素
裝飾可以代表暫時或持久的遊戲效果,例如子彈撞擊和爆炸燒焦。
使用 AnimationPlayer 節點或腳本,可以使裝飾隨著時間的推移而褪色(然後使用「queue_free()」刪除)以提高效能。
接觸陰影
斑點陰影經常用於移動專案(或遵循復古藝術風格),因為實時照明在低端移動裝置上往往過於昂貴。但是,當依賴具有完全烘焙燈光的烘焙光照貼圖時,動態物件不會從這些燈光投射*任何*陰影。與即時光照相比,這使得光照貼圖場景中的動態物件看起來很平坦,動態物件幾乎看起來像是漂浮的。
由於斑點陰影,動態物件仍然可以投射近似陰影。這不僅有助於場景中的深度感知,而且還可以成為一種遊戲元素,尤其是在 3D 平台遊戲中。斑點陰影的長度可以延長,讓玩家知道如果他們垂直落下他們會落在哪裡。
即使使用即時光照,斑點陰影仍然可以作為環境光遮擋的一種形式,適用於 SSAO 由於其螢幕空間性質而過於昂貴或過於不穩定的情況。例如,使用斑點陰影很好地表示了車輛的底部陰影。
物體比較下的斑點陰影
快速入門指南
在編輯器中建立貼花
在 3D 編輯器中建立一個 Decal 節點。
在屬性面板中展開 Textures 區段,於 Textures > Albedo 載入貼圖。
將裝飾節點移向對象,然後旋轉它以使裝飾可見(並且方向正確)。如果裝飾看起來是鏡像的,請嘗試將其旋轉 180 度。您可以將**參數 > 正常淡入淡出**增加到 0.5 來仔細檢查其方向是否正確。這將防止裝飾投影到不面向裝飾的表面。
如果您的裝飾僅影響靜態對象,請將其配置為防止影響動態對象(反之亦然)。為此,請變更裝飾的 剔除蒙版 屬性以排除某些圖層。執行此操作後,修改動態物件的 MeshInstance3D 節點以變更其可見性層。例如,您可以將它們從第 1 層移至第 2 層,然後在裝飾的 剔除蒙版 屬性中停用第 2 層。
節點屬性
範圍: 貼花的大小。Y 軸決定貼花投影的深度。請盡量縮短投影長度,以增加裁切機會,進而提升效能。
紋理
Albedo: 貼花的反照率(漫反射/顏色)貼圖。大多數情況下,你會優先設定此貼圖。若要使用法線貼圖或 ORM 貼圖時,必須 指定 Albedo 以提供 Alpha 通道,該 Alpha 通道會作為遮罩,決定法線/ORM 貼圖對底層表面的影響程度。
Normal: 貼花的法線貼圖。可用來調整光線反應,增加貼花細節。此貼圖效果會乘以 Albedo 貼圖的 Alpha 通道(但不受 Albedo Mix 影響)。
ORM: 貼花的遮蔽/粗糙度/金屬度貼圖,是最佳化的 PBR 材質貼圖格式。紅色通道儲存遮蔽,綠色通道為粗糙度,藍色通道為金屬度。此貼圖效果會乘以 Albedo 的 Alpha 通道(不受 Albedo Mix 影響)。
Emission: 貼花的自發光貼圖。與 Albedo 不同,此貼圖在黑暗中會發光。
參數
發射能量: 發射紋理的亮度。
調變: 乘以反照率和發射紋理的顏色。使用它來為裝飾著色(例如,用於油漆裝飾,或透過隨機化每個裝飾的調變來增加變化)。
Albedo Mix: 反照率貼圖的不透明度。與直接降低 Alpha 通道不同,將此值設為低於
1.0並*不會*減少法線/ORM 對底層表面的影響。若要製作純用法線或 ORM 的貼花(如腳印、積水等),可將此值設為0.0。Normal Fade: 當貼花的 AABB 與目標表面的角度過大時,貼花會逐漸淡出。設為
0.0時,不論角度都會投影貼花;設為0.999時,貼花僅會顯示於幾乎垂直的表面。此數值越大,計算負擔略增。
垂直淡出
Upper Fade: 隨著表面離 AABB 中心越遠(朝貼花投影方向),貼花將沿此曲線淡出。僅接受正值。
Lower Fade: 隨著表面離 AABB 中心越遠(遠離貼花投影方向),貼花將沿此曲線淡出。僅接受正值。
距離淡出
Enabled: 控制是否啟用距離淡出(屬於 LOD)。貼花會在 Begin + Length 距離範圍內淡出,超過後會被裁切,不再送至著色器。這有助於減少場景中有效貼花數量,提升效能。
Begin: 從相機起算,貼花開始淡出的距離(3D 單位)。
Length: 貼花淡出所跨距離(3D 單位)。貼花會在這段距離內逐漸透明,最後完全消失。此值越大,淡出越平滑,適合攝影機快速移動時使用。
裁切遮罩
Cull Mask: 指定貼花會投影到哪些 VisualInstance3D 圖層。預設會影響所有圖層。可使用此功能指定哪些物件會套用貼花,哪些不會。這對於避免動態物件套用到原本僅想作用於地形的貼花特別有用。
貼花繪製順序
預設情況下,貼花的繪製順序會依據其 AABB 的大小以及與相機的距離來排序。距離相機較近的 AABB 會先被繪製,這代表如果多個貼花重疊時,隨著相機位置改變,貼花的顯示順序也可能會改變。
為了解決這個問題,你可以在 Decal 節點的屬性面板中,於 VisualInstance3D 區段調整 Sorting Offset 屬性。這個偏移量並不是嚴格的優先順序,而是給算繪器的一個*參考值*,因為 AABB 大小仍會影響貼花的排序。因此,較高的數值會*總是*讓該貼花繪製在 Sorting Offset 較低的貼花之上。
若要確保某個貼花總是顯示在其他貼花之上,請將其 Sorting Offset 屬性設為比所有可能重疊的貼花最大 AABB 長度還要大的正值。若希望該貼花顯示在其他貼花之下,則設為相同數值的負值即可。
VisualInstance3D Sorting Offset 在貼花上的比較
效能
裝飾算繪效能主要取決於其螢幕覆蓋範圍及其數量。一般來說,覆蓋大部分螢幕的一些大裝飾的算繪成本會比散佈在各處的許多小裝飾的算繪成本更高。
若要提高算繪效能,您可以如上所述啟用 距離淡入淡出 屬性。這將使遠處的裝飾在遠離相機時淡出(並且可能對最終場景算繪幾乎沒有影響)。使用節點群組,您還可以根據使用者配置防止產生非必要的裝飾裝飾。
貼花的繪製方式也會影響效能。Rendering > Textures > Decals > Filter 進階專案設定可調整貼花貼圖的過濾方式。Nearest/Linear 不使用 mipmap,遠距離下貼花會顯得顆粒感強。Nearest/Linear Mipmaps 距離遠時較為平滑,但斜角觀看會模糊。Nearest/Linear Mipmaps Anisotropic 可解決此問題,畫質最佳但效能開銷較高。
如果您的專案具有像素藝術風格,請考慮將濾鏡設定為**最近**值之一,以便裝飾使用最近鄰濾鏡。否則,請堅持**線性**。
限制
裝飾不能影響上面列出的屬性之外的材質屬性,例如高度(對於視差貼圖)。
出於性能原因,裝飾使用純粹固定的算繪邏輯。這意味著裝飾不能使用自訂著色器。但是,投影表面上的自訂著色器能夠讀取被其頂部的裝飾覆蓋的信息,例如粗糙度和金屬度。
在使用 Forward+ 算繪器時,Godot 以*叢集*方式繪製貼花。你可以根據效能盡量加入貼花,但目前相機影格下仍有限制,預設最多 512 個*叢集元素*。叢集元素包括全向光、聚光燈、 decal 及 reflection probe 。 Max Clustered Elements 可於 專案設定 > Rendering > Limits > Cluster Builder > Max Clustered Elements 提高限制。
當使用 Mobile 算繪器時,每個個別的 Mesh 資源 上只能套用 8 個貼花。如果有更多貼花影響單個 Mesh,將不會在該 Mesh 上渲染所有貼花。