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.

Yaklaşık 10 dakika5 etkileşimli demo
Okumaya başla

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.

DeneyinGrafik belleği hesaplayıcıAynı dokuların her formatta ne kadar GPU belleği gerektirdiğini görmek için çözünürlüğü ve doku sayısını değiştirin.
Çözünürlük
  • RGBA8
    Texel başına 32 bit
    213 MiB
    Referans
    Doku başına 21,3 MiB
  • BC7 · ASTC 4×4
    Texel başına 8 bit
    53,3 MiB
    4× daha küçük
    Doku başına 5,3 MiB
  • BC1 · ETC2 RGB
    Texel başına 4 bit
    26,7 MiB
    8× daha küçük
    Doku başına 2,7 MiB
  • ASTC 6×6
    Texel başına 3,56 bit
    23,8 MiB
    9× daha küçük
    Doku başına 2,4 MiB
  • ASTC 8×8
    Texel başına 2 bit
    13,3 MiB
    16× daha küçük
    Doku başına 1,3 MiB
  • ASTC 12×12
    Texel başına 0,89 bit
    6 MiB
    35,7× daha küçük
    Doku 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.

DeneyinBir texel bulunBu 32×32 dokunun herhangi bir texel'ine tıklayın. Blok formatı nerede saklandığını hesaplayabilir; PNG hesaplayamaz.

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ı

0511

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.

DeneyinBC1 blok gezginiÖrnek dokuda bir 4×4 blok seçin ve BC1'in onu tam olarak nasıl sakladığını görün.
Blok 12, 4

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.

Yaygın GPU doku formatları
FormatTexel başına bitAlfaTipik platformlarEn uygun kullanım
BC141 bitMasaüstü, konsollarBellek kısıtlıyken opak renk
BC38EvetMasaüstü, konsollarEski içerikte yumuşak alfalı renk
BC44Veri kanallarıMasaüstü, konsollarTek kanal: maskeler, pürüzlülük, yükseklik
BC58Veri kanallarıMasaüstü, konsollarNormal haritaları (X ve Y)
BC6H8HayırMasaüstü, konsollarSkybox ve ışık haritası gibi HDR renk
BC78EvetMasaüstü, konsollarAlfalı ya da alfasız yüksek kaliteli renk
ETC14HayırNeredeyse tüm Android cihazlarÇok eski cihazlarda opak renk
ETC24–8EvetAndroid, iOSYaygın desteklenen mobil yedek format
ASTC0.89–8EvetYeni Android ve iOS cihazlar, Apple SiliconMobilde ayarlanabilir kalite
PVRTC2–4EvetEski iPhone ve iPad'lerYalnızca eski Apple cihazları
Basis ETC1SHedef formata bağlıEvetHer GPU, KTX2 ileHer GPU'da çalışan küçük indirmeler
Basis UASTCHedef formata bağlıEvetHer GPU, KTX2 ileHer GPU'da çalışan yüksek kalite
DeneyinGerçek kodlayıcıları çalıştırın512×512 örneği araçlarımızın kullandığı aynı WebAssembly kodlayıcılarıyla sıkıştırın, ardından büyütülmüş bir alanı karşılaştırın.
Tarayıcınızda çalışır. Hiçbir şey yüklenmez.
Büyütülecek alan
Orijinal
RGBA8
GPU belleğinde 1 MiB
BC1
BC1
Texel başına 4 bit
GPU belleğinde 128 KiB
BC7
BC7
Texel başına 8 bit
GPU belleğinde 256 KiB
ASTC 6×6
ASTC 6×6
Texel başına 3,56 bit
GPU belleğinde 116 KiB
ASTC 12×12
ASTC 12×12
Texel başına 0,89 bit
GPU belleğinde 29 KiB

Ö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.

DeneyinFormat seçiciDokunun nerede çalışacağını ve neyi içerdiğini seçin.
Nerede çalışacak?
Dokuda ne var?

Ş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.

  1. 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.

  2. 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.

  3. 03

    Mipmap üretin

    Belleği yaklaşık %33 artırırlar, ancak uzak yüzeylerin titremesini önler ve örneklemeyi hızlandırırlar.

  4. 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.

  5. 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.