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

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.

DDS