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_0…TEXCOORD_nçoklu set- Materyal
textureInfo.texCoordkö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:
- Unwrap, distortion, atlaslama sanatı → Three.js · UV Mapping
- Wrap / repeat / offset runtime → Wrapping & Repeat
- TBN, MikkTSpace, handedness → Tangent Data
- Doku slotları, PBR alanları → PBR Yapısı / Texture Referansları
- Three.js
geometry.attributes.uvAPI'si → UV Mapping §5
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_0mü,_1mi).
Ç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 | 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.
| 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:
baseColor → TEXCOORD_0, occlusion →
TEXCOORD_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:
- Materyal Sistemi · PBR Yapısı hangi alanlar hangi dokuyu bekler? (PBR Yapısı)
- Texture Referansları images / textures / samplers zinciri (Texture Referansları)
- Material Slots primitive ↔ material indeksi
- Extension Sistemi variants, clearcoat vb. (ileride)
- 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.