Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ı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.
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.
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.
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 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.
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.
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 |