Blog'a Dön
Eğitimler

Normal Map Kuralları: OpenGL vs DirectX Açıklaması

Normal map'iniz Unreal'de ters görünüyor ama Unity'de güzel çalışıyor — teğet-uzay Y ekseni kurallarının basit bir açıklaması, somut çözümlerle birlikte.

Admin23 Nisan 20263 dk okuma11

Bir normal map'i Unreal'e yerleştiriyorsunuz ve yüzey sanki güneş aşağıdan geliyormuş gibi aydınlanıyor. Aynı dosyayı Unity veya Blender'e yerleştiriyorsunuz — harika görünüyor. Mesh aynı. Doku aynı. Ne oluyor?

İki Endüstri, Bir Eksen Anlaşmazlığı

Normal map'ler RGB kanallarında bir yüzey yönünü depolayan. Kırmızı = X, yeşil = Y, mavi = Z. Her PBR engine bunları aynı şekilde çözer, bir istisna dışında: Y'nin işareti.

OpenGL kuralı (Y+): daha parlak yeşil kanal yüzeyin yukarı işaret ettiği anlamına gelir. Unity, Godot, Blender (Cycles ve Eevee), Substance Painter'ın varsayılan dışa aktarması ve her WebGL tabanlı engine tarafından kullanılır.

DirectX kuralı (Y−): daha parlak yeşil yüzeyin aşağı işaret ettiği anlamına gelir. Unreal Engine, eski Direct3D araç zinciri ve bazı CryEngine/Xbox dönemi varlıkları tarafından kullanılır.

PNG'deki aynı baytlar. Zıt fiziksel anlamlar.

Bir Bakışta Nasıl Ayırt Edilir

Normal map'inizdeki yarım küresel bir kemeri (düğme veya kubbe gibi) görüntüleyin. OpenGL kuralında, kemerin altı daha koyu yeşil olacaktır çünkü yüzey Y−'ye doğru dönüyor, ışıktan uzaklaşıyor. DirectX kuralında, alt daha parlak yeşildir.

Engine içinde aydınlatma geriye dönükmüş görünüyorsa — gölgelerin olması gereken yerlerde vurgular — bir kural uyuşmazlığınız vardır.

Düzeltme 5 Saniye Alır

Unreal'de doku içe aktarma iletişim kutusunda Flip Green Channel onay kutusu vardır. Bunu açın ve engine örnek sırasında G kanalını tersine çevirir. Kaynağınızı yeniden dışa aktarmanıza gerek yoktur.

Unity'de doku türünü Normal map olarak ayarlayın ve içe aktarıcı her şeyi ele alır — Unity OpenGL'yi bekler ama dosya yanlış görünüyorsa sizi uyarır. Blender'de Separate Color → Invert G → Combine Color düğüm zinciri kullanın veya Normal Map düğümünde doğrudan DirectX tarzı girdiyi seçin.

Neden Başında İki Standart?

1990'larda OpenGL ve DirectX zıt doku koordinat uzayları tanımladı — OpenGL'de Y yukarı doğru artıyordu, DirectX'te Y aşağı doğru artıyordu. Normal map'ler 2000'lerin ortasında yaygın hale geldiğinde, her araç zinciri kendi uzayını çıktılarına yerleştirdi. Kurulu bir işlem hattını çevirmek pahalı olduğu için ayrışma kaldı.

Karışıklık Olmadan Normal Map'ler Oluşturma

aukimi Normal Map Generator dışa aktarırken kuralı açıkça seçmenizi sağlar. Yükseklik haritanızın parlaklığında Sobel gradyanını çalıştırır, ardından (−dx·s, −dy·s, 1) RGB'ye paketler — DirectX'i seçtiğinizde Y çevrilir. Kuralı oluşturduktan sonra değiştirebilir ve hiçbir şey yeniden yüklemeden yeniden indirebilirsiniz.

Dahili olarak formül aynıdır. Tek fark, yeşil kanal yazılmadan önce Y bileşenine uyguladığımız işarettir. Bunu bildiğinizde, herhangi bir görüntü düzenleyici ile bir dosyayı kurallar arasında dönüştürebilirsiniz: PNG'yi açın, yeşil kanalı seçin, tersine çevirin, kaydedin. Unreal'de "Flip Green Channel"in yaptığı şey budur.

Hızlı Referans

  • Unity, Godot, Blender, Substance Painter (varsayılan): OpenGL (Y+).
  • Unreal Engine, eski Direct3D: DirectX (Y−).
  • Unreal'de yanlış görünüyor? İçe aktarma ayarlarında Flip Green Channel'ı etkinleştirin.
  • Unity'de yanlış görünüyor? DirectX kuralı bir araçtan muhtemelen dışa aktardınız — yeşil kanalı tersine çevirin veya yeniden dışa aktarın.

Kuralı özümsedikten sonra düzeltme önemsizdir. En zor kısım ilk kez fark etmektir.

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

Bu makaleyi beğendiniz mi?

ShareHN