返回部落格
教學

法線貼圖慣例:OpenGL vs DirectX 詳解

為什麼你的法線貼圖在 Unreal 中看起來反轉了,但在 Unity 中卻很正常——用白話文解釋切線空間 Y 軸慣例,並提供具體修復方法。

Admin2026年4月23日1 分鐘閱讀11

你將法線貼圖插入 Unreal,表面光照就像太陽從下方照射一樣。你把同一個檔案插入 Unity 或 Blender——看起來很棒。網格相同。紋理相同。這是怎麼回事?

兩個行業,一個軸的分歧

法線貼圖在其 RGB 通道中儲存表面方向。紅色 = X,綠色 = Y,藍色 = Z。每個 PBR 引擎的解碼方式都相同,除了一個例外:Y 的符號。

OpenGL 慣例 (Y+):更明亮的綠色通道意味著表面指向上方。由 Unity、Godot、Blender(Cycles 和 Eevee)、Substance Painter 的預設匯出,以及所有基於 WebGL 的引擎使用。

DirectX 慣例 (Y−):更明亮的綠色意味著表面指向下方。由 Unreal Engine、舊版 Direct3D 工具鏈,以及一些 CryEngine/Xbox 時代資源使用。

PNG 中的位元組相同。物理意義相反。

一眼識別的方法

在法線貼圖中查看半球形凸起(像按鈕或圓頂)。在 OpenGL 慣例中,凸起的底部將是較深的綠色,因為表面向 Y− 旋轉,遠離光源。在 DirectX 慣例中,底部是較亮的綠色

如果你的光照在引擎中感覺反向了——高光出現在陰影應該在的地方——你有一個慣例不匹配。

修復只需 5 秒鐘

在 Unreal 中,紋理匯入對話框有一個翻轉綠色通道核取方塊。將其開啟,引擎會在取樣時反轉 G 通道。無需重新匯出你的來源檔案。

在 Unity 中,將紋理類型設定為法線貼圖,匯入工具會處理所有內容——Unity 預期 OpenGL,但如果檔案看起來有問題,它會警告你。在 Blender 中,使用分離顏色 → 反轉 G → 組合顏色節點鏈,或直接在法線貼圖節點中選擇 DirectX 風格的輸入。

為什麼一開始會有兩個標準?

在 1990 年代,OpenGL 和 DirectX 定義了相反的紋理座標空間——OpenGL 的 Y 向上增加,DirectX 的 Y 向下增加。當法線貼圖在 2000 年代中期變得普遍時,每個工具鏈都將其空間烤入其輸出中。分歧之所以堅持,是因為翻轉既定的管道成本很高。

生成法線貼圖而不產生混亂

aukimi 法線貼圖生成器讓你在匯出時明確選擇慣例。它在你的高度貼圖的亮度上執行 Sobel 梯度,然後將 (−dx·s, −dy·s, 1) 打包到 RGB 中——當你選擇 DirectX 時,Y 被翻轉。你可以在生成後切換慣例並重新下載,無需重新上傳任何內容。

在內部,公式是相同的。唯一的區別是我們在寫入綠色通道前應用於 Y 分量的符號。知道這一點,你可以使用任何影像編輯器在慣例之間轉換檔案:開啟 PNG,選擇綠色通道,反轉它,儲存。這就是 Unreal 中「翻轉綠色通道」所做的全部內容。

快速參考

  • Unity、Godot、Blender、Substance Painter(預設):OpenGL (Y+)。
  • Unreal Engine、舊版 Direct3D:DirectX (Y−)。
  • 在 Unreal 中看起來有問題?在匯入設定中啟用「翻轉綠色通道」。
  • 在 Unity 中看起來有問題?你可能從 DirectX 慣例工具匯出了——反轉綠色通道或重新匯出。

一旦你掌握了慣例,修復就微不足道了。最難的部分是第一次識別它。

#normal-map#3d#pbr#shaders#opengl#directx

喜歡這篇文章嗎?

ShareHN