Normal haritalama gerçekten nasıl çalışır?


10

Normal harita kavramını anlamaya çalışıyorum, ancak birkaç şeyle kafam karıştı. Kısacası, normal bir haritanın bakış açısına bağlı olup olmadığından emin değilim (yani etrafında döndüğünüzde aynı nesnenin farklı bir normal haritasını alıp alamayacağınız). İkincisi, normal haritalarda mavimsi rengin neden baskın renk olduğunu anlamıyorum .

Normalleri ve RGB renklerle ilişkilerini nasıl düşündüğüm aşağıdaki gibidir. Birim küre mümkün olan herhangi bir birimi temsil eder - diğer bir deyişle, birim normal vektörün X, Y ve Z bileşenleri -1 ile 1 arasında değişir. RGB renginin bileşenlerinin tümü 0 ile 255 arasında değişir. Bu nedenle, mantıklı -1 (normal bileşen) ile 0 (renk bileşeni), 0 ila 127 veya 128 ve 1 ila 255 arasında eşleştirilir. Aradaki herhangi bir değer yalnızca doğrusal olarak enterpole edilir.

Bu eşlemeyi rastgele bir 3B nesnenin normlarına uygulamak, ağırlıklı olarak mavi değil, çok renkli bir resimle sonuçlanır. Örneğin, bir küp alırken, altı yüzün hepsi farklı, ancak tek tip bir renge sahip olacaktır. Örneğin, normal (1,0,0) olan yüz (255,128,128), normal (0,0, -1) olan yüz (128,128,0) ve benzeri olur.

Bununla birlikte, bir nedenden dolayı bulduğum bir küpün normal haritaları tamamen mavimsi, yani (128,128,255). Fakat açıkça, normallerin hepsi pozitif z yönünde değil, yani (0,0,1). Bu nasıl çalışıyor?

[Düzenle]

Tamam, bu yüzden yukarıda açıklanan yaklaşım, nesne uzay normal haritası veya dünya uzay normal haritası olarak adlandırılmaktadır . Diğerine teğet uzay normal haritası denir . Böyle bir teğet uzay normal haritasının bir geometrinin normallerini değiştirmek için nasıl kullanılabileceğini anlıyorum, ancak aslında nasıl hesaplandığından hala emin değilim (Nicol Bolas'ın cevabındaki yorumuma bakın).

[Düzenle 2]

Muhtemelen parçalı parametrik yüzeylerle çalıştığımı belirtmeliyim. Bu yüzeyler , her yamanın kendi parametrik alanı (u, v) = [0,1] x [0,1] ile ilişkili olduğu bir dizi yüzey yamasından oluşur . Yüzeydeki herhangi bir noktada, normal tam olarak hesaplanabilir. Görünüşe göre, teğet boşluğunu uzatmak için gerekli olan T ( teğet ) ve B ( iki-teğet ) vektörleri, sadece yüzey yamasının u ve v yönünde kısmi türevleri değildir ...


Hiç phong veya en azından yaygın gölgeleme uygulamaya çalıştınız mı? A, b birim vektörleri için dot (a, b) = cos (açı (a, b)) gibi temel formülleri biliyor musunuz? Birkaç saat uygulama sizi yıllarca süren mücadeleden kurtaracaktır.
Ivan Kuckir

@Ailurus: arazi nesneleri / yükseklik alanları için aynı soruna nasıl yaklaşacağım hakkındaki yorum / cevabımı görün. Diğer nesneler için biraz daha karmaşık hale gelir, ancak kavramlar farklı olmamalıdır.
teodron

Arazi normal haritalaması örneği: gamedev.stackexchange.com/questions/43894/…
teodron

Yanıtlar:


14

Doku eşleme, 3B yüzeydeki noktalar ile doku görüntüsü üzerindeki karşılık gelen noktaları arasındaki eşlemedir. 1: 1 doku eşlemeniz varsa, 3B yüzeydeki her nokta doku görüntüsünde belirli ve benzersiz bir noktaya eşlenir (bunun tersi doğru olması gerekmeyecektir.) Dokudaki bazı konumların konumlarla eşleşmesi gerekmez yüzeyin üzerinde).

Böyle bir eşleme ile 3B yüzeyden geçebilir ve her bir farklı normali dokudaki ilgili konumda saklayabilirsiniz.

Tamam, hadi yapalım. 3B bir yüzeyden geçeceğiz ve eşlenen yerleri normal olarak nesne-uzay normalleri üreteceğiz ve sonra dokuya yapıştıracağız. Bu yüzden render etmek istediğimizde, nesne uzayını dokudan normal bir şekilde alıyoruz ve işimiz bitti. Sağ?

Evet, bu işe yarar. Ancak aynı zamanda doku normallerinin sadece bu belirli nesne ile kullanılabileceği anlamına gelir. Ayrıca, dokunun normalleri yalnızca bu nesne ve belirli doku eşlemesi ile kullanılabilir . Dolayısıyla, doku eşlemesini bir şekilde döndürmek veya biraz UV dönüşümü ile değiştirmek isterseniz, şansınız kalmaz.

Genelde insanların kullandığı normal haritaların "teğet-uzayda" olduğu normal haritalardır. Teğet boşluk, değiştirilmemiş normalin + Z yönünde olduğu 3B yüzeydeki eşlenen noktaya göre olan boşluktur ve X ve Y eksenleri, yüzeye göre U ve V eksenleri boyunca işaret eder.

Teğet uzay esas olarak normalleri düzenler. Teğet uzayında, normal (0, 0, 1) her zaman "değiştirilmemiş" anlamına gelir; tepe noktasını normalleştirmekten normaldir. Bu , yapabileceğiniz bazı yararlı şeylere yol açar , en önemlilerinden biri daha az veriye depolamaktır.

Z her zaman pozitif olacağından, gölgelendiricinizde X ve Y bileşenlerinden hesaplayabilirsiniz. Yalnızca 2 değere ihtiyacınız olduğundan, ( OpenGL görüntü biçimi adlandırmasında ) GL_RG8, piksel başına GL_RGBA84 bayt yerine piksel başına 2 bayt biçimini kullanabilirsiniz ( piksel başına 4 bayt GL_RGB8olacaktır) GPU'lar her pikseli 4 bayta sığdıracağından). Daha da iyisi, bu iki değeri sıkıştırarak piksel başına 1 bayt biçimine yol açabilirsiniz. Böylece, doku boyutunuzu nesne alanı normal haritasının% 75'ine düşürdünüz.

Herhangi bir normal harita hakkında konuşmadan önce, nelerin saklandığını bilmeniz gerekir . Nesne-uzay normal haritası, teğet-uzay normal haritası veya başka bir şey mi?


Pekala, tanımladığınız ilk harita türü normal bir nesne-alanı haritası , değil mi? Bu daha renkli olanıdır, çünkü normalin gerçek X, Y ve Z bileşenlerini saklar. İkinci tip olan teğet-boşluk normal haritası , normallerin kendisinden ziyade normallere olan düzensizlikler gibi bir şey saklıyor gibi görünüyor. Teğet alan kavramını okuyacağım ve daha sonra tekrar kontrol edeceğim.
Ailurus

Tamam, yani yüzeydeki bir noktanın teğet alanı o noktanın tüm teğet vektörlerinin alanıdır. Ancak, bu durumda, teğet boşluktan görülen normalin (0,0,1) 'den başka bir şey olabileceğini görmüyorum? Başka bir deyişle, her zaman normal haritanın muntazam mavi olmasını beklerdim (128,128,255). Yine de, wikipedia sayfasında gösterilen örnek ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) başka renkler de içerir. Bu haritanın normalleri değiştirmek için nasıl kullanılabileceğini anlıyorum, ancak gerçekte nasıl hesaplandığını değil.
Ailurus

@Ailurus: " Tamam, yani yüzeydeki bir noktanın teğet alanı, o noktanın tüm teğet vektörlerinin alanıdır. " Hayır, öyle değil. Bu, (değiştirilmemiş) normal ile tanımlanan boşluktur ve doku yönü, yüzeydeki o noktada koordinat yapar. Doku içinde depolanan normali, doku eşlemesine göre düzenler ve modifikasyonlardan önceki akım normalini düzenler.
Nicol Bolas

Muhtemelen normal bir haritanın en zor kısmı haritanın kendisidir (teğet vektörlerin nasıl hesaplanacağı dahil). Teğet vektörlerin hesaplanması, dağınık dokunun UV eşlemesine / sarılmasına VE nesnenin geometrisine tamamen bağlı değil midir? Başka bir deyişle: bir nesne için iki farklı normal haritanız var, ancak yalnızca bir tanjant (ve normal) alan hesaplandı. Teğet alanını iki farklı normal doku ile tutarlı bir şekilde kullanamayacağınızı öğrenebilirsiniz (geometrik olarak, önemsiz bir görev olmayan uygun uv haritalarını bulabilirsiniz).
teodron

@NicolBolas Ah, kafam karıştı çünkü bazı kaynaklar T, B ve N vektörlerinin ortonormal bir temel oluşturduğunu iddia ederken, diğerleri bunun mutlaka doğru olmadığını söylüyor.
Ailurus

3

Normal haritalar, esasen modelin doku alanına dayalı bir yerel alan olan teğet boşluk kullanılarak eşlenir. Bu, her iki sorunuzu da cevaplamalıdır.

Bakış açısına bağlı değildir, çünkü bu alanın kamera ile ilgisi yoktur. Normal haritada Z yukarı yönü gösterir. Bir modelin normallerine bakarsanız, normal vektörlerin çoğu doğrudan ağdan işaret eder. Ağın yüzeyi, bahsettiğim doku alanıdır, bu nedenle yerel koordinat sisteminde yukarı doğru "dışa doğru" yönü vardır.


Bunu açıkladığınız için teşekkürler! Bununla birlikte, yüzey olarak çokgen bir kafes değil, parçalı pürüzsüz bir parametrik yüzey kullanıyorum . Bu nedenle, tüm normaller (0,0,1) yönünü gösterecek şekilde kaydedilir, değil mi?
Ailurus

1

Bu sayfada aşağı kaydır

Veri kümeleri altında sağ taraftaki S / B çizimine bakın - bu (veya en azından eskiden) kirpi çizimi olarak bilinir, her biri normal olan bir yüzeyin oluşturulması

Geleneksel bir normal haritayı anlamak için, tüm dikenleri çıkmış olan üzgün bir kirpi düşünün - bu dikenlerin her biri altındaki kirpi yüzeyine normaldir -

Küre sorunuzla ilgili olarak, ışın izleyicilerinde olduğu gibi tamamen parametrik alanda yaşıyorsanız, o zaman küre için sonsuz normaller kümesi daha büyük bir küre yaratacaktır - yani mozaikli alanda, yani bilgisayarın bize zorladığı dünyada gerçek zamanlı istiyoruz, o zaman bir kürenin dikenli bir yaklaşımına sahipsiniz.

Şimdi, bu örnek bir OBJECT normal haritasına odaklandı - nesneye göre normalleri tanımlıyor ve bu, nesnenin veya kameranın veya başka bir şeyin herhangi bir dönüşü, çevirisi veya ölçeklendirmesi altında değişmez - daha önce belirtildiği gibi, bu sadece bir tür normal harita ama en yaygın olanı


0

Bence normal haritaların ne olduğu konusunda bazı yanılgılarınız olabilir. Temel olarak, aslında geometri tamamen düz olduğunda engebeli bir şeyin görünümünü simüle etmenin bir yoludur.

Normal bir haritanın renkleri bir teknoloji gölgelendiricisi tarafından yorumlanır ve ışık yoğunluğuna ve yönüne ve ayrıca kamera görünümünüze göre işlenir. Bu, örneğin tamamen düz, düz bir dokuya sahip bir tuğla zemine sahip olabileceğiniz anlamına gelir, ancak aynı tuğla şekline sahip normal bir haritaya sahip olduğu için, etrafına baktığınızda ışık yandan sekiyor gibi görünecektir tuğladan daha fazla 3D görünmesini sağlıyor.

Bu elbette sadece bir yanılsamadır, ancak karmaşık geometriye sahip olmaktan çok daha ucuzdur. Ve hayır, normal haritanın renkleri değişmiyor. Gerçekten sadece gölgelendiricide karşılaştırılacak değerleri temsil ederler. Eminim buradaki biri sizi daha ayrıntılı bir şekilde doldurabilir.


Biliyorum, ama yine de cevabın için teşekkürler :)
Ailurus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.