Panduan Pemrograman untuk DDS
Direct3D mengimplementasikan format file DDS untuk menyimpan tekstur yang tidak dikompresi atau terkompresi (DXTn). Format file mengimplementasikan beberapa jenis yang sedikit berbeda yang dirancang untuk menyimpan berbagai jenis data, dan mendukung tekstur lapisan tunggal, tekstur dengan mipmap, peta kubus, peta volume, dan array tekstur (dalam Direct3D 10/11). Bagian ini menjelaskan tata letak file DDS.
Untuk bantuan membuat tekstur di Direct3D 11, lihat Cara: Membuat Tekstur. Untuk bantuan di Direct3D 9, lihat Dukungan Tekstur di D3DX (Direct3D 9).
- Tata Letak File DDS
- Varian DDS
- Menggunakan Array Tekstur di Direct3D 10/11
- Format Sumber Daya File DDS Umum dan Konten Header Terkait
- Topik terkait
Tata Letak File DDS
File DDS adalah file biner yang berisi informasi berikut:
DWORD (angka ajaib) yang berisi empat nilai kode karakter 'DDS ' (0x20534444).
Deskripsi data dalam file.
Data dijelaskan dengan deskripsi header menggunakan DDS_HEADER; format piksel ditentukan menggunakan DDS_PIXELFORMAT. Perhatikan bahwa struktur DDS_HEADER dan DDS_PIXELFORMAT menggantikan struktur DDSURFACEDESC2, DDSCAPS2, dan DDPIXELFORMAT DirectDraw 7 yang tidak digunakan lagi. DDS_HEADER adalah biner yang setara dengan DDSURFACEDESC2 dan DDSCAPS2. DDS_PIXELFORMAT adalah biner yang setara dengan DDPIXELFORMAT.
DWORD dwMagic; DDS_HEADER header;
Jika DDS_PIXELFORMAT dwFlags diatur ke DDPF_FOURCC dan dwFourCC diatur ke "DX10" struktur DDS_HEADER_DXT10 tambahan akan ada untuk mengakomodasi array tekstur atau format DXGI yang tidak dapat diekspresikan sebagai format piksel RGB seperti format floating point, format sRGB dll. Ketika struktur DDS_HEADER_DXT10 hadir, seluruh deskripsi data akan terlihat seperti ini.
DWORD dwMagic; DDS_HEADER header; DDS_HEADER_DXT10 header10;
Penunjuk ke array byte yang berisi data permukaan utama.
BYTE bdata[]
Penunjuk ke array byte yang berisi permukaan yang tersisa seperti; tingkat mipmap, wajah dalam peta kubus, kedalaman dalam tekstur volume. Ikuti tautan ini untuk informasi selengkapnya tentang tata letak file DDS untuk: tekstur, peta kubus, atau tekstur volume.
BYTE bdata2[]
Untuk dukungan perangkat keras yang luas, kami sarankan Anda menggunakan DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_R16G16_SNORM, DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM_SRGB, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM_SRGB, DXGI_FORMAT_BC3_UNORM, atau format DXGI_FORMAT_BC3_UNORM_SRGB .
Untuk informasi selengkapnya tentang format tekstur terkompresi, lihat Kompresi Blok Tekstur di Direct3D 11 dan Kompresi Blok (Direct3D 10).
Pustaka D3DX (misalnya, D3DX11.lib) dan pustaka serupa lainnya secara tidak andal atau tidak konsisten memberikan nilai pitch dalam anggota dwPitchOrLinearSize dari struktur DDS_HEADER . Oleh karena itu, ketika Anda membaca dan menulis ke file DDS, kami sarankan Anda menghitung nada dengan salah satu cara berikut untuk format yang ditunjukkan:
Untuk format terkompresi blok, komputasi pitch sebagai:
max( 1, ((width+3)/4) ) * ukuran blok
Ukuran blok adalah 8 byte untuk format DXT1, BC1, dan BC4, dan 16 byte untuk format terkompresi blok lainnya.
Untuk format R8G8_B8G8, G8R8_G8B8, yang dikemas UYVY warisan, dan warisan YUY2, komputasi nada sebagai:
((lebar+1) >> 1) * 4
Untuk format lain, komputasi pitch sebagai:
( lebar * bit per piksel + 7 ) / 8
Anda membagi dengan 8 untuk perataan byte.
Catatan
Nilai pitch yang Anda hitung tidak selalu sama dengan nada yang disediakan runtime, yang selaras dengan DWORD dalam beberapa situasi dan byte-aligned dalam situasi lain. Oleh karena itu, kami sarankan Anda menyalin baris pemindaian pada satu waktu daripada mencoba menyalin seluruh gambar dalam satu salinan.
Varian DDS
Ada banyak alat yang membuat dan menggunakan file DDS, tetapi dapat bervariasi dalam detail apa yang mereka butuhkan di header. Penulis harus mengisi header sepenuhnya mungkin, dan pembaca harus memeriksa nilai minimal untuk kompatibilitas maksimum. Untuk memvalidasi file DDS, pembaca harus memastikan file setidaknya 128 byte panjang untuk mengakomodasi nilai ajaib dan header dasar, nilai ajaib adalah 0x20534444 ("DDS "), ukuran DDS_HEADER adalah 124, dan DDS_PIXELFORMAT dalam ukuran header adalah 32. Jika DDS_PIXELFORMAT dwFlags diatur ke DDPF_FOURCC dan dwFourCC diatur ke "DX10", maka ukuran file total harus setidaknya 148 byte.
Ada beberapa varian umum yang digunakan di mana format piksel diatur ke kode DDPF_FOURCC di mana dwFourCC diatur ke nilai enumerasi D3DFORMAT atau DXGI_FORMAT. Tidak ada cara untuk mengetahui apakah nilai enumerasi adalah D3DFORMAT atau DXGI_FORMAT, jadi sangat disarankan agar ekstensi "DX10" dan header DDS_HEADER_DXT10 digunakan sebagai gantinya untuk menyimpan dxgiFormat ketika DDS_PIXELFORMAT dasar tidak dapat mengekspresikan format.
DDS_PIXELFORMAT standar harus lebih disukai untuk kompatibilitas maksimum untuk menyimpan data RGB yang tidak dikompresi dan data DXT1-5 karena tidak semua alat DDS mendukung ekstensi DX10.
Menggunakan Array Tekstur di Direct3D 10/11
Struktur DDS baru (DDS_HEADER dan DDS_HEADER_DXT10) di Direct3D 10/11 memperluas format file DDS untuk mendukung array tekstur, yang merupakan jenis sumber daya baru di Direct3D 10/11. Berikut adalah beberapa kode sampel yang menunjukkan cara mengakses berbagai tingkat mipmap dalam array tekstur, menggunakan header baru.
DWORD dwMagic;
DDS_HEADER header;
DDS_HEADER_DXT10 header10;
for (int iArrayElement = 0; iArrayElement < header10.arraySize; iArrayElement++)
{
for (int iMipLevel = 0; iMipLevel < header.dwMipMapCount; iMipLevel++)
{
...
}
}
Format Sumber Daya File DDS Umum dan Konten Header Terkait
Format Sumber Daya | dwFlags | dwRGBBitCount | dwRBitMask | dwGBitMask | dwBBitMask | dwABitMask |
---|---|---|---|---|---|---|
DXGI_FORMAT_R8G8B8A8_UNORM D3DFMT_A8B8G8R8 |
DDS_RGBA | 32 | 0xff | 0xff00 | 0xff0000 | 0xff000000 |
DXGI_FORMAT_R16G16_UNORM D3DFMT_G16R16 |
DDS_RGBA | 32 | 0xffff | 0xffff0000 | ||
** DXGI_FORMAT_R10G10B10A2_UNORM D3DFMT_A2B10G10R10 |
DDS_RGBA | 32 | 0x3ff | 0xffc00 | 0x3ff00000 | |
DXGI_FORMAT_R16G16_UNORM D3DFMT_G16R16 |
DDS_RGB | 32 | 0xffff | 0xffff0000 | ||
DXGI_FORMAT_B5G5R5A1_UNORM D3DFMT_A1R5G5B5 |
DDS_RGBA | 16 | 0x7c00 | 0x3e0 | 0x1f | 0x8000 |
DXGI_FORMAT_B5G6R5_UNORM D3FMT_R5G6B5 |
DDS_RGB | 16 | 0xf800 | 0x7e0 | 0x1f | |
DXGI_A8_UNORM D3DFMT_A8 |
DDS_ALPHA | 8 | 0xff | |||
D3DFMT_A8R8G8B8 |
DDS_RGBA | 32 | 0xff0000 | 0xff00 | 0xff | 0xff000000 |
D3DFMT_X8R8G8B8 |
DDS_RGB | 32 | 0xff0000 | 0xff00 | 0xff | |
D3DFMT_X8B8G8R8 |
DDS_RGB | 32 | 0xff | 0xff00 | 0xff0000 | |
** D3DFMT_A2R10G10B10 |
DDS_RGBA | 32 | 0x3ff00000 | 0xffc00 | 0x3ff | 0xc0000000 |
D3DFMT_R8G8B8 |
DDS_RGB | 24 | 0xff0000 | 0xff00 | 0xff | |
D3DFMT_X1R5G5B5 |
DDS_RGB | 16 | 0x7c00 | 0x3e0 | 0x1f | |
D3DFMT_A4R4G4B4 |
DDS_RGBA | 16 | 0xf00 | 0xf0 | 0xf | 0xf000 |
D3DFMT_X4R4G4B4 |
DDS_RGB | 16 | 0xf00 | 0xf0 | 0xf | |
D3DFMT_A8R3G3B2 |
DDS_RGBA | 16 | 0xe0 | 0x1c | 0x3 | 0xff00 |
D3DFMT_A8L8 |
DDS_LUMINANCE | 16 | 0xff | 0xff00 | ||
D3DFMT_L16 |
DDS_LUMINANCE | 16 | 0xffff | |||
D3DFMT_L8 |
DDS_LUMINANCE | 8 | 0xff | |||
D3DFMT_A4L4 |
DDS_LUMINANCE | 8 | 0xf | 0xf0 |
Format Sumber Daya | dwFlags | dwFourCC |
---|---|---|
DXGI_FORMAT_BC1_UNORM D3DFMT_DXT1 |
DDS_FOURCC | "DXT1" |
DXGI_FORMAT_BC2_UNORM D3DFMT_DXT3 |
DDS_FOURCC | "DXT3" |
DXGI_FORMAT_BC3_UNORM D3DFMT_DXT5 |
DDS_FOURCC | "DXT5" |
* DXGI_FORMAT_BC4_UNORM |
DDS_FOURCC | "BC4U" |
* DXGI_FORMAT_BC4_SNORM |
DDS_FOURCC | "BC4S" |
* DXGI_FORMAT_BC5_UNORM |
DDS_FOURCC | "ATI2" |
* DXGI_FORMAT_BC5_SNORM |
DDS_FOURCC | "BC5S" |
DXGI_FORMAT_R8G8_B8G8_UNORM D3DFMT_R8G8_B8G8 |
DDS_FOURCC | "RGBG" |
DXGI_FORMAT_G8R8_G8B8_UNORM D3DFMT_G8R8_G8B8 |
DDS_FOURCC | "GRGB" |
* DXGI_FORMAT_R16G16B16A16_UNORM D3DFMT_A16B16G16R16 |
DDS_FOURCC | 36 |
* DXGI_FORMAT_R16G16B16A16_SNORM D3DFMT_Q16W16V16U16 |
DDS_FOURCC | 110 |
* DXGI_FORMAT_R16_FLOAT D3DFMT_R16F |
DDS_FOURCC | 111 |
* DXGI_FORMAT_R16G16_FLOAT D3DFMT_G16R16F |
DDS_FOURCC | 112 |
* DXGI_FORMAT_R16G16B16A16_FLOAT D3DFMT_A16B16G16R16F |
DDS_FOURCC | 113 |
* DXGI_FORMAT_R32_FLOAT D3DFMT_R32F |
DDS_FOURCC | 114 |
* DXGI_FORMAT_R32G32_FLOAT D3DFMT_G32R32F |
DDS_FOURCC | 115 |
* DXGI_FORMAT_R32G32B32A32_FLOAT D3DFMT_A32B32G32R32F |
DDS_FOURCC | 116 |
D3DFMT_DXT2 |
DDS_FOURCC | "DXT2" |
D3DFMT_DXT4 |
DDS_FOURCC | "DXT4" |
D3DFMT_UYVY |
DDS_FOURCC | "UYVY" |
D3DFMT_YUY2 |
DDS_FOURCC | "YUY2" |
D3DFMT_CxV8U8 |
DDS_FOURCC | 117 |
Format DXGI apa pun | DDS_FOURCC | "DX10" |
* = Pembaca DDS yang kuat harus dapat menangani kode format warisan ini. Namun, pembaca DDS seperti itu harus lebih suka menggunakan ekstensi header "DX10" ketika menulis kode format ini untuk menghindari ambiguitas.
** = Karena beberapa masalah lama dalam implementasi umum pembaca dan penulis DDS, cara paling kuat untuk menulis data 10:10:10:2-type adalah dengan menggunakan ekstensi header "DX10" dengan kode DXGI_FORMAT "24" (yaitu, nilai DXGI_FORMAT_R10G10B10A2_UNORM). D3DFMT_A2R10G10B10 data harus dikonversi ke data jenis 10:10:10:2 sebelum ditulis sebagai file DDS format DXGI_FORMAT_R10G10B10A2_UNORM.