holodepth

3D Model Formatları · glTF / GLB · Geometri Verileri

UV Kanalları glTF Yapısında TEXCOORD_n Nedir?

Doku «kaymış» veya lightmap yanlış yüzeye basıyorsa sorun çoğu zaman PNG'de değil; yanlış TEXCOORD kanalındadır. Tangent Data teğet çerçevesini kapattı; bu sayfa beşinci soruya geçer: texel hangi adres tablosundan örneklenir?

Holodepth geometri hattında soru zinciri tamamlanır: nerede? (POSITION) · nasıl bağlanıyor? (indices) · hangi yöne bakıyor? (NORMAL) · teğet uzayı? (TANGENT) · doku adresi? (TEXCOORD_n). UV, yüzeyin boyası veya unwrap sanatı değildir; formatta vertex başına örnekleme koordinatıdır. Aynı mesh birden fazla adres tablosu taşıyabilir; materyal hangi tablonun kullanılacağını seçer.

Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «glTF'de UV, TEXCOORD_0, TEXCOORD_1 … semantic'leriyle saklanır; materyaldeki texCoord alanı bu indeksle bağlanır. Aynı pozisyon iki farklı UV adresi taşıyorsa vertex çoğaltılır; kanal uyuşmazlığı sessiz yanlış doku üretir.»

Bu sayfanın sınırı · komşu konularla ayrım

Bu sayfa yalnızca glTF TEXCOORD_n semantic attribute'unu ve kanal sözleşmesini anlatır:

  • UV = örnekleme adresi (format katmanı)
  • TEXCOORD_0TEXCOORD_n çoklu set
  • Materyal textureInfo.texCoord köprüsü
  • Eksik kanal, seam split, GPU hattı
  • UV'den sonra Materyal Sistemi yol haritası

Bilinçli olarak dışarıda bırakılan konular:

Kısa ayrım: UV Kanalları (Format) «dosyada hangi adres tablosu var?» · UV Mapping (Runtime / sanat) «yüzey nasıl açılır, texel yoğunluğu nasıl dağıtılır?» · Tangent Data «adres gradyanı yüzeyde hangi yöne projekte edilir?»

Geometri hattı beşinci soru

Katman Semantic Soru Sayfa
Konum POSITION Bu nokta nerede? Vertex Data
Topoloji indices Köşeler nasıl bağlanıyor? Index Buffer
Makro yön NORMAL Yüzey hangi yöne bakıyor? Normal Data
Teğet çerçevesi TANGENT Doku U ekseni yüzeyde hangi yöne uzanıyor? Tangent Data
Doku adresi TEXCOORD_n Texel nereden örneklenir? UV Kanalları (bu sayfa)

UV Nedir? (Format dilinde)

Zihin modeli: postanın «adres» satırı

  • POSITION binanın konumu (nerede duruyor).
  • TEXCOORD postanın gideceği daire numarası (hangi texel).
  • Materyal / texture zarfın içeriği (hangi görüntü).
  • Kanal indeksi hangi adres defterinin kullanılacağı (TEXCOORD_0 mü, _1 mi).

Çoğu giriş yazısı UV'yi «doku haritası» diye anlatır; sanatçı dilinde doğru, format dilinde eksik. glTF dosyasında UV, vertex başına iki kayan noktalı sayıdır: tipik olarak (u, v). Shader bu çifti sampler'a verir; sampler doku belleğinden renk döner. Adres doğru, görüntü yanlışsa sorun dokudadır; görüntü doğru, adres yanlışsa sorun TEXCOORD tablosundadır.

UV şunların hiçbiri değildir:

  • Unwrap sanatı değil island düzeni, distortion ve packing UV Mapping sayfasındadır
  • Tangent değil adres gradyanının yüzey yönü Tangent Data'dadır
  • Doku dosyası değil PNG/KTX2 içerik; UV yalnızca örnekleme anahtarıdır
  • Materyal slotu değil hangi PBR alanının hangi dokuyu kullandığı Materyal Sistemi dalındadır

POSITION yüzeyi uzayda yerleştirir. TEXCOORD aynı yüzeyin doku uzayındaki «posta kodunu» taşır. İkisi aynı vertex sırasına paralel akar; biri diğerinin yerine geçmez.

glTF'de TEXCOORD_n semantic'i

Primitive attributes haritasında UV, sabit bir «UV» anahtarıyla değil numaralı semantic ile yazılır: TEXCOORD_0, TEXCOORD_1, … Değer bir accessor indeksidir; accessor tipi tipik olarak VEC2, bileşen tipi float (veya normalize edilmiş tamsayı)dır. Accessor «nasıl oku», BufferView «nereden oku» der; bu sayfa semantic adını ve kanal anlamını sabitler.

"attributes": {
  "POSITION": 0,
  "NORMAL": 1,
  "TANGENT": 2,
  "TEXCOORD_0": 3,
  "TEXCOORD_1": 4
}

TEXCOORD_0 ekosistemde varsayılan «birincil» settir: albedo, normal map ve çoğu PBR dokusu buraya bağlanır. TEXCOORD_1 ve sonrası ikinci (üçüncü…) adres defteridir: lightmap, AO overlay, detail mask gibi farklı amaçlı örneklemeler için. İkinci set «daha iyi UV» değildir; farklı bir sözleşmedir.

0..1 ve ötesi

Spec ve araçlar UV'yi çoğu zaman birim karede düşünür: [0, 1] aralığı bir doku kopyasını kapsar. Değerler 1'in dışına çıktığında tile / wrap davranışı runtime sampler ayarına bağlıdır; format tarafında «yasak» değildir. Bake hatalarında ise 0..1 dışına taşma «yanlış unwrap» sinyali olabilir. Holodepth ayrımı: bilinçli tiling ile dikiş kaçması aynı sayı aralığında görünebilir; niyeti materyal/sampler ve DCC pipeline ayırır, bu sayfa yalnızca adres tablosunu okur.

Köprü: textureInfo.texCoord

Geometri kanalı tek başına «bu dokuyu kullan» demez. Materyal kaydındaki textureInfo nesnesi index (hangi texture) ve isteğe bağlı texCoord (hangi UV seti) taşır. texCoord varsayılanı 0'dır: yani TEXCOORD_0. Lightmap için texCoord: 1 yazıldığında loader TEXCOORD_1 attribute'unu bekler.

"baseColorTexture": {
  "index": 0,
  "texCoord": 0
},
"occlusionTexture": {
  "index": 2,
  "texCoord": 1
}

Bu köprü Holodepth'in kritik format içgörüsüdür: yanlış doku çoğu zaman yanlış dosya değil, yanlış kanal indeksidir. Geometride TEXCOORD_1 yokken materyal texCoord: 1 isterse sonuç motorlara göre sessiz düşüş (TEXCOORD_0'a fallback) veya hata olabilir; her iki durumda da «PNG bozuk» sanılır.

Texture binding ve material mapping'in runtime hikâyesi Texture binding / Material mapping sayfalarındadır. Burada yalnızca indeks dilinin geometri tarafı sabitlenir.

Neden birden fazla UV seti?

Tek set her işe yetmez çünkü adresleme ihtiyaçları çatışır. Albedo için overlapping UV (aynı adrese birden fazla yüz) bellek tasarrufu sağlar; lightmap için overlapping yasaktır: iki yüzey aynı bake texel'ini paylaşırsa gölge bozulur. Bu yüzden tipik pipeline:

  • TEXCOORD_0 — albedo / normal / roughness (sanat seti; overlapping serbest olabilir)
  • TEXCOORD_1 — lightmap / AO bake (unique unwrap; overlapping yok)
  • TEXCOORD_2+ — detail, decal mask, özel shader sözleşmesi
Kanal amacı (format sözleşmesi özeti)
Kanal Tipik amaç Overlapping?
TEXCOORD_0 PBR / albedo hattı Sıkça evet (atlas)
TEXCOORD_1 Lightmap / baked lighting Hayır (unique)
TEXCOORD_n (n≥2) Detail / mask / özel Sözleşmeye bağlı

Holodepth vurgusu: ikinci set «yedek UV» değildir. Export aracının «Generate UV2» düğmesi, dosyaya ikinci bir TEXCOORD tablosu ve genelde materyalde texCoord: 1 beklentisi ekler. Geometri hattında bu, vertex attribute sayısını ve bellek hacmini artırır; Index Buffer paylaşımı aynı kalsa bile UV split vertex çoğaltmasını tetikleyebilir (§7).

Ne zaman zorunlu, ne zaman eksik?

glTF core'da POSITION zorunludur; TEXCOORD_* zorunlu değildir. Renksiz / dokusuz mesh (yalnızca vertex renk veya düz materyal) UV taşımadan geçerli olabilir. Doku kullanan materyal ise ilgili texCoord indeksinde attribute bekler.

UV ihtiyacı pratik matris
Senaryo TEXCOORD_0 Not
Dokusuz / düz renk Opsiyonel Attribute şişirmeyin
PBR baseColorTexture Gerekli (veya texCoord'un işaret ettiği set) Varsayılan kanal 0
Normal map Gerekli + genelde TANGENT Tangent · zorunluluk
Lightmap İkinci set TEXCOORD_1 + materyal texCoord: 1
MikkTSpace tangent üretimi Gerekli UV yoksa TBN üretilemez

Eksik UV ile «siyah / pembe / kaymış» doku semptomu aynı görünebilir. Debug sırası: materyalde texture var mı → texCoord kaç → geometride o TEXCOORD_n var mı → accessor count vertex sayısıyla uyumlu mu. Bu sıra Three.js API çağrısından önce format dosyasında biter.

Seam, split ve indeks maliyeti

GPU'da bir vertex satırı, attribute'ların birleşimidir. Aynı dünya konumu iki farklı UV adresi taşıyorsa (dikiş kenarı, hard edge, lightmap unique sınır) satır çoğaltılır. Index Buffer aynı üçgen topolojisini yazmaya devam eder; fakat POSITION tablosu uzar. Bu maliyet Index Buffer sayfasındaki «paylaşım» hikâyesinin UV yüzüdür: indeks tasarrufu, attribute çatışmasında sınırlanır.

Tangent Data UV seam'i TBN tutarlılığı için işledi; burada aynı seam adres süreksizliği olarak okunur. Unwrap «nasıl kesilir» sorusu UV Mapping'dedir; format sorusu şudur: kesim yerinde vertex satırı kaç kopyaya bölündü?

Sıfır alanlı UV üçgeni

Üç köşenin UV'si aynı noktaya veya bir çizgiye çökerse doku gradyanı sıfırlanır. Normal map için MikkTSpace / türev TBN bozulur; albedo «gerilmiş bir nokta» gibi görünür. Holodepth notu: bu bir sanat hatası gibi dursa da dosyada geçerli float değerler olarak durabilir; validator her zaman yakalamaz. Geometri hattında «TEXCOORD var» ile «TEXCOORD anlamlı» farklıdır.

GPU açısından TEXCOORD

Okuma hattı diğer attribute'larla aynı omurgayı kullanır; semantic farkı «ne işe yaradığı»ndadır:

mesh.primitive.attributes.TEXCOORD_n
  → accessors[i] (VEC2 · count = vertex sayısı)
    → bufferView dilimi
      → GPU attribute (vec2 uv)
        → fragment: texture(sampler, uv)  // veya uv1, uv2…

Vertex shader UV'yi çoğunlukla olduğu gibi geçirir (veya atlas scale/offset ile dönüştürür). Fragment aşamasında birden fazla sampler farklı kanallardan beslenebilir: baseColorTEXCOORD_0, occlusionTEXCOORD_1. Format dosyası bu eşlemeyi attribute + textureInfo ile kurar; GPU yalnızca vektörleri taşır.

Bellek notu: her ek TEXCOORD seti vertex başına en az 8 bayt (2×float) ekler; 50k vertex × 2 set ≈ 0.8 MB yalnızca UV. «Bir set daha ekle» kararı dosya boyutu ve upload maliyeti taşır; Web İçin Kullanım dalındaki boyut analizine bağlanır, burada yalnızca geometri maliyetini işaret ederiz.

Holodepth perspektifleri çoğu dokümanda olmayan açılar

Standart anlatım «UV 0..1'dir, TEXCOORD_0 birincildir» ile biter. Aşağıdaki başlıklar üretim ve debug'da sık, fakat az sayfada derin işlenen konulardır.

Kanal uyuşmazlığı tuzağı

Materyal texCoord: 1 ister; geometride yalnızca TEXCOORD_0 vardır. Bazı loader'lar sessizce 0'a düşer: lightmap albedo UV'sinde «yanlış ama tanıdık» görünür. Holodepth kuralı: semptom «kaymış bake» ise önce kanal indeksini doğrulayın, sonra bake'i yeniden almayın.

Aynı mesh, iki sözleşme

TEXCOORD_0 overlapping atlas, TEXCOORD_1 unique lightmap: aynı üçgen iki farklı «posta sistemi» kullanır. Sanatçı tek unwrap görür; format iki tablo görür. Karışıklık, ikinci seti silip «neden gölge bozuldu?» diye sormaktan doğar.

Skinning altında UV sabittir

Kemik animasyonunda POSITION (ve genelde NORMAL/TANGENT) dönüşür; UV çoğu pipeline'da değişmez. Doku yüzeye «yapışık» kalır çünkü adres kemikle hareket etmez. UV'nin kayması beklenen bir skinning yan etkisi değildir; görürseniz yanlış attribute stream veya morph/UV animasyonu extension'ı arayın.

Normalize edilmiş tamsayı UV

Accessor float yerine normalize UNSIGNED_SHORT ile UV taşıyabilir: boyut küçülür, hassasiyet düşer. İnce seam'lerde banding veya lightmap sızıntısı bu yoldan gelebilir. Format okuyucusu «VEC2 var» demekle yetinmez; componentType ve normalized bayrağını da okur (Accessor).

«UV2 daha iyi UV» yanılgısı

İkinci kanal otomatik olarak daha temiz unwrap demek değildir. Amaç farklıdır: lightmap unique, albedo overlapping. Kaliteyi kanal numarasıyla değil, o kanalın sözleşmesiyle ölçün.

Aynalanmış UV ve tangent bağı

Simetri için aynalanmış UV, tangent handedness'i bozabilir. Bu sayfa adresi anlatır; ayna etkisinin TBN yüzü Tangent · mirror UV altındadır. İkisini aynı «UV bozuk» kutusuna atmayın.

Holodepth içgörüsü

Doku debug'unda önce PNG'ye değil kanal sözleşmesine bakın: hangi TEXCOORD_n var, materyal texCoord kaç, count uyumlu mu, seam'de split var mı, ikinci set overlapping mi? Bu beş soru çoğu «kaymış / yırtık / yanlış bake» vakasını kapatır.

UV'den sonra: geometri hattı kapanır, materyal dalı açılır

TEXCOORD_n ile Holodepth Geometri Verileri omurgasının çekirdek soruları tamamlanır. Sonraki büyük dal Materyal Sistemi'dir: PBR yapısı, texture referansları, material slots, extension'lar. Format okuyucusu özeti:

  1. Materyal Sistemi · PBR Yapısı hangi alanlar hangi dokuyu bekler? (PBR Yapısı)
  2. Texture Referansları images / textures / samplers zinciri (Texture Referansları)
  3. Material Slots primitive ↔ material indeksi
  4. Extension Sistemi variants, clearcoat vb. (ileride)
  5. Opsiyonel geometry semantic'leri COLOR_0, joints / weights (animasyon dalı)

Format okuyucusu özeti: POSITION → indices → NORMAL → TANGENT → TEXCOORD → materyal & doku. UV, «mikro yön» ile «görüntü içeriği» arasındaki adrestir; içeriğin kendisi değildir.