EnglishРусскийTürkçeDeutschFrançais Hakkında · RSS
WebInterface.org
WebInterface.org

Çizim, baskı, fotoğraf ve bilgisayarla yapılan resimler üzerine notlar.

Ana sayfa · Üç boyutlu grafik · Paketlenmiş dönüşteki kesirli bitler

Paketlenmiş dönüşteki kesirli bitler

Birim kuaterniyon, kareleri toplamı bir olan dört sayıdan oluşur. Ken Shoemake bu sayıları dönüşleri saklamak ve aralarında interpolasyon yapmak amacıyla 1985 yılında bilgisayar grafiğine getirdi ve bugün bir dönüşün saklanması gereken her yerde kullanılıyorlar. Animasyonlu bir iskelet, her anahtar kare içindeki her eklem için bir kuaterniyon saklar. Bir mesh, normal haritalama için her köşenin teğet çerçevesini bir kuaterniyon olarak saklayabilir. Gaussian splatting ile oluşturulan bir sahnede milyonlarca Gauss'un her birine bir yönelim verilir ve bu da bir kuaterniyondur. Bu programları yavaşlatan şey aritmetikten çok bellek ve bant genişliğidir. Bir dönüşten tasarruf edilen bir bayt, milyonlarca kez tasarruf edilmiş olur.

Bu dört sayı birbirinden bağımsız değildir. Üçü bilindiğinde dördüncüsünün işareti hariç değeri belirlenmiş olur. Bu yüzden bir sıkıştırıcı üç sayıyı ve dördüncünün nasıl yeniden kurulacağını söyleyen, harita adı verilen küçük bir indeksi saklar. En yaygın yöntem en küçük üç sayı yöntemidir: mutlak değeri en büyük olan bileşen atılır ve hangisi olduğu ile işareti kaydedilir. ozz-animation bu şekilde çalışır ve glTF uzantısı EXT_meshopt_compression ile SPZ ve SOG splat formatları da aynı prensibi uygular.

Ekim 2026 tarihinde arXiv'de yayımlanan Compression of Uniformly Distributed Unit Quaternions adlı makalede Coburg Uygulamalı Bilimler ve Sanatlar Üniversitesi ile AMD'den Carsten Faber, Bastian Kuth, Rinaldo Schuster, Daniel Pauls ve Quirin Meyer bunun yerine en büyük bileşene bölerler. Bu, dönüşü dört boyutlu bir küpün yüzeyine yerleştirir. a = 0,373964 değerine sahip olan a·x3 + (1 − a)·x şeklindeki kübik bükme, örnekleri basit bir küpün sağlayacağından daha eşit bir şekilde dağıtır. Araştırmacılar bu sonuca ℓ∞cub adını verirler. Burada adı küp kodeki. En büyük bileşen için dört farklı seçenek ile iki işaretin birleşimi sekiz harita eder ve sekiz harita üç bite sığar.

Üçe bölünmeyecek bitler

Böyle bir dönüşü 32 bitlik bir sözcükte saklayalım. Harita üç bit kaplar ve üç sayı için 29 bit kalır, yani sayı başına yaklaşık 9,67 bit. Bit alanları tam bitlerle çalışır. Her sayı 9 bit alır, bu da 512 seviye anlamına gelir ve sözcüğün iki biti boş kalır. Diğer çözüm bir sayıya 10 bit verip diğerlerine daha az vermektir. O zaman dönüşün bir ekseni diğerlerinden daha hassas saklanır.

Makale, sözcüğü her basamağın kendi tabanı olduğu karma tabanlı bir sayı sisteminde tek bir tamsayı olarak paketler. Harita, 8 tabanında bir basamaktır. Üç sayının her biri de U tabanında bir basamaktır. Paketleme üç kez U ile çarpar ve toplar. Paketi açma üç kez kalanı alır ve böler, sonunda kalan değer haritadır. 8·U3'ün hâlâ 232'nin altına sığdığı en büyük U değeri 812'dir. Her eksen 512 yerine 812 seviye alır ve komşu örnekler arasındaki aralık, bit alanındaki aralığın yaklaşık 0,63'üne iner. Bastian Kuth ve Quirin Meyer, 2021 yılında vertex blend ağırlıkları için aynı paketlemeyi kullanmışlardı. Araştırmacılar bunu eşit dağılıma sahip asimetrik sayı sistemleriyle karşılaştırıyorlar.

Bölme işleminin maliyeti

Bir kod çözücü için bölme işlemi yavaş gibi görünür. Burada her taban sabittir, bu yüzden derleyici her bölme ve kalan işlemini bir çarpma ve bir kaydırma işlemine dönüştürür. Haritadan sonra kalan bitler üçe tam bölündüğünde, üç harita bitiyle 24 ve 48 bitte olduğu gibi, hiç tamsayı bölmesi gerekmez. Yazarlar, AMD Radeon RX 7900 XTX üzerindeki donanım döngü sayacıyla tek tek kod çözme işlemlerini ölçtüler. 32 bitlik kod çözücüleri 111 döngü sürdü. Aynı kartta iki kuaterniyon arasında yapılan tek bir küresel doğrusal interpolasyon ise 171 döngü gerektirdi. Küpü tanjantla büken MPEG-4 yöntemi 273 döngü sürdü, çünkü tanjant sinüsün kosinüse bölümü olarak derlenir. Kübik bükme, bir seviyeyi tekrar sayıya dönüştüren adımla birleşir ve bu ikisi bir arada üç birleşik çarpma-toplama (FMA) işlemine mal olur.

Hiçbir şey taşımayan işaret

Bir kuaterniyon ve negatifi aynı dönüşü tanımlar. Bir kodek her dönüşün işaretini en büyük bileşen pozitif olacak şekilde çevirebilir ve böylece işareti hiç yazmak zorunda kalmaz. Bazı animasyon kütüphaneleri bunu yapar. ozz-animation ise yapmaz. Bir anahtar için 48 bit harcar: üç sayının her biri için 15 bit, harita için iki bit ve işaret için bir bit. İşaret olmadan 46 bit kalır. Üç eşit bit alanı 46 biti paylaşamaz, bu yüzden kütüphane işareti ve her sayı için 15 biti saklar. Tek bir tamsayı olarak aynı 46 bit, 32.768 yerine her eksen için 246/3'ün aşağıya yuvarlanmış hali olan 41.285 seviye sağlar. Üç eksene paylaştırılan geri kazanılmış bir bit, her eksene 21/3, yani yaklaşık 1,26 kat kazandırır.

Test seti Mixamo korpusuydu ve toplamda 34.884.287 anahtar kare vardı. Orijinal ozz-animation kodekinin en büyük hata değeri 0,00909° idi. İşaret hâlâ saklanırken her sayı için 15 bit kullanan küp kodeki bu değeri 0,00203° seviyesine düşürdü. İşareti kaldırmak hatayı 0,00161° seviyesine indirdi, başlangıçtakinden 5,6 kat küçük. İşaretsiz 40 bitlik bir anahtar 0,01020° hata verdi, 48 bitlik orijinal sürümden yüzde 12 fazla. Buna karşılık her anahtarda bir bayt, tüm korpusta 33,3 MiB tasarruf etti. İki yolla da canlandırılan bir ejderhanın render'ları benzer görüntü hataları gösterdi. Skinning uygulanmış 1024 karakterin örneklenmesi, orijinal kodeke kıyasla yüzde 12 ila 16 daha hızlı gerçekleşti.

Teğet çerçeve aynı zamanda aynalanabilen bir dönüştür, çünkü doku koordinatları bir dikiş boyunca ters çevrilebilir. İşaretin artık gerekmediği o bit, bu el yönelimini saklayabilir. 2011 yılında tanıtılan CryEngine'in QTangents sistemi dört adet 16 bitlik bileşen kullanır ve el yönelimini dördüncü bileşenin işaretinde gizler. İşaret yuvarlamadan sağ çıksın diye bu bileşeni sıfırdan uzaklaştırır. Her çerçeve için 16 bit kullanan küp kodekinde sekiz harita üç sayı için 13 bit bırakır. Bit alanları her sayı için 16 seviye sağlardı. Tek bir tamsayı ise 20 seviye verir ve mümkün olan 65.536 kod arasından 64.000'ini kullanır. Makale bunu 15,97 kullanılan bit olarak veriyor.

Eksen başına seviyeler: bit alanları ve tek tamsayı
Ne saklanıyorBitHaritaBit alanlarıTek tamsayı
İşaretiyle birlikte dönüş328512812
İşareti olmayan animasyon anahtarı48432.76841.285
İşareti olmayan animasyon anahtarı4044.0966.501
El yönelimiyle birlikte teğet çerçeve1681620

Gauss splat'leri de aynı şekilde işlenir, çünkü bir kuaterniyon ile negatifi aynı Gauss'u verir. Rijsdijk ve arkadaşlarının geliştirdiği render motoru her Gauss'un geometrisini 128 bit içine sığdırır. Bunların 30'u dönüş için ayrılır ve bu dönüş üstel bir eşlemeyle sıkıştırılır. Mip-NeRF 360'tan üç sahnede, 30 bitlik üstel eşleme 45,90 dB tepe sinyal-gürültü oranına ulaştı. Küp kodeki 24 bitte 45,83 dB'ye ulaştı. 16 bitte 6,67 dB öndeydi. Dönüşlerin çözümlenmesi her iki yöntemde de her kare için yaklaşık 0,5 ms sürerken render işlemi için bu süre 11,8 ms oldu.

Tek sayıda seviye ve alt sınır

Bir bit alanı her zaman ikinin kuvveti kadar seviye tutar, bu da çift bir sayıdır. Makalenin nicemleyicisi örneklerini −1 ile 1 arasındaki aralıkta eşit adımların ortalarına yerleştirir, bu yüzden çift sayıda örnekte hiçbiri sıfıra düşmez. Özdeşlik dönüşü sıfırda, haritasının ortasında durur ve animasyonlar özdeşlik dönüşleriyle doludur. Bit alanı onu hiçbir zaman tam olarak geri vermez. Tek sayıda seviyede bir örnek sıfıra düşer ve tek tamsayıya paketleme, kodekin tek sayıda seviye seçmesine izin verir. Yazarlar bunun uygulanmasının çok basit olduğunu belirtiyor. Onların hata analizi bunu kapsamıyor.

Tüm bunların bir alt sınırı var. Makale, 2k duruma sahip hiçbir kodun en büyük hatasını yaklaşık 96° çarpı 2−k/3 değerinin altında tutamayacağını gösteriyor. Büyük bit bütçelerinde küp kodeki bu sınırdan yaklaşık 1,5 bit fazlasına ihtiyaç duyar. Bu sınır, dönüşlerin her yönde eşit şekilde dağıldığını varsayar. Sadece hafifçe dönen bir animasyon izi için o ize uygun bir aralık kullanmak daha iyi sonuç verir ki Animation Compression Library de tam olarak bunu yapar. Buradaki her kodun uzunluğu aynıdır, JPEG sıkıştırmasının Huffman aşamasının aksine, bu yüzden bir shader öncesindeki dönüşleri çözmeden herhangi bir dönüşü okuyabilir.

Kaynak

Carsten Faber, Bastian Kuth, Rinaldo Schuster, Daniel Pauls ve Quirin Meyer, Compression of Uniformly Distributed Unit Quaternions, arXiv, Ekim 2026, DOI 10.48550/arXiv.2610.22052, CC BY 4.0 lisansı kapsamında yayımlandı. Bu nottaki her sayı, zamanlama ve sınır bu makaleden alındı.

Önceki: Işın izleme