Blok sıkıştırma

Blok sıkıştırma, doku boyutunu ve bellek ayak izini azaltarak performans artışı sağlayan kayıplı bir doku sıkıştırma tekniğidir. Blok sıkıştırılmış doku, renk başına 32 bit olan bir dokudan daha küçük olabilir.

Blok sıkıştırma, doku boyutunu küçültmeye yönelik bir doku sıkıştırma tekniğidir. Renk başına 32 bit olan bir dokuyla karşılaştırıldığında, blok sıkıştırılmış doku yüzde 75'e kadar daha küçük olabilir. Uygulamalar genellikle daha küçük bellek ayak izi nedeniyle blok sıkıştırma kullanırken performans artışı görür.

Kayıplı olsa da blok sıkıştırma iyi çalışır ve işlem hattı tarafından dönüştürülen ve filtrelenen tüm dokular için önerilir. Yapıtlar daha belirgin olduğundan, doğrudan ekrana eşlenen dokular (simgeler ve metin gibi kullanıcı arabirimi öğeleri) sıkıştırma için iyi seçenekler değildir.

Blok sıkıştırılmış bir doku, bütün boyutlarda 4'ün katları olarak oluşturulmalıdır ve işlem hattının çıktısı olarak kullanılamaz.

Blok sıkıştırma nasıl çalışır?

Blok sıkıştırma, renk verilerini depolamak için gereken bellek miktarını azaltmaya yönelik bir tekniktir. Bazı renkleri özgün boyutlarında ve diğer renkleri kodlama düzeni kullanarak depolayarak, görüntüyü depolamak için gereken bellek miktarını önemli ölçüde azaltabilirsiniz. Donanım sıkıştırılmış verilerin kodunu otomatik olarak çözeceğinden, sıkıştırılmış dokuları kullanmak için performans cezası yoktur.

Sıkıştırmanın nasıl çalıştığını görmek için aşağıdaki iki örneğe bakın. İlk örnekte sıkıştırılmamış veriler depolanırken kullanılan bellek miktarı açıklanır; İkinci örnekte sıkıştırılmış veriler depolanırken kullanılan bellek miktarı açıklanmaktadır.

Sıkıştırılmamış verileri depolama

Aşağıdaki çizim sıkıştırılmamış 4×4 dokusunu temsil eder. Her rengin tek bir renk bileşeni (örneğin kırmızı) içerdiğini ve bir bayt bellekte depolandığını varsayalım.

Sıkıştırılmamış 4x4 doku

Sıkıştırılmamış veriler, aşağıdaki çizimde gösterildiği gibi sırayla belleğe yerleştirilmiştir ve 16 bayt gerektirir.

sıralı bellek sıkıştırılmamış verileri

Sıkıştırılmış verileri depolama

Sıkıştırılmamış bir görüntünün ne kadar bellek kullandığını gördüğünüze göre, sıkıştırılmış bir görüntünün ne kadar bellek kaydettiğine göz atın. BC4 sıkıştırma biçimi, aşağıdaki çizimde gösterildiği gibi dokudaki özgün renkleri ilişkilendirmek için kullanılan 2 renk (her birinde 1 bayt) ve 16 3 bit dizin (48 bit veya 6 bayt) depolar.

bc4 sıkıştırma biçimi

Sıkıştırılmış verileri depolamak için gereken toplam alan 8 bayttır ve sıkıştırılmamış örnekte yüzde 50 bellek tasarrufu sağlar. Birden fazla renk bileşeni kullanıldığında tasarruflar daha da artar.

Blok sıkıştırma tarafından sağlanan önemli bellek tasarrufları, performansın artmasına neden olabilir. Bu performans, görüntü kalitesinden ödün verilmesi pahasına gelir (renk iç içe geçirmesi nedeniyle); ancak, düşük kalite genellikle fark edilmez.

Sonraki bölümde, Direct3D'nin uygulamada blok sıkıştırmayı kullanmayı nasıl sağladığı gösterilmektedir.

Blok sıkıştırmayı kullanma

Blok sıkıştırılmış bir doku oluşturun; tıpkı sıkıştırılmamış bir doku gibi, sadece blok sıkıştırılmış bir biçim belirtirsiniz.

Ardından, dokuyu işlem hattına bağlamak için bir görünüm oluşturun. Blok sıkıştırılmış bir doku yalnızca gölgelendirici aşamasına giriş olarak kullanılabildiğinden, gölgelendirici kaynak görünümü oluşturmak istiyorsunuz.

Sıkıştırılmış blok dokusunu, sıkıştırılmamış dokuyu kullandığınız gibi kullanın. Uygulamanız blok sıkıştırılmış veriler için bir bellek işaretçisi elde edecekse, bildirilen boyutun gerçek boyuttan farklı olmasına neden olan bir mipmap'teki bellek doldurmasını dahil etmeniz gerekiyor.

Sanal boyut ile fiziksel boyut karşılaştırması

Blok sıkıştırılmış bir dokunun belleğinde gezinmek için bellek işaretçisi kullanan bir uygulama kodunuz varsa, uygulama kodunuzda değişiklik yapmanızı gerektirebilecek önemli bir husus vardır. Blok sıkıştırma algoritmaları 4x4 texel bloklar üzerinde çalıştığından, blok sıkıştırılmış doku tüm boyutlarda 4'ün katı olmalıdır. Bu, ilk boyutları 4'e bölünebilen ancak alt bölümlere ayrılmış düzeyler olmayan bir mipmap için bir sorun olacaktır. Aşağıdaki diyagramda, sanal (bildirilen) boyut ile her mipmap düzeyinin fiziksel (gerçek) boyutu arasındaki alan farkı gösterilmektedir.

sıkıştırılmamış ve sıkıştırılmış mipmap düzeyleri

Diyagramın sol tarafında sıkıştırılmamış 60×40 doku için oluşturulan mipmap düzeyi boyutları gösterilir. En üst düzey boyut, dokuyu oluşturan API çağrısından alınır; sonraki düzeyler önceki düzeyin yarısı kadardır. Sıkıştırılmamış doku için sanal (bildirilen) boyut ile fiziksel (gerçek) boyut arasında bir fark yoktur.

Diyagramın sağ tarafında, sıkıştırma ile aynı 60×40 doku için oluşturulan mipmap düzeyi boyutları gösterilir. Her iki seviyede de boyutları 4'ün katı yapmak için hem ikinci hem de üçüncü düzeylerde bellek dolgusu olduğuna dikkat edin. Algoritmaların 4×4 texel bloğu üzerinde çalışabilmesi için bu gereklidir. Bu özellikle 4×4'ten küçük mipmap düzeylerini dikkate alırsanız açıktır; doku belleği ayrıldığında bu çok küçük mipmap düzeylerinin boyutu en yakın 4 faktörüne yuvarlanacaktır.

Örnekleme donanımı sanal boyutu kullanır; doku örneklenirken bellek dolgusu göz ardı edilir. 4×4'ten küçük mipmap seviyeleri için, 2×2 harita için yalnızca ilk dört texel kullanılır ve 1×1 blok için yalnızca ilk texel kullanılır. Ancak fiziksel boyutu (bellek doldurma dahil) kullanıma sunan bir API yapısı yoktur.

Özetle, blok sıkıştırılmış veri içeren bölgeleri kopyalarken hizalanmış bellek bloklarını kullanmaya dikkat edin. Bunu bellek işaretçisi alan bir uygulamada yapmak için, işaretçinin fiziksel bellek boyutunu hesaba kattığından emin olmak amacıyla yüzey hatvesini kullandığından emin olun.

Sıkıştırma algoritmaları

Direct3D'de blok sıkıştırma teknikleri sıkıştırılmamış doku verilerini 4×4 blok halinde ayırır, her bloğu sıkıştırır ve ardından verileri depolar. Bu nedenle dokuların sıkıştırılması beklenen doku boyutlarının 4'ün katları olması gerekir.

Blok sıkıştırma

Yukarıdaki diyagramda, texel bloklarına bölünmüş bir doku gösterilmektedir. İlk blok, a-p etiketli 16 texel düzenini gösterir, ancak her bloğun aynı veri düzeni vardır.

Direct3D çeşitli sıkıştırma düzenleri uygular, her biri depolanan bileşen sayısı, bileşen başına bit sayısı ve tüketilen bellek miktarı arasında farklı bir denge uygular. Bu tabloyu, uygulamanıza en uygun veri türü ve veri çözünürlüğü ile en uygun biçimi seçmenize yardımcı olması için kullanın.

Kaynak Veriler Veri Sıkıştırma Çözünürlüğü (bit cinsinden) Bu sıkıştırma biçimini seçin
Üç bileşenli renk ve alfa Renk (5:6:5), Alfa (1) veya alfa yok BC1
Üç bileşenli renk ve alfa Renk (5:6:5), Alfa (4) BC2
Üç bileşenli renk ve alfa Renk (5:6:5), Alfa (8) BC3
Tek bileşenli renk Bir bileşen (8) BC4
İki bileşenli renk İki bileşen (8:8) BC5

BC1

5:6:5 renk (5 bit kırmızı, 6 bit yeşil, 5 bit mavi) kullanarak üç bileşenli renk verilerini depolamak için ilk blok sıkıştırma biçimini (BC1) (DXGI_FORMAT_BC1_TYPELESS, DXGI_FORMAT_BC1_UNORM veya DXGI_BC1_UNORM_SRGB) kullanın. Veriler 1 bit alfa da içerse bile bu durum geçerlidir. Mümkün olan en büyük veri biçimini kullanan bir 4×4 dokusunun kullanıldığı varsayıldığında, BC1 biçimi gereken belleği 48 bayttan (16 renk × 3 bileşen/renk × 1 bayt/bileşen) 8 bayt belleğe düşürür.

Algoritma, 4×4 texel bloğu üzerinde çalışır. Algoritma, aşağıdaki diyagramda gösterildiği gibi 16 rengi depolamak yerine 2 başvuru rengi (color_0 ve color_1) ve 16 2 bit renk dizinlerini (blok a–p) kaydeder.

bc1 sıkıştırma düzeni için

Renk dizinleri (a–p), bir renk tablosundan özgün renkleri aramak için kullanılır. Renk tablosu 4 renk içerir. İlk iki renk (color_0 ve color_1), en düşük ve en yüksek renklerdir. color_2 ve color_3 diğer iki renk, doğrusal ilişkilendirme ile hesaplanan ara renklerdir.

color_2 = 2/3*color_0 + 1/3*color_1
color_3 = 1/3*color_0 + 2/3*color_1

Dört renge a–p bloklarına kaydedilecek 2 bit dizin değerleri atanır.

color_0 = 00
color_1 = 01
color_2 = 10
color_3 = 11

Son olarak, a–p bloklarındaki renklerin her biri renk tablosundaki dört renkle karşılaştırılır ve en yakın rengin dizini 2 bit bloklarda depolanır.

Bu algoritma kendisini 1 bit alfa içeren verilere de ödünç verir. Tek fark, color_3 0 (saydam rengi temsil eder) olarak ayarlanması ve color_2 color_0 ve color_1 doğrusal bir karışımı olmasıdır.

color_2 = 1/2*color_0 + 1/2*color_1;
color_3 = 0;

BC2

Düşük tutarlılığa sahip renk ve alfa verileri içeren verileri depolamak için BC2 biçimini (DXGI_FORMAT_BC2_TYPELESS, DXGI_FORMAT_BC2_UNORM veya DXGI_BC2_UNORM_SRGB) kullanın (yüksek oranda tutarlı alfa verileri için BC3 kullanın). BC2 biçimi RGB verilerini 5:6:5 renk (5 bit kırmızı, 6 bit yeşil, 5 bit mavi) ve alfayı ayrı bir 4 bit değer olarak depolar. Mümkün olan en büyük veri biçimini kullanan bir 4×4 dokusunun kullanıldığı varsayıldığında, bu sıkıştırma tekniği gereken belleği 64 bayttan (16 renk × 4 bileşen/renk × 1 bayt/bileşen) 16 bayt belleğe düşürür.

BC2 biçimi, BC1 biçimiyle aynı sayıda bit ve veri düzeni ne sahip renkleri depolar; ancak BC2, aşağıdaki diyagramda gösterildiği gibi alfa verilerini depolamak için ek 64 bit bellek gerektirir.

bc2 sıkıştırma düzeni için

BC3

Yüksek oranda tutarlı renk verilerini depolamak için BC3 biçimini (DXGI_FORMAT_BC3_TYPELESS, DXGI_FORMAT_BC3_UNORM veya DXGI_BC3_UNORM_SRGB) kullanın (daha az tutarlı alfa verileriyle bc2 kullanın). BC3 biçimi, renk verilerini 5:6:5 renk (5 bit kırmızı, 6 bit yeşil, 5 bit mavi) ve alfa verilerini tek bayt kullanarak depolar. Mümkün olan en büyük veri biçimini kullanan bir 4×4 dokusunun kullanıldığı varsayıldığında, bu sıkıştırma tekniği gereken belleği 64 bayttan (16 renk × 4 bileşen/renk × 1 bayt/bileşen) 16 bayt belleğe düşürür.

BC3 biçimi, BC1 biçimiyle aynı sayıda bit ve veri düzenine sahip renkleri depolar; ancak BC3, alfa verilerini depolamak için ek 64 bit bellek gerektirir. BC3 biçimi, iki başvuru değerini depolayarak ve aralarında ilişkilendirme yaparak (BC1'in RGB rengini nasıl depoladığına benzer şekilde) alfayı işler.

Algoritma, 4×4 texel bloğu üzerinde çalışır. Algoritma, aşağıdaki diyagramda gösterildiği gibi 16 alfa değerini depolamak yerine 2 başvuru alfası (alpha_0 ve alpha_1) ve 16 3 bit renk dizinlerini (alfa a ile p arasında) depolar.

bc3 sıkıştırma düzeni için

BC3 biçimi, 8 değer içeren bir arama tablosundan özgün renkleri aramak için alfa dizinlerini (a–p) kullanır. İlk iki değer (alpha_0 ve alpha_1), en düşük ve en yüksek değerlerdir; diğer altı ara değer doğrusal ilişkilendirme kullanılarak hesaplanır.

Algoritma, iki başvuru alfa değerini inceleyerek ilişkilendirilmiş alfa değerlerinin sayısını belirler. alpha_0, alpha_1'den büyükse, BC3 6 alfa değerini interpolasyon yapar; aksi takdirde, 4 alfa değerini interpolasyon yapar. BC3 yalnızca 4 alfa değerini ilişkilendirmek için iki ek alfa değeri ayarlar (tamamen saydam için 0 ve tamamen opak için 255). BC3, 4×4 texel alanındaki alfa değerlerini, belirli bir ifadenin özgün alfasıyla en yakın eşleşen ilişkilendirilmiş alfa değerlerine karşılık gelen bit kodunu depolayarak sıkıştırır.

if( alpha_0 > alpha_1 )
{
  // 6 interpolated alpha values.
  alpha_2 = 6/7*alpha_0 + 1/7*alpha_1; // bit code 010
  alpha_3 = 5/7*alpha_0 + 2/7*alpha_1; // bit code 011
  alpha_4 = 4/7*alpha_0 + 3/7*alpha_1; // bit code 100
  alpha_5 = 3/7*alpha_0 + 4/7*alpha_1; // bit code 101
  alpha_6 = 2/7*alpha_0 + 5/7*alpha_1; // bit code 110
  alpha_7 = 1/7*alpha_0 + 6/7*alpha_1; // bit code 111
}
else
{
  // 4 interpolated alpha values.
  alpha_2 = 4/5*alpha_0 + 1/5*alpha_1; // bit code 010
  alpha_3 = 3/5*alpha_0 + 2/5*alpha_1; // bit code 011
  alpha_4 = 2/5*alpha_0 + 3/5*alpha_1; // bit code 100
  alpha_5 = 1/5*alpha_0 + 4/5*alpha_1; // bit code 101
  alpha_6 = 0;                         // bit code 110
  alpha_7 = 255;                       // bit code 111
}

BC4

Her renk için 8 bit kullanarak tek bileşenli renk verilerini depolamak için BC4 biçimini kullanın. Artan doğruluğun bir sonucu olarak (BC1 karşılaştırıldığında), BC4, kayan nokta verilerini DXGI_FORMAT_BC4_UNORM biçimini ve [-1 - +1] DXGI_FORMAT_BC4_SNORM biçimini kullanarak [0- 1] aralığında depolamak için idealdir. Mümkün olan en büyük veri biçimini kullanan bir 4×4 dokusunun kullanıldığı varsayıldığında, bu sıkıştırma tekniği gereken belleği 16 bayttan (16 renk × 1 bileşen/renk × 1 bayt/bileşen) 8 bayta düşürür.

Algoritma, 4×4 texel bloğu üzerinde çalışır. Algoritma, aşağıdaki diyagramda gösterildiği gibi 16 rengi depolamak yerine 2 başvuru rengini (red_0 ve red_1) ve 16 3 bit renk dizinlerini (kırmızı a ile kırmızı p arasında) depolar.

bc4 sıkıştırma düzeni için

Algoritma, 8 renk içeren bir renk tablosundan renk aramak için 3 bit dizinleri kullanır. İlk iki renk (red_0 ve red_1), en düşük ve en yüksek renklerdir. Algoritma, doğrusal ilişkilendirmeyi kullanarak kalan renkleri hesaplar.

Algoritma, iki başvuru değerini inceleyerek ilişkilendirilmiş renk değerlerinin sayısını belirler. red_0, red_1'den büyükse BC4 6 renk değerini ilişkilendirir, aksi takdirde 4'ünü ilişkilendirir. BC4 yalnızca 4 renk değerini ilişkilendirmek için iki ek renk değeri ayarlar (tamamen saydam için 0,0f ve tamamen opak için 1,0f). BC4, belirli bir ifadenin özgün alfasıyla en yakın eşleşen ilişkilendirilmiş alfa değerlerine karşılık gelen bit kodunu depolayarak 4×4 texel alanındaki alfa değerlerini sıkıştırır.

BC4_UNORM

Tek bileşenli verilerin ilişkilendirmesi aşağıdaki kod örneğinde olduğu gibi yapılır.

unsigned word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = 0.0f;                     // bit code 110
  red_7 = 1.0f;                     // bit code 111
}

Başvuru renklerine 3 bit dizinler (8 değer olduğundan 000–111) atanır ve bunlar sıkıştırma sırasında kırmızı a ile kırmızı p bloklarına kaydedilir.

BC4_SNORM

verilerin SNORM aralığında kodlanmış olması ve 4 renk değeri ilişkilendirmesi dışında DXGI_FORMAT_BC4_SNORM tamamen aynıdır. Tek bileşenli verilerin ilişkilendirmesi aşağıdaki kod örneğinde olduğu gibi yapılır.

signed word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = -1.0f;                    // bit code 110
  red_7 =  1.0f;                    // bit code 111
}

Başvuru renklerine 3 bit dizinler (8 değer olduğundan 000–111) atanır ve bunlar sıkıştırma sırasında kırmızı a ile kırmızı p bloklarına kaydedilir.

BC5

Her renk için 8 bit kullanarak iki bileşenli renk verilerini depolamak için BC5 biçimini kullanın. Artan doğruluğun bir sonucu olarak (BC1 karşılaştırıldığında), BC5, kayan nokta verilerini DXGI_FORMAT_BC5_UNORM biçimini ve [-1 - +1] DXGI_FORMAT_BC5_SNORM biçimini kullanarak [0- 1] aralığında depolamak için idealdir. Mümkün olan en büyük veri biçimini kullanan bir 4×4 dokusunun kullanıldığı varsayıldığında, bu sıkıştırma tekniği gereken belleği 32 bayttan (16 renk × 2 bileşen/renk × 1 bayt/bileşen) 16 bayta düşürür.

Algoritma, 4×4 texel bloğu üzerinde çalışır. Algoritma, her iki bileşen için de 16 renk depolamak yerine, aşağıdaki diyagramda gösterildiği gibi her bileşen için 2 başvuru rengi (red_0, red_1, green_0 ve green_1) ve her bileşen için 16 3 bit renk dizinlerini (kırmızı a ile kırmızı p ve yeşil p ile yeşil p arasında) depolar.

bc5 sıkıştırma düzeni için

Algoritma, 8 renk içeren bir renk tablosundan renk aramak için 3 bit dizinleri kullanır. red_0 ve red_1 (veya green_0 ve green_1) ilk iki renk en düşük ve en yüksek renklerdir. Algoritma, doğrusal ilişkilendirmeyi kullanarak kalan renkleri hesaplar.

Algoritma, iki başvuru değerini inceleyerek ilişkilendirilmiş renk değerlerinin sayısını belirler. red_0 red_1'den büyükse, BC5 6 renk değerini interpolate eder; aksi takdirde, 4 renk değeri interpolasyon yapar. BC5 yalnızca 4 renk değerini ilişkilendirmek için kalan iki renk değerini 0,0f ve 1,0f olarak ayarlar.

BC5_UNORM

Tek bileşenli verilerin ilişkilendirmesi aşağıdaki kod örneğinde olduğu gibi yapılır. Yeşil bileşenler için hesaplamalar benzerdir.

unsigned word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = 0.0f;                     // bit code 110
  red_7 = 1.0f;                     // bit code 111
}

Başvuru renklerine 3 bit dizinler (8 değer olduğundan 000–111) atanır ve bunlar sıkıştırma sırasında kırmızı a ile kırmızı p bloklarına kaydedilir.

BC5_SNORM

DXGI_FORMAT_BC5_SNORM tamamen aynıdır, ancak veriler SNORM aralığında kodlanır ve 4 veri değeri ilişkilendirmesi yapıldığında, iki ek değer -1.0f ve 1.0f olur. Tek bileşenli verilerin ilişkilendirmesi aşağıdaki kod örneğinde olduğu gibi yapılır. Yeşil bileşenler için hesaplamalar benzerdir.

signed word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = -1.0f;                    // bit code 110
  red_7 =  1.0f;                    // bit code 111
}

Başvuru renklerine 3 bit dizinler (8 değer olduğundan 000–111) atanır ve bunlar sıkıştırma sırasında kırmızı a ile kırmızı p bloklarına kaydedilir.

Biçim dönüştürme

Direct3D, önceden yapılandırılmış türdeki dokularla aynı bit genişliklerindeki blok sıkıştırılmış dokular arasında kopyaları etkinleştirir.

Kaynakları birkaç biçim türü arasında kopyalayabilirsiniz. Bu tür kopyalama işlemi, kaynak verilerini farklı bir biçim türü olarak yeniden yorumlayan bir biçim dönüştürme türü gerçekleştirir. Verileri yeniden yorumlama ile daha tipik bir dönüştürme türünün davranışı arasındaki farkı gösteren bu örneği göz önünde bulundurun:

FLOAT32 f = 1.0f;
UINT32 u;

'f' öğesini 'u' türü olarak yeniden yorumlamak için memcpy kullanın:

memcpy( &u, &f, sizeof( f ) ); // 'u' becomes equal to 0x3F800000.

Önceki yeniden yorumlamada, verilerin temel alınan değeri değişmez; memcpy kayan öğeyi işaretsiz bir tamsayı olarak yeniden yorumlar.

Daha tipik dönüştürme türünü gerçekleştirmek için atamayı kullanın:

u = f; // 'u' becomes 1.

Önceki dönüştürmede, verilerin temel alınan değeri değişir.

Aşağıdaki tabloda, bu biçim dönüştürme yeniden yorumlama türünde kullanabileceğiniz izin verilebilen kaynak ve hedef biçimleri listelenmiştir. Yeniden yorumlamanın beklendiği gibi çalışması için değerleri düzgün bir şekilde kodlamanız gerekir.

Bit Genişliği Sıkıştırılmamış Kaynak Block-Compressed Kaynak
32

DXGI_FORMAT_R32_UINT

DXGI_FORMAT_R32_SINT

DXGI_FORMAT_R9G9B9E5_SHAREDEXP
64

DXGI_FORMAT_R16G16B16A16_UINT

DXGI_FORMAT_R16G16B16A16_SINT

DXGI_FORMAT_R32G32_UINT

DXGI_FORMAT_R32G32_SINT

DXGI_FORMAT_BC1_UNORM[_SRGB]

DXGI_FORMAT_BC4_UNORM

DXGI_FORMAT_BC4_SNORM

128

DXGI_FORMAT_R32G32B32A32_UINT

DXGI_FORMAT_R32G32B32A32_SINT

DXGI_FORMAT_BC2_UNORM[_SRGB]

DXGI_FORMAT_BC3_UNORM[_SRGB]

DXGI_FORMAT_BC5_UNORM

DXGI_FORMAT_BC5_SNORM

Sıkıştırılmış doku kaynakları