Torna al blog
Tutorial

Convenzioni delle Mappe Normali: OpenGL vs DirectX Spiegate

Perché la tua mappa normale appare invertita in Unreal ma perfetta in Unity — una spiegazione in linguaggio semplice delle convenzioni dell'asse Y nello spazio tangente, con correzioni concrete.

Admin23 aprile 20263 min di lettura11

Inserisci una mappa normale in Unreal e la superficie si illumina come se il sole provenisse da sotto. Inserisci lo stesso file in Unity o Blender — sembra perfetto. La mesh è identica. La texture è identica. Cosa sta succedendo?

Due Industrie, Un Asse in Disaccordo

Le mappe normali memorizzano una direzione di superficie nei loro canali RGB. Rosso = X, verde = Y, blu = Z. Ogni motore PBR le decodifica nello stesso modo con un'eccezione: il segno di Y.

Convenzione OpenGL (Y+): un canale verde più luminoso significa che la superficie punta verso l'alto. Utilizzato da Unity, Godot, Blender (Cycles ed Eevee), esportazione predefinita di Substance Painter, e ogni motore basato su WebGL.

Convenzione DirectX (Y−): il verde più luminoso significa che la superficie punta verso il basso. Utilizzato da Unreal Engine, la toolchain legacy Direct3D, e alcuni asset di CryEngine/era Xbox.

Gli stessi byte nel PNG. Significato fisico opposto.

Come Capirlo a Colpo d'Occhio

Guarda una sporgenza emisferica (come un bottone o una cupola) nella tua mappa normale. Nella convenzione OpenGL, il fondo della sporgenza sarà verde più scuro perché la superficie sta ruotando verso Y−, allontanandosi dalla luce. Nella convenzione DirectX, il fondo è verde più luminoso.

Se l'illuminazione sembra invertita nel motore — i riflessi dove dovrebbero esserci le ombre — hai un disallineamento di convenzioni.

La Correzione Richiede 5 Secondi

In Unreal, il dialogo di importazione della texture ha una casella Flip Green Channel. Attivala e il motore inverte il canale G al momento del campionamento. Non è necessario ri-esportare l'origine.

In Unity, imposta il tipo di texture su Normal map e l'importatore gestisce tutto — Unity si aspetta OpenGL, ma ti avvertirà se il file sembra sbagliato. In Blender, usa una catena di nodi Separate Color → Invert G → Combine Color, oppure seleziona direttamente l'input in stile DirectX nel nodo Normal Map.

Perché Due Standard in Primo Luogo?

Negli anni '90, OpenGL e DirectX definirono spazi di coordinate di texture opposti — OpenGL aveva Y crescente verso l'alto, DirectX aveva Y crescente verso il basso. Quando le mappe normali divennero comuni a metà degli anni 2000, ogni toolchain incorporò il suo spazio nei suoi output. La divergenza rimase perché capovolgere una pipeline consolidata è costoso.

Generazione di Mappe Normali Senza Confusione

Il Generatore di Mappe Normali aukimi ti consente di scegliere esplicitamente la convenzione quando esporti. Esegue un gradiente Sobel sulla luminanza della tua mappa di altezza, quindi impacchetta (−dx·s, −dy·s, 1) in RGB — con Y capovolto quando scegli DirectX. Puoi alternare la convenzione dopo la generazione e scaricare di nuovo senza ricaricare nulla.

Internamente la formula è identica. L'unica differenza è il segno che applichiamo al componente Y prima di scrivere il canale verde. Sapendo questo, puoi convertire un file tra convenzioni con qualsiasi editor di immagini: apri il PNG, seleziona il canale verde, invertilo, salva. Questo è tutto ciò che fa "Flip Green Channel" in Unreal.

Riferimento Rapido

  • Unity, Godot, Blender, Substance Painter (predefinito): OpenGL (Y+).
  • Unreal Engine, legacy Direct3D: DirectX (Y−).
  • Sembra sbagliato in Unreal? Abilita Flip Green Channel nelle impostazioni di importazione.
  • Sembra sbagliato in Unity? Probabilmente hai esportato da uno strumento con convenzione DirectX — inverti il canale verde o ri-esporta.

Una volta compresa la convenzione, la correzione è banale. La parte più difficile è riconoscerla la prima volta.

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

Ti è piaciuto questo articolo?

ShareHN