Up to date

This page is up to date for Godot 4.3. If you still find outdated information, please open an issue.

使用空白字元

備註

裝飾僅在 Clustered Forward 和 Forward Mobile 算繪後端中受支援,在相容性後端中不受支援。

如果使用相容性後端,請考慮使用 Sprite3D 作為將裝飾投影到(大部分)平坦表面的替代方案。

裝飾是應用於 3D 不透明或透明表面的投影紋理。此投影是即時發生的,不依賴網格生成。這允許您在每一影格移動裝飾,即使在複雜的網格上應用時,也只會對性能產生很小的影響。

雖然裝飾無法將實際的幾何細節新增到投影表面上,但裝飾仍然可以利用基於物理的算繪來提供與成熟的 PBR(基於物理的算繪)材質類似的屬性。

在本指南中,我們將學到:

  • 如何在 3D 編輯器中設定裝飾。

  • 如何在遊戲過程中為 3D 場景建立裝飾(例如彈孔)。

  • 如何為裝飾的配置進行性能和品質之間的平衡。

也參考

The Godot demo projects repository contains a 3D decals demo.

如果您想在表面上寫入任意 3D 文字,請使用靠近表面放置的 doc_3d_text 而不是 Decal 節點。

使用例

靜態函式

有時,為場景新增紋理細節的最快方法是使用裝飾。對於有機細節尤其如此,例如散佈在大表面上的污垢或沙子。裝飾可以幫助打破場景中的紋理重複並使圖案看起來更自然。在較小的規模上,裝飾也可用於建立物件的細節變化。例如,裝飾可用於在硬表面幾何體頂部新增螺母和螺栓。

由於裝飾可以在投影表面上註入自己的 PBR(基於物理的算繪)屬性,因此它們也可以用於建立足跡或濕水坑。

使用裝飾在關卡幾何頂部新增污垢

使用裝飾在關卡幾何頂部新增污垢

動態遊戲元素

裝飾可以代表暫時或持久的遊戲效果,例如子彈撞擊和爆炸燒焦。

使用 AnimationPlayer 節點或腳本,可以使裝飾隨著時間的推移而褪色(然後使用「queue_free()」刪除)以提高效能。

接觸陰影

斑點陰影經常用於移動專案(或遵循復古藝術風格),因為實時照明在低端移動裝置上往往過於昂貴。但是,當依賴具有完全烘焙燈光的烘焙光照貼圖時,動態物件不會從這些燈光投射*任何*陰影。與即時光照相比,這使得光照貼圖場景中的動態物件看起來很平坦,動態物件幾乎看起來像是漂浮的。

由於斑點陰影,動態物件仍然可以投射近似陰影。這不僅有助於場景中的深度感知,而且還可以成為一種遊戲元素,尤其是在 3D 平台遊戲中。斑點陰影的長度可以延長,讓玩家知道如果他們垂直落下他們會落在哪裡。

即使使用即時光照,斑點陰影仍然可以作為環境光遮擋的一種形式,適用於 SSAO 由於其螢幕空間性質而過於昂貴或過於不穩定的情況。例如,使用斑點陰影很好地表示了車輛的底部陰影。

物體比較下的斑點陰影

物體比較下的斑點陰影

快速入門指南

使用程式碼來連接訊號

  1. 使用程式碼來連接訊號

  2. 在*屬性面板*中,展開 Material*(材質)部分,為 *0 號槽分配一個 SpatialMaterial

  3. 將裝飾節點移向對象,然後旋轉它以使裝飾可見(並且方向正確)。如果裝飾看起來是鏡像的,請嘗試將其旋轉 180 度。您可以將**參數 > 正常淡入淡出**增加到 0.5 來仔細檢查其方向是否正確。這將防止裝飾投影到不面向裝飾的表面。

  4. 如果您的裝飾僅影響靜態對象,請將其配置為防止影響動態對象(反之亦然)。為此,請變更裝飾的 剔除蒙版 屬性以排除某些圖層。執行此操作後,修改動態物件的 MeshInstance3D 節點以變更其可見性層。例如,您可以將它們從第 1 層移至第 2 層,然後在裝飾的 剔除蒙版 屬性中停用第 2 層。

節點屬性

  • 範圍: 裝飾的大小。 Y 軸決定裝飾投影的長度。盡可能保持投影長度短,以增加剔除機會,從而提高效能。

紋理

  • 反照率: 用於裝飾的反照率(漫反射/顏色)貼圖。在大多數情況下,這是您要先設定的紋理。如果使用法線或 ORM 貼圖,*必須*設定反照率貼圖以提供 Alpha 通道。此 Alpha 通道將用作遮罩,以確定法線/ORM 貼圖對底層表面的影響程度。

  • 法線: 用於裝飾的法線貼圖。這可用於透過修改光線對其的反應方式來增加裝飾上的感知細節。此紋理的影響會乘以反照率紋理的 Alpha 通道(但不是 反照率混合)。

  • ORM: 用於裝飾的遮蔽/粗糙度/金屬貼圖。這是用於儲存 PBR 材質貼圖的最佳化格式。環境光遮擋貼圖儲存在紅色通道中,粗糙度貼圖儲存在綠色通道中,金屬貼圖儲存在藍色通道中。此紋理的影響會乘以反照率紋理的 Alpha 通道(但不是 反照率混合)。

  • 發射: 用於裝飾的發射紋理。與 Albedo 不同,此紋理看起來會在黑暗中發光。

參數

  • 發射能量: 發射紋理的亮度。

  • 調變: 乘以反照率和發射紋理的顏色。使用它來為裝飾著色(例如,用於油漆裝飾,或透過隨機化每個裝飾的調變來增加變化)。

  • **反照率混合:**反照率紋理的不透明度。與使用具有更透明 Alpha 通道的反照率紋理不同,將此值降低到「1.0」以下並不會減少法線/ORM 紋理對底層表面的影響。當建立普通/僅 ORM 裝飾(例如腳步或濕水坑)時,將其設定為「0.0」。

  • 正常淡入淡出: 如果裝飾的 AABB(軸對齊邊界框)與目標表面之間的角度變得太大,則淡出裝飾。無論角度如何,值“0.0”都會投影裝飾,而值“0.999”則將裝飾限制為幾乎垂直的表面。由於增加了法線角度計算,將 Normal Fade 設定為大於「0.0」的值會產生較小的效能成本。

垂直淡化

  • 上部淡入淡出: 隨著表面遠離 AABB(軸對齊邊界框)中心(朝向裝飾的投影角),裝飾將逐漸淡出的曲線。只有正值才有效。

  • 較低淡入淡出: 當表面遠離 AABB(軸對齊邊界框)(遠離裝飾的投影角)中心時,裝飾將褪色的曲線。只有正值才有效。

距離淡出

  • 啟用: 控制是否啟用距離淡入淡出(LOD(細節等級)的一種形式)。裝飾將在 Begin + Length 內淡出,之後它將被剔除並且根本不會發送到著色器。使用它可以減少場景中活動裝飾的數量,從而提高效能。

  • 開始: 裝飾開始淡出時距相機的距離(以 3D 單位表示)。

  • 長度: 裝飾褪色的距離(以 3D 單位表示)。裝飾在這段距離內逐漸變得透明,最後完全不可見。數值越高,淡出過渡越平滑,這在相機快速移動時更適合。

剔除遮罩

  • 剔除遮罩: 指定此貼紙將投影到哪些 VisualInstance3D 圖層。預設情況下,裝飾會影響所有圖層。使用它可以指定哪些型別的物件接收裝飾,哪些型別不接收裝飾。這特別有用,因此您可以確保動態物件不會意外收到針對其下方地形的裝飾。

Decal rendering order

By default, decals are ordered based on the size of their AABB and the distance to the camera. AABBs that are closer to the camera are rendered first, which means that decal rendering order can sometimes appear to change depending on camera position if some decals are positioned at the same location.

To resolve this, you can adjust the Sorting Offset property in the VisualInstance3D section of the Decal node inspector. This offset is not a strict priority order, but a guideline that the renderer will use as the AABB size still affects how decal sorting works. Therefore, higher values will always result in the decal being drawn above other decals with a lower sorting offset.

If you want to ensure a decal is always rendered on top of other decals, you need to set its Sorting Offset property to a positive value greater than the AABB length of the largest decal that may overlap it. To make this decal drawn behind other decals instead, set the Sorting Offset to the same negative value.

VisualInstance3D Sorting Offset comparison on Decals

VisualInstance3D Sorting Offset comparison on Decals

效能

裝飾算繪效能主要取決於其螢幕覆蓋範圍及其數量。一般來說,覆蓋大部分螢幕的一些大裝飾的算繪成本會比散佈在各處的許多小裝飾的算繪成本更高。

若要提高算繪效能,您可以如上所述啟用 距離淡入淡出 屬性。這將使遠處的裝飾在遠離相機時淡出(並且可能對最終場景算繪幾乎沒有影響)。使用節點群組,您還可以根據使用者配置防止產生非必要的裝飾裝飾。

The way decals are rendered also has an impact on performance. The Rendering > Textures > Decals > Filter advanced project setting lets you control how decal textures should be filtered. Nearest/Linear does not use mipmaps. However, decals will look grainy at a distance. Nearest/Linear Mipmaps will look smoother at a distance, but decals will look blurry when viewed from oblique angles. This can be resolved by using Nearest/Linear Mipmaps Anisotropic, which provides the highest quality but is also slower to render.

如果您的專案具有像素藝術風格,請考慮將濾鏡設定為**最近**值之一,以便裝飾使用最近鄰濾鏡。否則,請堅持**線性**。

限制

裝飾不能影響上面列出的屬性之外的材質屬性,例如高度(對於視差貼圖)。

出於性能原因,裝飾使用純粹固定的算繪邏輯。這意味著裝飾不能使用自訂著色器。但是,投影表面上的自訂著色器能夠讀取被其頂部的裝飾覆蓋的信息,例如粗糙度和金屬度。

When using the Forward+ renderer, Godot uses a clustering approach for decal rendering. As many decals as desired can be added (as long as performance allows). However, there's still a default limit of 512 clustered elements that can be present in the current camera view. A clustered element is an omni light, a spot light, a decal or a reflection probe. This limit can be increased by adjusting Max Clustered Elements in Project Settings > Rendering > Limits > Cluster Builder.

使用 Forward Mobile 後端時,每個單獨的網格*資源*上只能套用 8 個裝飾。如果有更多裝飾影響單一網格,則並非所有裝飾都會算繪在網格上。