Başlangıç rehberi
Bir doku GPU'nun içinde neye dönüşür
300 KB'lık bir PNG, fark ettirmeden 5 MB grafik belleği kaplayabilir. Bu rehber nedenini, GPU'ların blok sıkıştırmayla dokuları nasıl küçülttüğünü ve nasıl format seçileceğini anlatıyor. Her fikrin yanında deneyebileceğiniz bir demo var.
Bölüm 1
Dosya boyutu bellek boyutu değildir
PNG ve JPEG, görüntüleri saklamak ve göndermek için tasarlanmıştır. GPU bir dokuyu çizmeden önce görüntü ham texel'lere açılır; genellikle her biri 4 bayttır.
GPU bu texel'leri her karede milyonlarca kez örnekler, bu yüzden her an okunmaya hazır olmaları gerekir. Bellek kullanımı da yalnızca çözünürlüğe ve piksel formatına bağlıdır; dosyanın ne kadar iyi sıkıştırıldığına bağlı değildir. Uzak yüzeyler için kullanılan küçültülmüş kopyalar olan mipmap'ler yaklaşık üçte bir daha ekler.
- RGBA8Texel başına 32 bit213 MiBReferansDoku başına 21,3 MiB
- BC7 · ASTC 4×4Texel başına 8 bit53,3 MiB4× daha küçükDoku başına 5,3 MiB
- BC1 · ETC2 RGBTexel başına 4 bit26,7 MiB8× daha küçükDoku başına 2,7 MiB
- ASTC 6×6Texel başına 3,56 bit23,8 MiB9× daha küçükDoku başına 2,4 MiB
- ASTC 8×8Texel başına 2 bit13,3 MiB16× daha küçükDoku başına 1,3 MiB
- ASTC 12×12Texel başına 0,89 bit6 MiB35,7× daha küçükDoku başına 612 KiB
Blok formatları her mip seviyesinde tam bloklara yuvarlanır; bu yüzden sayılar GPU'nun gerçekte ayırdığı miktarla aynıdır.
Bölüm 2
GPU neden PNG'yi olduğu gibi tutamaz
Bir shader dokuyu örneklerken herhangi bir texel'i herhangi bir sırayla isteyebilir. Donanımın o texel'i anında bulması gerekir.
PNG ve JPEG değişken uzunlukta kodlama kullanır: ortadaki bir piksele ulaşmak için önce ondan önceki her şeyin çözülmesi gerekir. GPU formatları ise sabit oranlıdır: her 4×4 blok tam olarak aynı sayıda bayt kullanır, bu yüzden herhangi bir texel'in adresi basit bir çarpmayla bulunur. Doku bellekte sıkıştırılmış hâlde kalır ve doku birimi blokları okurken çözer.
Seçimi ok tuşlarıyla taşıyın.
- Seçili texel
- x 13, y 18
- Bloğu
- sütun 3, satır 4
- BC1'deki adresi
- (4 × 8 + 3) × 8 bayt = 280. bayt
64 bloğun bellekteki sırası
Aynı texel PNG içinde
Önce 0 ile 18 arasındaki satırlar açılmalı (32 satırın 19 tanesi)
Bölüm 3
Bir 4×4 bloğun içi
Yaygın olarak kullanılan en eski format olan BC1, fikri en açık şekilde gösterir. 16 texel'lik bir bloğu yalnızca 8 baytta saklar.
Kodlayıcı iki uç renk seçer. Çözücü bunları düz bir çizgi üzerinde dört renge karıştırır ve her texel en yakın rengi gösteren 2 bitlik bir numara saklar. Renk geçişleri yumuşak olan bloklar iyi korunur; birbiriyle ilgisiz birkaç rengi karıştıran bloklar korunmaz.
Bölüm 4
Çok sayıda format, farklı ödünleşimler
Yeni formatlar bitlerini BC1'den daha akıllıca kullanır: daha fazla uç nokta, bir blok içinde birkaç renk çizgisi, daha iyi alfa ya da seçilebilir blok boyutu.
BC7 ve ASTC 4×4 texel başına 8 bit kullanır ve orijinale çok yakın görünür. ASTC, blok boyutu üzerinden kaliteyi boyutla takas eder: bir blok her zaman 128 bittir, bu yüzden 12×12 bir blok texel başına bir bitten az tutar. Basis Universal başka bir yol izler: tek bir kompakt dosya dağıtır ve bunu cihazda o GPU'nun desteklediği bir formata dönüştürür.
| Format | Texel başına bit | Alfa | Tipik platformlar | En uygun kullanım |
|---|---|---|---|---|
| BC1 | 4 | 1 bit | Masaüstü, konsollar | Bellek kısıtlıyken opak renk |
| BC3 | 8 | Evet | Masaüstü, konsollar | Eski içerikte yumuşak alfalı renk |
| BC4 | 4 | Veri kanalları | Masaüstü, konsollar | Tek kanal: maskeler, pürüzlülük, yükseklik |
| BC5 | 8 | Veri kanalları | Masaüstü, konsollar | Normal haritaları (X ve Y) |
| BC6H | 8 | Hayır | Masaüstü, konsollar | Skybox ve ışık haritası gibi HDR renk |
| BC7 | 8 | Evet | Masaüstü, konsollar | Alfalı ya da alfasız yüksek kaliteli renk |
| ETC1 | 4 | Hayır | Neredeyse tüm Android cihazlar | Çok eski cihazlarda opak renk |
| ETC2 | 4–8 | Evet | Android, iOS | Yaygın desteklenen mobil yedek format |
| ASTC | 0.89–8 | Evet | Yeni Android ve iOS cihazlar, Apple Silicon | Mobilde ayarlanabilir kalite |
| PVRTC | 2–4 | Evet | Eski iPhone ve iPad'ler | Yalnızca eski Apple cihazları |
| Basis ETC1S | Hedef formata bağlı | Evet | Her GPU, KTX2 ile | Her GPU'da çalışan küçük indirmeler |
| Basis UASTC | Hedef formata bağlı | Evet | Her GPU, KTX2 ile | Her GPU'da çalışan yüksek kalite |
Örneği sıkıştırmak için “Kodlayıcıları çalıştır”a basın. İlk çalıştırmada kodlayıcılar indirilir.
Bölüm 5
Format seçmek
İki soru seçimi hızla daraltır: dokuyu hangi GPU'lar yükleyecek ve içinde ne tür veri var?
Renk dokuları, normal haritaları ve tek kanallı maskeler sıkıştırmaya farklı tepki verir; masaüstü, mobil ve web platformları da farklı format ailelerini destekler. Makul bir başlangıç noktası için durumunuzu seçin, ardından sonucu kendi dokularınızla kontrol edin.
Şununla başlayın
ASTC 6×6
Bunu da düşünün: ASTC 4×4 · ETC2 RGB
ASTC, yeni Android ve iOS GPU'larında çalışır. 6×6 iyi bir dengedir; önemli varlıklar için 4×4, eski cihazlar için ETC2 kullanın.
ASTC kodlayıcısını açBölüm 6
Pratik ipuçları
Birkaç alışkanlık, doku sıkıştırma sorunlarının çoğunu önler.
- 01
Rengi sRGB, veriyi doğrusal olarak işaretleyin
Albedo ve arayüz dokuları sRGB'dir. Normal, pürüzlülük ve diğer veri haritaları doğrusal kalmalıdır; aksi hâlde aydınlatma yanlış olur.
- 02
Normal haritalarına ayrı format verin
BC5 ya da EAC RG11 gibi iki kanallı formatlar kullanın ve Z'yi shader'da yeniden oluşturun. Renk formatları bit israf eder ve görünür tümsekler ekler.
- 03
Mipmap üretin
Belleği yaklaşık %33 artırırlar, ancak uzak yüzeylerin titremesini önler ve örneklemeyi hızlandırırlar.
- 04
Boyutları bloklara uygun seçin
Çoğu format 4×4 bloklarla çalışır, bu yüzden 4'e bölünebilen boyutlar dolgu gerektirmez. PVRTC gibi eski formatlar ayrıca kare ve ikinin kuvveti boyutlar ister.
- 05
Gerçek içeriği gerçek cihazlarda kontrol edin
Çözülmüş sonucu tam büyütmede orijinalle karşılaştırın ve hedef GPU'larınızın formatı desteklediğinden emin olun.
Sık sorulan sorular
GPU doku sıkıştırması kayıpsız mıdır?
Hayır. BC, ETC, ASTC ve PVRTC blok başına sabit boyutlu, kayıplı formatlardır. Ne kadar kalite kaybedileceği formata, blok boyutuna ve görüntüye bağlıdır.
Neden doğrudan PNG ya da JPEG dokular kullanılmıyor?
Daha hızlı inerler, ancak GPU onları örnekleyemez; bu yüzden ham texel'lere çözülür ve belleğin tamamını kullanırlar. GPU formatları bellekte de küçük kalır.
En iyi doku formatı hangisi?
Masaüstünde BC7, yeni mobil cihazlarda ASTC iyi bir varsayılandır. Web gibi tek bir dosyanın birçok GPU'da çalışması gerektiğinde KTX2 ve Basis Universal kullanın.
Texel başına bit ne anlama gelir?
Bir texel'in ortalama depolama maliyetidir. Ham RGBA8 32 bit, BC1 4, BC7 8 kullanır; ASTC ise blok boyutuna göre 8'den yaklaşık 0,89'a kadar iner.
Kendi dokularınızla deneyin
Tüm kodlayıcılar tarayıcınızda yerel olarak çalışır. Bir PNG ya da JPEG yükleyin, format seçin ve sonucu karşılaştırın.