Up to date

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

3D 渲染的局限性

前言

出於對性能的要求, 即時渲染引擎有很多局限性.Godot的渲染器也不例外. 為了更有效地工作, 你需要瞭解這些局限性.

紋理尺寸限制

在桌上型電腦和筆記型電腦上,舊裝置可能不支援大於 8192×8192 的紋理。你可以在 GPUinfo.org 上檢查你的目標 GPU 的限制。

移動端GPU通常僅支援小於4096×4096的紋理. 此外, 一些移動端GPU不支援對非二的冪次大小的紋理進行重複(repeat)操作. 因此, 如果你想讓你的紋理在所有平臺上正確顯示, 你應該避免使用比4096×4096大的紋理, 如果紋理需要重複, 應該使用兩倍的大小.

若要限制可能太大而無法渲染的特定紋理的大小,您可以將 Process > Size Limit 匯入選項設定為大於「0」的值。這將減少匯入時紋理的尺寸(保留縱橫比),而不影響原始檔。

帶狀顏色

當使用GLES3或Vulkan渲染器時,Godot的3D引擎內部以高動態範圍(HDR)進行渲染. 然而, 渲染輸出將被色調對應(tonemmapped)到一個低動態範圍, 以便它可以顯示在螢幕上. 這可能導致可見的條帶效應(banding), 特別是當使用未貼圖的材質時. 在使用了具有平滑梯度的紋理的2D專案中也能看到這種效應.

使用相容性渲染方法時,不使用 HDR,顏色精確度是所有渲染方法中最低的。這也適用於 2D 渲染,其中使用平滑漸層紋理時可能會看到條帶。

Godot 沒有使用限制

  • 如果使用 Forward+ 或 Forward Mobile 渲染方法,請在進階專案設定中啟用 Use Debanding。這應用了全螢幕去帶著色器作為後處理效果,並且非常便宜。

  • 或者,在你的紋理中烘焙一些雜訊。這主要在2D中是有效的,例如用於虛化效果。在3D中,你也可以使用一個 自訂去噪著色器 來應用於你的 材質 。即使你的專案是用LDR渲染的,這種技術也是有效的,這意味著它在使用GLES2渲染器時也能發揮作用。

色帶比較(增加對比度以提高可視性)

色帶比較(增加對比度以提高可視性)

也參考

參見 Banding in Games: A Noisy Rant 獲取更多有關條帶效應的細節和解決方案.

深度緩衝精度

為了在 3D 空間中排序物件,渲染引擎使用了*深度緩衝區*(也稱為 Z 緩衝區)。這個緩衝區具有有限的精度:在桌面平臺上是 24 位,在移動平臺上有時是 16 位元(出於性能原因)。如果兩個不同的物件最終具有相同的緩衝值,那麼就會發生 Z 衝突(Z-fighting),此時移動或旋轉相機,將觀察到紋理來回閃爍。

為了使深度緩衝在渲染區域上更精確,你應該*增加*相機節點的 Near 屬性。但是要小心,如果你設定得太高,玩家就會看穿附近的幾何體。同時,還應該*減少*相機節點的 Far 屬性到你用例允許的最低值,儘管它不會像 Near 屬性那樣影響精度。

如果你只需要當玩家能夠看到很遠的地方時才提供高精度, 你可以根據遊戲條件動態改變它. 例如, 如果玩家進入飛機, Near 屬性可以暫時增加, 以避免遠處的z衝突現象(z-fighting). 當玩家離開飛機時, 它便會被減少.

根據場景和玩家視野條件, 你還可以在玩家不會看出差異的情況下將產生z衝突的物件移得更遠.

Z-fighting 比較(透過將 Label3D 偏離地板來調整場景前後)

Z-fighting 比較(透過將 Label3D 偏離地板來調整場景前後)

透明度排序

在 Godot 中,透明材質是在不透明材質之後繪製的。透明對象在繪製之前會從後向前排序,排序依據是該 Spatial 的位置,而不是世界空間中頂點的位置。因此, 互相有重疊的物件可能會出現排序錯誤的情況。要修復排序不當的物件,可以調整材質的 Render Priority 屬性。這將迫使特定的材質出現在其他透明材質的前面或後面。即便如此,這可能也並不總是能解決問題。

一些渲染引擎會使用*順序無關的透明*技術來緩解這個問題,但這類技術對於 GPU 而言開銷很大。Godot 目前沒有提供這個功能,但仍然有幾種方法可以避免這個問題:

  • 只有在你真正需要的時候才讓材質透明。如果一種材質只有一個很小的透明部分,考慮將它分割成一個單獨的材質。這將允許不透明部分投射陰影,也可能提高性能。

  • 如果你的紋理上大部分都是完全不透明或完全透明的區域,可以使用 Alpha 測試而不是 Alpha 混合。這個透明模式渲染起來比較快,沒有透明度問題。可以在 SpatialMaterial 中啟用**參數 > 使用 Alpha 裁剪**,需要時還可以相應地對 **Alpha 裁剪閾值**進行調整。請注意,MSAA 不會對該紋理的邊緣進行抗鋸齒,但 FXAA 會。

  • 如果你需要渲染紋理上的半透明區域,Alpha 裁剪就不適用了。將 SpatialMaterial 的**參數 > 深度繪製模式**屬性設為 **Opaque Pre-Pass**(不透明預處理)有時候會有用(但會影響性能)。

  • If you want a material to fade with distance, use the StandardMaterial3D distance fade mode Pixel Dither or Object Dither instead of Pixel Alpha. This will make the material opaque, which also speeds up rendering.

透明度排序比較(左邊是alpha混合材質,右邊是alpha剪刀材質)

透明度排序比較(左邊是alpha混合材質,右邊是alpha剪刀材質)

多取樣抗鋸齒

也參考

輸入動作在 使用 InputEvent 頁面上有詳細解釋。

多重樣本抗鋸齒(MSAA)指的是在渲染物件時在多邊形的邊上取多個覆蓋樣本(coverage samples), 但它不會增加用於渲染場景的顏色樣本數量. 下面是它在實踐中的作用和局限性:

  • 網格的邊緣將被很好地平滑(就像超取樣一樣).

  • 使用alpha測試(1位透明度)的透明材質無法被平滑.

  • 鏡面反射鋸齒問題(即出現在反射表面上的“火花”(sparkle))無法解決。

有幾種方法可以解決這一限制, 這取決於您的績效預算:

  • 為了使鏡面反射鋸齒不那麼明顯,請打開專案設定,並啟用 Rendering > Quality > Screen Space Filters > Screen Space Roughness Limiter。這個濾波器對性能有一定影響,只有當您確實需要它時, 才應該啟用。

  • 除了(或代替)MSAA之外, 啟用FXAA.FXAA是一個螢幕空間的抗鋸齒方法, 因此它將平滑一切事物. 缺點是它會使場景顯得模糊, 特別是在解析度低於1440p的時候.

  • 除了(或代替)MSAA之外, 啟用FXAA.FXAA是一個螢幕空間的抗鋸齒方法, 因此它將平滑一切事物. 缺點是它會使場景顯得模糊, 特別是在解析度低於1440p的時候.

  • 以更高的解析度渲染場景,然後在與視窗大小配對的 ViewportTexture 中顯示它。確保在 ViewportTexture 的標記中啟用 Filter。這種技術叫做*超取樣*,非常慢。通常只推薦在離線渲染時使用。