holodepth

Three.js · Varlık · Draco

Attribute compression: 3D verinin katmanlarını sıkıştırmak

Bir önceki adımda mesh compression’ın genel mantığına değindik; fakat bir 3D model yalnızca «şekil» değildir. «Neyi sıkıştırıyoruz?» sorusunun cevabı, her köşe noktasına (vertex) bağlı attribute (öznitelik) akışlarında gizlidir — konum, yön ve doku adresi ayrı kanallardır.

Bu sayfa, sıkıştırıcının hangi tamponlara dokunduğunu somutlaştırır; önce zincirdeki yeri netleşsin, sonra katman katman derinleşelim. Tel boyutu, decode ve GPU yükü için Mesh compression · takaslar bölümü eşlik etsin.

Önce okuyun: Mesh · öznitelik kırılımı, Attributes & buffers.

Zincir: ağdan GPU’ya, öznitelik nerede oturur?

Önceki sayfada çizilen hat burada kopmamalıdır. Kaba sıra: ağ (network) sıkıştırılmış baytları taşır → istemci decode (CPU / WASM) bu baytları tekrar geometri tablolarına çevirir → sonuç WebGL / WebGPU tarafında GPU belleğine yazılır ve çizim komutları bu tamponları okur. Öznitelik sıkıştırması, telde ve decode aşamasında kazandırdığı baytla bu hattın ilk iki halkasına dokunur; açılmış tampon boyutu için GPU tampon uyarısı geçerlidir.

Three.js tarafında bu tablolar pratikte BufferGeometry içindeki BufferAttribute örnekleriyle yaşar: her öznitelik dizisi bir GPU tamponuna bağlanır, köşe başına stride ve offset ile okunur. Grafik boru hattında bunlar, vertex shader’a girdi konumu (attribute / konum bağlama) olarak gelir; ışık hesabı genelde ya burada ya da sonraki aşamada bu verilerden türetilir. Yani «öznitelik sıkıştırma» soyut bir dosya oyunu değil — doğrudan hangi sayıların VRAM’e yazılacağı ve hangi kanalların köşe başına aktığını belirler.

Bu köprüyü bellek düzeniyle pekiştirmek için Attributes & buffers sayfasına dönün; aşağıda aynı kanalların sıkıştırma matematiğine iniyoruz.

«Neyi sıkıştırıyoruz?» — verinin katmanları

Render sırasında GPU’ya giden her köşe, yalnızca üç sayı değil; Draco benzeri çözümler bu «veri çantasının» içindeki başlıca üç öznitelik akışını hedefler.

Ham bayt perspektifi (köşe başına): çoğu üretimde en büyük pay position’dadır (üç bileşen, geniş örgülerde toplam tel hacminin omurgası). İkinci sırada çoğu zaman normal gelir (yine üç bileşen veya kodlanmış eşdeğeri). uv iki bileşendir; doku adası / dikiş (seam) desenine göre toplamda hâlâ önemli olabilir ama çoğu sahnede konum+normal toplamının gerisinde kalır. Index tamponu köşe başına değil üçgen başına büyür; bağlantı sıkıştırması onu ayrı kanalda hedefler (§3).

Position (konum)

Her tepe için uzaydaki x, y, z bileşenleri. Çoğu akışta önce buradan kazanç gelir çünkü tepe sayısı büyüdükçe bayt doğrusal ölçeklenmez.

Nasıl sıkıştırılır? Yaygın yol quantization (niceleme): sürekli float değerler, seçilen bir eksende min / max aralığı içinde ölçeklenip sınırlı bit genişliğinde tam sayıya yuvarlanır. Sezgisel haritalama: her bileşen için aralık [min, max] ve bit sayısı b seçildiğinde, ölçeklenmiş değer
0 … (2b − 1) aralığındaki bir tamsayıya en yakın ızgaraya oturtulur; açarken aynı aralık ve bit sayısıyla ters dönüşüm yapılır. Bu, «grid adımı = (max − min) / (2b − 1)» fikrine denktir: b arttıkça ızgara sıkılaşır, geometrik hata küçülür, paket şişer. Draco / dışa aktarıcılar genelde bu aralığı modelin sınırlayıcı kutusu (bounding box) veya kanal başına verilen sınırlardan türetir; aralığı gereğinden geniş seçmek, aynı b ile gereksiz kaba bir ızgara demektir.

Üç eksen birbirinden bağımsız da, ortak bir kutu ile de niceleme yapılabilir; önemli olan aralık + bit derinliği çiftinin birlikte seçilmesidir. Tahmin (prediction) adımı bu tamsayıları daha da ucuz sembol dizilerine dönüştürür — Mesh · niceleme ve tahmin başlıklarıyla birleşik düşünün.

Normal (yüzey yönü)

Yüzeyin baktığı yön; aydınlatma ve gölgelenme bu vektörler üzerinden okunur.

Neden ayrı bir problem? Birim normal, matematiksel olarak iki serbest dereceye sahiptir; buna rağmen dosyada çoğu zaman üç float saklanır. Sıkıştırıcı, önce bu fazlalığı kaldırmayı hedefler.

Octahedral mapping ne yapar? Birim küre üzerindeki yönü, önce bir sekiz yüzlü (octahedron) üzerine projeksiyonla indirger, ardından o yüzeyi düzleme «açarak» iki koordinat (oct uzayı, tipik olarak kare içi) elde edersiniz. Böylece normalize edilmiş 3B vektör, kodlamada 2 kanal haline gelir; üzerine yine quantization uygulanınca, üç tam bağımsız float taşımaya göre hem tel hem niceleme hatası daha kontrollü yönetilir. Katlama çizgilerinde tür (seam) yönetimi uygulama ayrıntısıdır; sezgi: yön bilgisini önce geometrik olarak sıkıştır, sonra bite indir.

Uv (doku adresi)

İki boyutlu doku görüntüsünün 3B yüzeye u, v ile yapıştırılması. Doku dosyasının kendisi burada sıkışmaz; sıkışan geometri telindeki adres tablosudur.

Tahmin tek başına değil. Komşu köşelerde benzer UV değerleri sık görülür; prediction ile farklar (residual) küçük kalır ve entropi kodlaması ucuzlar (Mesh · tahmin). Buna ek olarak, UV’ler de çoğu akışta niceleme görür: atlas veya birim kare [0, 1] içinde (veya dışa aktarıcı seçtiyse genişletilmiş bir kutuda) min/max ile aynı ızgara mantığı uygulanır. Üçüncü güçlü etken tekrar desenleridir: aynı doku adasına binen yüzeylerde UV blokları benzer; dikişlerde ani sıçramalar olsa da, sıkıştırıcı bu alanın entropy profilini düşürmeye çalışır.

İnteraktiv laboratuvar: tek sahne, üç öznitelik modu

Aşağıdaki sahne harici model veya CDN .glb yüklemez; yüksek segmentli prosedürel küre (gürültülü yüzey), numaralı UV atlası için geniş bir düzlem ve yuvarlatılmış kutu aynı anda görünür. Konum modunda renk dünya konumundan türetilir; hafif vertex ripple niceleme sonrası yüksek frekanslı hatayı sezgisel okumayı kolaylaştırır. Normal modunda MeshStandardMaterial ile ışık + isteğe bağlı yön renk haritası (normal * 0.5 + 0.5). UV modunda numaralı ızgara dokusu, bükülme ve dikişleri daha hızlı fark ettirir. Raw / Draco düğmeleri gerçek encoder değil; Mesh compression laboratuvarı ile aynı mantıkta aynı geometri üzerinde temsil süreleri gösterilir — iki yarı split’te de aynı kare üretilir.

Öznitelik laboratuvarı · güvenli (asset yok) · Three.js r170 Hazır
Tel boyutu (etiket)
İndirme süresi
Decode
İlk çizim
Üçgen sayısı (GPU)
Öznitelik modu
Tel modu
Görünüm

Amaç: aynı prosedürel sahne üzerinde position / normal / uv kanallarının görsel okumasını ayırmak; sıkıştırıcı gerçekten çalışmaz — metrikler öğretim amaçlı temsildir. Görünüm altındaki küçük kart seçili modda neye baktığınızı hatırlatır. Split’te iki yarı aynı piksel üretir; fark üstteki süre ve boyut etiketlerindedir. Normal renk haritası yalnızca Normal modunda etkindir.

Geometri verisi: ağ nasıl örülür?

Pratikte geometri, dev bir tablo gibi düşünülür: köşe havuzu ve bağlantı listesi birlikte çalışır.

  • Vertex tamponu: Her köşe için position, normal, uv (ve varsa diğer öznitelikler) alt alta dizilir.
  • Index tamponu: Hangi köşe dizinlerinin bir üçgen oluşturduğunu söyleyen tam sayı listesidir (indexed mesh).

Connectivity compression (bağlantı sıkıştırma)

Klasik ham çıktılarda bağlantı, çoğu zaman üçgen başına üç dizin olarak tekrar tekrar yazılır; örgü kapalı ve komşuluk zenginse bu liste hem uzun hem de entropy açısından «düzensiz» görünür. Draco tarafı, komşu üçgenlerin kenar paylaşımını ve yüzey üzerinde yürüyüş sırasını kullanarak, dizinleri düz liste gibi dökmek yerine kısa komut dizileriyle aynı topolojiyi yeniden üretmeye çalışır; literatürde Edgebreaker ailesi bu fikrin bilinen örneklerindendir (uygulama sürüme göre değişir).

Neden önemli? Çünkü büyük modellerde index tamponu tek başına tel hacminin ciddi kısmı olabilir; bağlantıyı ucuzlatmak indirme süresini ve çoğu zaman decode süresini doğrudan kısaltır. Neyi azaltır? Ham dizin kelimesi sayısını değil, sıkıştırılmış bit akışında topolojiyi temsil eden sembolleri; açılmış GPU tarafındaki dizin tamponu yine üçgen sayısıyla uyumlu kalır — kazanç, tel + CPU hattındadır.

Bu detay neden önemli?

Binlerce parçalı bir CAD gövdesi veya fotogrametri ile yoğunlaştırılmış bir örgü sunuyorsanız, öznitelik sıkıştırması yapılmamış ham teslimat VRAM bütçesini hızla zorlar — GPU tampon tartışması burada somutlaşır.

İyi seçilmiş veri yapısı ve öznitelik paketleme yalnızca indirmeyi değil, aynı köşe sayısında bile bellek bant genişliği ve önbellek davranışını iyileştirerek kare stabilitesine katkı verebilir.

HoloDepth teknik notu

Bit bütçesi

Öznitelik sıkıştırmasında «magic number» gibi duran 11 / 10 / 8 değerleri, aslında §2’deki min–max + ızgara adımı denkleminin pratik kısayoludur: konuma daha fazla bit, dünya uzanımında daha ince adım demektir; UV için biraz daha az bit, atlas içinde hâlâ çoğu doku için yeterli ayrım sağlarken tel tasarrufu verir; normalde daha az bit, çünkü yön önce octahedral ile iki kanala indirgenmiştir ve aydınlatma çoğu vitrinde kısmi türev hatalarına göre daha toleranslıdır.

Bu üçlü, HoloDepth içeriklerinde başlangıç denge noktası olarak kullanılır: sahne ölçüsü büyüdükçe konuma eğilim, yakın plan ürün vizöründe UV ve teğet uzayı artırma, CAD / düşük toleranslı ölçümde tüm kanallarda kademeli yükseltme mantıklıdır. Sayılar sabit kural değil; hedef hata eşiği + ölçüm mesafesi + doku çözünürlüğü birlikte seçilir; sahneyi bir kez ölçüp quantize sonrası normal / tangent sapmalarını gözlemlemek en doğru kalibrasyondur.