Bagikan melalui


Kompresi blok

Dimulai dengan Windows 8.1, Direct2D mendukung beberapa format piksel terkompresi blok. Selain itu, Windows 8.1 berisi codec DDS Windows Imaging Component (WIC) baru untuk mengaktifkan pemuatan dan penyimpanan gambar terkompresi blok dalam format file DDS. Pemadatan blok adalah teknik untuk mengurangi jumlah memori grafis yang dikonsumsi oleh konten bitmap. Dengan menggunakan kompresi blok, aplikasi Anda dapat mengurangi konsumsi memori dan waktu muat untuk gambar resolusi yang sama. Atau, aplikasi Anda dapat menggunakan gambar resolusi yang lebih banyak atau lebih tinggi sambil tetap menggunakan jejak memori GPU yang sama.

Kompresi blok telah digunakan oleh aplikasi Direct3D untuk waktu yang lama, dan dengan Windows 8.1 juga tersedia untuk pengembang aplikasi mainstream dan Direct2D.

Topik ini menjelaskan cara kerja kompresi blok dan cara menggunakannya di WIC dan Direct2D.

Tentang Kompresi Blok

Kompresi Blok (SM) mengacu pada kelas teknik kompresi untuk mengurangi ukuran tekstur. Direct3D 11 mendukung hingga 7 format BC yang berbeda tergantung pada tingkat fitur. Dalam Windows 8.1 Direct2D memperkenalkan dukungan untuk format BC1, BC2, dan BC3 yang tersedia di semua tingkat fitur.

Cara kerja Kompresi Blok

Format terkompresi blok semuanya menggunakan teknik dasar yang sama untuk mengurangi ruang yang dikonsumsi oleh data warna. Bagian ini merangkum algoritma paling sederhana, BC1. Untuk penjelasan yang lebih rinci, lihat Kompresi Blok.

Pertama, gambar dibagi menjadi blok 4 dengan 4 piksel. Setiap blok dikompresi secara terpisah.

Catatan

Ini berarti lebar dan tinggi gambar masing-masing harus kelipatan 4 piksel agar dikompresi blok.

 

Contoh gambar ini menunjukkan blok piksel 4x4 dalam gambar.

contoh gambar memperlihatkan blok 4x4 piksel dalam gambar.

Selanjutnya, dalam blok 4 kali 4, dua warna "referensi" dipilih dan dikodekan sebagai dua nilai 16 bit (merah 5 bit, hijau 6 bit, biru 5 bit). Pilihan warna-warna ini secara signifikan mempengaruhi kualitas gambar dan tidak mudah dicoba. Dua warna perantara dihitung dengan menginterpolasi secara linier antara dua warna referensi dalam ruang warna RGB. Ini menghasilkan total 4 kemungkinan warna yang berbeda; setiap warna diberi nilai indeks dua bit. Namun, perhatikan bahwa hanya dua warna titik akhir yang perlu disimpan saat interpolasi diperbaiki.

Dalam gambar ini, warna 0 dan 3 dipilih sebagai warna "referensi" untuk blok, sementara warna 1 dan 2 dihitung menggunakan interpolasi linier.

Diagram yang memperlihatkan perhitungan 4 nilai warna untuk mewakili blok.

Terakhir, setiap piksel dalam blok dipetakan ke salah satu dari empat warna yang dihitung sebelumnya, dan setiap piksel dikodekan menggunakan nilai indeks dua bit.

Jumlah total data yang digunakan untuk mewakili 16 piksel ini adalah:

16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits

Ini menghasilkan kepadatan rata-rata 4 bit per piksel. Sebagai perbandingan, format piksel DXGI_FORMAT_B8G8R8A8_UNORM umum mengonsumsi 32 bit per piksel.

Diagram ini menunjukkan bahwa setiap piksel dikodekan sebagai indeks 2 bit. Seluruh blok dikodekan dalam 64 bit.

menghitung 4 nilai warna untuk mewakili blok.

Ada variasi untuk mendukung data alfa dan berbagai jumlah saluran warna. BC6H dan BC7 menggunakan algoritma yang berbeda secara signifikan untuk mendukung konten rentang dinamis tinggi (HDR) dan masing-masing meningkatkan kualitas gambar.

Format file DirectDraw Surface (DDS)

Data terkompresi blok biasanya disimpan dalam file DirectDraw Surface (DDS ). Anda mungkin terbiasa dengan file DDS jika Anda adalah pengembang Direct3D. Perhatikan bahwa Direct2D hanya mendukung fitur DDS tertentu; untuk informasi selengkapnya lihat Persyaratan DDS.

Keuntungan kompresi blok

Format terkompresi blok berbeda dari format kompresi gambar industri umum seperti JPEG dalam format SM didukung secara asli oleh GPU modern. Ini berarti Bahwa Anda dapat langsung memuat gambar terkompresi blok ke GPU tanpa pendekodean atau dekompresi. Format SM rata-rata mengkonsumsi dari 4 hingga 8 bit per piksel; jika dibandingkan dengan bitmap BGRA 32 bit per piksel yang tidak dikompresi biasa, ini menghasilkan penghematan memori 75% hingga 87,5%. Selain itu, karena tidak ada langkah dekode, waktu untuk memuat gambar BC berkurang secara signifikan dibandingkan dengan format seperti JPEG.

Kapan menggunakan Kompresi Blok

Anda harus mempertimbangkan untuk menggunakan blokir gambar terkompresi di aplikasi Anda alih-alih format lain seperti JPEG jika Anda ingin mengurangi konsumsi memori bitmap atau ingin mengurangi dekode dan waktu muat.

Namun, kompresi blok tidak sesuai untuk semua kasus dan memerlukan beberapa tradeoff. Pertama, algoritma kompresi blok hilang. Kompresi blok bekerja dengan baik dengan konten fotografi alami tetapi dapat memperkenalkan artefak visual yang tidak diinginkan ke dalam gambar dengan batas kontras yang tajam dan tinggi, seperti cuplikan layar yang dihasilkan komputer. Anda harus memastikan bahwa aset gambar terkompresi blok Anda memiliki kualitas gambar yang dapat diterima sebelum menggunakannya.

Kedua, blokir file DDS terkompresi umumnya menggunakan lebih banyak ruang pada disk daripada gambar JPEG yang sebanding. Ini pada gilirannya akan meningkatkan ukuran paket aplikasi dan persyaratan bandwidth jaringan Anda.

Menggunakan Kompresi Blok

Bagian ini menjelaskan cara membuat dan menggunakan aset terkompresi blok di aplikasi Direct2D.

Gambaran Umum

File DDS terkompresi blok adalah format yang dioptimalkan runtime, yang berarti bahwa file tersebut secara khusus dioptimalkan untuk performa yang baik pada runtime aplikasi. Kami menyarankan agar Anda terus menggunakan alur pembuatan dan pengeditan aset yang ada, dan hanya mengonversi ke format terkompresi blok saat Anda mengimpornya ke proyek aplikasi Anda, atau pada waktu build.

Persyaratan DDS

Format file DDS dirancang untuk mendukung berbagai fitur yang digunakan dalam Direct3D. Direct2D hanya menggunakan subset fitur-fitur ini. Oleh karena itu ketika Anda membuat gambar DDS untuk digunakan dengan Direct2D, Anda harus mengingat batasan berikut:

  • Hanya nilai DXGI_FORMAT berikut yang diizinkan:
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • Data alfa yang telah ditentukan sebelumnya harus digunakan. Ini termasuk file DDS warisan menggunakan format yang secara eksplisit menentukan alfa yang telah ditentukan sebelumnya (DXT1, DXT2, DXT4), serta file DDS yang menggunakan struktur DDS_HEADER_DX10 dengan nilai DDS_ALPHA_MODE_OPAQUE dan DDS_ALPHA_MODE_PREMULTIPLIED.
  • Dimensi X dan Y harus kelipatan 4 piksel.
  • Tekstur volume, peta kubus, mipmap, atau array tekstur tidak diperbolehkan. Anda hanya boleh menggunakan gambar sumber bingkai tunggal.

Menghasilkan aset Terkompresi Blok

Ada berbagai alat penulisan DDS yang tersedia untuk membuat atau mengonversi file DDS terkompresi blok. Perhatikan bahwa tidak semua alat mendukung persyaratan untuk menggunakan file DDS dengan Direct2D, seperti yang dijelaskan di bagian sebelumnya.

Dimulai dengan Visual Studio 2013, Anda dapat membuat Visual Studio mengonversi aset visual yang ada seperti JPEG dan PNG ke format terkompresi blok DDS yang benar sebagai bagian otomatis dari proses build Anda. Ini dicapai menggunakan langkah build kustom Tugas Konten Gambar.

Untuk informasi tentang cara menyiapkan ini untuk proyek Anda, lihat : Cara: Mengekspor Tekstur untuk Digunakan dengan Direct2D atau Aplikasi Javascipt.

API Direct2D

Direct2D diperbarui di Windows 8.1 untuk mendukung format piksel berikut:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

Untuk format sebelumnya, Anda harus menggunakan alfa yang telah ditentukan sebelumnya. Selain itu, format ini hanya valid untuk digunakan sebagai sumber, bukan target. Misalnya, ini berarti Anda dapat membuat bitmap Direct2D menggunakan BC1, tetapi bukan konteks perangkat.

Metode berikut diperbarui dalam Windows 8.1 untuk mendukung format BC:

Perhatikan bahwa CreateBitmapFromWicBitmap mengambil IWICBitmapSource sebagai antarmuka; namun dalam Windows 8.1 WIC tidak mendukung perolehan data terkompresi blok dari IWICBitmapSource, dan tidak ada format piksel WIC yang sesuai dengan DXGI_FORMAT_BC1_UNORM, dll. Sebaliknya, CreateBitmapFromWicBitmap menentukan apakah IWICBitmapSource adalah DDS IWICBitmapFrameDecode yang valid dan langsung memuat data terkompresi blok. Anda dapat secara eksplisit menentukan format piksel dalam struct D2D1_BITMAP_PROPERTIES1 , atau mengizinkan Direct2D untuk secara otomatis menentukan format yang benar.

API Komponen Pencitraan Windows

Komponen Pencitraan Windows (WIC) menambahkan codec DDS baru di Windows 8.1. Selain itu, ia menambahkan antarmuka baru yang mendukung akses data khusus DDS, termasuk memblokir data piksel terkompresi:

Memblokir format piksel WIC Terkompresi

Tidak ada format piksel terkompresi blok WIC baru di Windows 8.1. Sebagai gantinya, jika Anda mendapatkan IWICBitmapFrameDecode dari dekoder DDS dan memanggil CopyPixels, Anda akan menerima piksel standar yang tidak dikompresi seperti WICPixelFormat32bppPBGRA. Anda dapat menggunakan IWICDdsFrameDecode::CopyBlocks untuk mendapatkan data terkompresi blok mentah dalam bentuk buffer memori dari file DDS.

Akses DDS multi-bingkai

Format file DDS memungkinkan beberapa gambar terkait disimpan dalam satu file. Misalnya, file DDS mungkin berisi cubemap, tekstur volume, atau array tekstur, yang semuanya dapat dimigrasikan. Di Direct3D, beberapa gambar ini diekspos sebagai subsumber daya. Di WIC, beberapa gambar diekspos sebagai bingkai (IWICBitmapFrameDecode dan IWICBitmapFrameEncode).

WIC hanya mendukung gagasan array dimensi tunggal bingkai, sementara DDS mendukung tiga dimensi independen (meskipun hanya dua yang dapat digunakan dalam satu file). WIC menyediakan metode kenyamanan untuk membantu pemetaan antara sub sumber daya DDS dan bingkai WIC. Untuk pendekodean, IWICDdsDecoder::GetFrame memungkinkan Anda menentukan indeks array, tingkat mip, dan indeks poong subsumber daya, dan mengembalikan bingkai WIC yang benar.

Untuk pengodean, IWICDdsEncoder::CreateNewFrame menghitung indeks array, tingkat mip, dan indeks ipotong yang dihasilkan saat Anda membuat bingkai baru. Anda harus terlebih dahulu memanggil IWICDdsEncoder::SetParameters untuk menentukan parameter file khusus DDS.

Cara: Mengekspor Tekstur untuk Digunakan dengan Aplikasi Direct2D atau Javascipt

Referensi untuk DDS

Kompresi Blok