Tipik UV haritalaması afin dönüşüm olarak adlandırılan şeydir . Bu, 3D alan ve doku alanı arasındaki her üçgenin eşleşmesinin rotasyon, çeviri, ölçeklendirme / squash ve eğrilmeyi (yani homojen bir matris çarpımı ile yapabileceğimiz her şeyi) içerebileceği anlamına gelir.
Afin dönüşümlerle ilgili olan şey , tüm alan adlarında tek biçimli olmalarıdır - A köşesi yakınındaki dokuya uyguladığımız rotasyon, çeviri, ölçek ve eğim, herhangi bir üçgen içinde B köşesine yakın uyguladığımızla aynıdır. Bir boşlukta paralel olan çizgiler diğerinde paralel çizgilerle eşleştirilir, asla yakınsama / ayrılma olmaz.
Ancak uygulamaya çalıştığınız kademeli koniklik düzgün değildir - dokudaki paralel çizgileri kafes üzerindeki yakınsak çizgilere eşler. Bu, şeridi aşağı doğru hareket ettirdikçe bant boyunca ölçülen doku ölçeğinin sürekli değiştiği anlamına gelir. Bu, 2D UV eşlemenin afin dönüşümlerinin doğru bir şekilde temsil edebileceğinden daha fazlasıdır: bitişik köşeler arasında enterpolasyonlu 2D uv koordinatları, tüm kenar boyunca bir tutarlı ölçek elde eder, hatta şerit aşağı doğru ilerledikçe ölçek küçülmesi gereken çapraz kenar. Bu uyuşuk zikzak yaratan şey bu uyumsuzluktur.
Bu sorun, bir dikdörtgeni yamuk - paralel taraflarla yakın taraflara eşlemek istediğimiz zaman ortaya çıkıyor: Bunu yapan sadece afin dönüşüm yok, bu yüzden parçalı olarak yaklaşık dikişler yapmalıyız ve görünür dikişlere yol açmalıyız.
Çoğu amaç için daha fazla geometri ekleyerek efekti en aza indirebilirsiniz. Şeridin uzunluğu boyunca alt bölümlerin sayısını arttırmak ve şeridi genişliği bir balıksırtı deseninde düzenlenmiş üçgenlerin köşegenleri ile iki veya daha fazla parçaya bölmek, etkiyi daha az fark edilir hale getirebilir. Afin dönüşümleri kullandığımız sürece her zaman bir dereceye kadar mevcut olacaktır.
Ama etrafında bir yol var. Biz perspektif verilen dikdörtgen duvarlar ve zeminler yamuklarını çizmek render biz 3D için kullanmak aynı numarayı kullanabilirsiniz: Kullandığımız yansıtmalı koordinatları !
Afin dokular:
Projektif tekstüre etme:
Bunu yapmak için üçüncü bir uv koordinatı (uvw) eklememiz ve gölgelendiricilerimizi değiştirmemiz gerekir.
Her bir noktada bir ölçek faktörü göz önüne alındığında (örneğin, o noktadaki şeridinizin genişliğine eşit), 3D projektif uvw koordinatını normal 2D uv koordinatınızdan şu şekilde oluşturabilirsiniz:
Vector3 uv3 = ((Vector3)uv2) * scale;
uv3.z = scale;
Bu 3B uvw koordinatlarını ağınıza uygulamak için Vector3 aşırı yük Mesh'i kullanmanız gerekir. SetUV'ler (int kanal, Liste uvs)
Ayrıca, 3B doku koordinatı (burada varsayılan ışıksız gölgelendirici kullanılarak gösterilmiştir) beklemek için gölgelendiricinizin giriş yapısını değiştirdiğinizden emin olun:
struct appdata
{
float4 vertex : POSITION;
float3 uv : TEXCOORD0; // Change float2 to float 3.
};
// Also do this for the uv sent from the vertex shader to the fragment shader.
Ayrıca bir 2D uv beklediğinden köşe gölgeleyicisinde TRANSFORM_TEX makrosunu kesmeniz gerekir:
// o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = v.uv;
// If you define a float4 with the special name _MainTex_ST,
// you can get the same effect the macro had by doing this:
o.uv.xy = o.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
Son olarak, doku örneklemesi için bir 2B doku koordinatına geri dönmek için, sadece parça gölgelendiricinizdeki üçüncü koordinatla bölünürsünüz :
float2 uv = i.uv.xy / i.uv.z;
Bu 3B uvw koordinatını aynı sayı ile çarparak istenen 2D koordinatımızdan yaptığımız için, iki işlem iptal edilir ve istenen orijinal 2D koordinatımıza geri döneriz, ancak şimdi köşeler arasında doğrusal olmayan enterpolasyonla. : D
Bu bölmeyi köşe gölgeleyicisinde değil, parça başına yapmak önemlidir. Köşe başına yapılırsa, sonuçta ortaya çıkan koordinatları her kenar boyunca doğrusal olarak enterpolasyona geri döndürüyoruz ve projektif koordinatla tanıtmaya çalıştığımız doğrusal olmayanlığı kaybettik!
id
vecount
? Ne yaparUVs.ToArray()
? Köşeleri ve doku koordinatlarını karta nasıl yüklüyorsunuz?