Membuka kemasan dan mengemas DXGI_FORMAT untuk Pengeditan Gambar In-Place

File D3DX_DXGIFormatConvert.inl berisi fungsi konversi format sebaris yang dapat Anda gunakan dalam shader komputasi atau shader piksel pada perangkat keras Direct3D 11. Anda dapat menggunakan fungsi-fungsi ini dalam aplikasi Anda untuk secara bersamaan membaca dari dan menulis ke tekstur. Artinya, Anda dapat melakukan pengeditan gambar di tempat. Untuk menggunakan fungsi konversi format sebaris ini, sertakan file D3DX_DXGIFormatConvert.inl dalam aplikasi Anda.

Header D3DX_DXGIFormatConvert.inl dikirim di DirectX SDK warisan. Ini juga termasuk dalam paket NuGet Microsoft.DXSDK.D3DX .

Tampilan Akses Tidak Berurutan (UAV) Direct3D 11 dari sumber daya Texture1D, Texture2D, atau Texture3D mendukung akses acak baca dan tulis ke memori dari shader komputasi atau shader piksel. Namun, Direct3D 11 mendukung secara bersamaan baik membaca dari dan menulis hanya ke format tekstur DXGI_FORMAT_R32_UINT. Misalnya, Direct3D 11 tidak mendukung secara bersamaan baik membaca dari dan menulis ke format lain yang lebih berguna, seperti DXGI_FORMAT_R8G8B8A8_UNORM. Anda hanya dapat menggunakan UAV untuk menulis akses acak ke format lain tersebut, atau Anda hanya dapat menggunakan Tampilan Sumber Daya Shader (SRV) untuk akses acak yang dibaca dari format lain tersebut. Perangkat keras konversi format tidak tersedia untuk dibaca dan ditulis secara bersamaan ke format lain tersebut.

Namun, Anda masih dapat membaca dari dan menulis ke format lain secara bersamaan dengan mentransmisikan tekstur ke format tekstur DXGI_FORMAT_R32_UINT saat Anda membuat UAV, selama format asli sumber daya mendukung transmisi ke DXGI_FORMAT_R32_UINT. Sebagian besar format 32 bit per elemen mendukung transmisi ke DXGI_FORMAT_R32_UINT. Dengan mentransmisikan tekstur ke format tekstur DXGI_FORMAT_R32_UINT saat membuat UAV, Anda kemudian dapat melakukan baca dan tulis secara bersamaan ke tekstur selama shader melakukan pembukaan format manual pada baca dan kemasan saat menulis.

Manfaat transmisi tekstur ke format tekstur DXGI_FORMAT_R32_UINT adalah bahwa nanti Anda dapat menggunakan format yang sesuai (misalnya, DXGI_FORMAT_R16G16_FLOAT) dengan tampilan lain pada tekstur yang sama, seperti Tampilan Target Render (RTV) atau SRV. Oleh karena itu, perangkat keras dapat melakukan bongkar dan kemasan format otomatis yang khas, dapat melakukan pemfilteran tekstur, dan sebagainya di mana tidak ada batasan perangkat keras.

Skenario berikut mengharuskan aplikasi mengambil urutan tindakan berikut untuk melakukan pengeditan gambar di tempat.

Misalkan Anda ingin membuat tekstur di mana Anda dapat menggunakan shader piksel atau shader komputasi untuk melakukan pengeditan di tempat, dan Anda ingin data tekstur disimpan dalam format yang merupakan turunan dari salah satu format TYPELESS berikut:

  • DXGI_FORMAT_R10G10B10A2_TYPELESS
  • DXGI_FORMAT_R8G8B8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8A8_TYPELESS
  • DXGI_FORMAT_B8G8R8X8_TYPELESS
  • DXGI_FORMAT_R16G16_TYPELESS

Misalnya, format DXGI_FORMAT_R10G10B10A2_UNORM adalah turunan dari format DXGI_FORMAT_R10G10B10A2_TYPELESS. Oleh karena itu, DXGI_FORMAT_R10G10B10A2_UNORM mendukung pola penggunaan yang dijelaskan dalam urutan berikut. Format yang turun dari DXGI_FORMAT_R32_TYPELESS, seperti DXGI_FORMAT_R32_FLOAT, didukung sepele tanpa memerlukan bantuan konversi format apa pun yang dijelaskan dalam urutan berikut.

Untuk melakukan pengeditan gambar di tempat

  1. Buat tekstur dengan format dependen TYPELESS yang sesuai yang ditentukan dalam skenario sebelumnya bersama dengan bendera ikat yang diperlukan, seperti D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE.

  2. Untuk pengeditan gambar di tempat, buat UAV dengan format DXGI_FORMAT_R32_UINT. API Direct3D 11 biasanya tidak memungkinkan transmisi antara format "keluarga" yang berbeda. Namun, API Direct3D 11 membuat pengecualian dengan format DXGI_FORMAT_R32_UINT.

  3. Di shader komputasi atau shader piksel, gunakan fungsi paket format sebaris dan bongkah yang sesuai yang disediakan dalam file D3DX_DXGIFormatConvert.inl. Misalnya, anggap DXGI_FORMAT_R32_UINT UAV tekstur benar-benar menyimpan data berformat DXGI_FORMAT_R10G10B10A2_UNORM. Setelah aplikasi membaca uint dari UAV ke dalam shader, aplikasi harus memanggil fungsi berikut untuk membuka kemasan format tekstur:

    XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
    

    Kemudian, untuk menulis ke UAV dalam shader yang sama, aplikasi memanggil fungsi berikut untuk mengemas data shader ke dalam uint yang dapat ditulis aplikasi ke UAV:

    UINT D3DX_FLOAT4_to_R10G10B10A2_UNORM(hlsl_precise XMFLOAT4 unpackedInput)
    
  4. Aplikasi kemudian dapat membuat tampilan lain, seperti SRV, dengan format yang diperlukan. Misalnya, aplikasi dapat membuat SRV dengan format DXGI_FORMAT_R10G10B10A2_UNORM jika sumber daya dibuat sebagai DXGI_FORMAT_R10G10B10A2_TYPELESS. Ketika shader mengakses SRV tersebut, perangkat keras dapat melakukan konversi jenis otomatis seperti biasa.

Catatan

Jika shader hanya harus menulis ke UAV, atau membaca sebagai SRV, tidak ada pekerjaan konversi ini yang diperlukan karena Anda dapat menggunakan UAV atau SRV yang sepenuhnya ditik. Fungsi konversi format yang disediakan di D3DX_DXGIFormatConvert.inl berpotensi berguna hanya jika Anda ingin melakukan pembacaan simultan dari dan menulis ke UAV tekstur.

 

Berikut ini adalah daftar fungsi konversi format yang disertakan dalam file D3DX_DXGIFormatConvert.inl. Fungsi-fungsi ini dikategorikan oleh DXGI_FORMAT bahwa fungsi tersebut membuka kemasan dan paket. Masing-masing format yang didukung turun dari salah satu format TYPELESS yang tercantum dalam skenario sebelumnya dan mendukung transmisi ke DXGI_FORMAT_R32_UINT sebagai UAV.

DXGI_FORMAT_R10G10B10A2_UNORM

XMFLOAT4 D3DX_R10G10B10A2_UNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R10G10B10A2_UNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_R10G10B10A2_UINT

XMUINT4 D3DX_R10G10B10A2_UINT_to_UINT4(UINT packedInput)
UINT    D3DX_UINT4_to_R10G10B10A2_UINT(XMUINT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_UNORM

XMFLOAT4 D3DX_R8G8B8A8_UNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_UNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_UNORM_SRGB

XMFLOAT4 D3DX_R8G8B8A8_UNORM_SRGB_to_FLOAT4_inexact(UINT packedInput) *
XMFLOAT4 D3DX_R8G8B8A8_UNORM_SRGB_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_UNORM_SRGB(hlsl_precise XMFLOAT4 unpackedInput)

Catatan

Fungsi jenis _inexact menggunakan instruksi shader yang tidak memiliki presisi yang cukup tinggi untuk memberikan jawaban yang tepat. Fungsi alternatif menggunakan tabel pencarian yang disimpan dalam shader untuk memberikan konversi SRGB-float> yang tepat.

 

DXGI_FORMAT_R8G8B8A8_UINT

XMUINT4 D3DX_R8G8B8A8_UINT_to_UINT4(UINT packedInput)
XMUINT  D3DX_UINT4_to_R8G8B8A8_UINT(XMUINT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_SNORM

XMFLOAT4 D3DX_R8G8B8A8_SNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_SNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_R8G8B8A8_SINT

XMINT4 D3DX_R8G8B8A8_SINT_to_INT4(UINT packedInput)
UINT   D3DX_INT4_to_R8G8B8A8_SINT(XMINT4 unpackedInput)

DXGI_FORMAT_B8G8R8A8_UNORM

XMFLOAT4 D3DX_B8G8R8A8_UNORM_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_B8G8R8A8_UNORM(hlsl_precise XMFLOAT4 unpackedInput)

DXGI_FORMAT_B8G8R8A8_UNORM_SRGB

XMFLOAT4 D3DX_B8G8R8A8_UNORM_SRGB_to_FLOAT4_inexact(UINT packedInput) *
XMFLOAT4 D3DX_B8G8R8A8_UNORM_SRGB_to_FLOAT4(UINT packedInput)
UINT     D3DX_FLOAT4_to_R8G8B8A8_UNORM_SRGB(hlsl_precise XMFLOAT4 unpackedInput)

Catatan

Fungsi jenis _inexact menggunakan instruksi shader yang tidak memiliki presisi yang cukup tinggi untuk memberikan jawaban yang tepat. Fungsi alternatif menggunakan tabel pencarian yang disimpan dalam shader untuk memberikan konversi SRGB-float> yang tepat.

 

DXGI_FORMAT_B8G8R8X8_UNORM

XMFLOAT3 D3DX_B8G8R8X8_UNORM_to_FLOAT3(UINT packedInput)
UINT     D3DX_FLOAT3_to_B8G8R8X8_UNORM(hlsl_precise XMFLOAT3 unpackedInput)

DXGI_FORMAT_B8G8R8X8_UNORM_SRGB

XMFLOAT3 D3DX_B8G8R8X8_UNORM_SRGB_to_FLOAT3_inexact(UINT packedInput) *
XMFLOAT3 D3DX_B8G8R8X8_UNORM_SRGB_to_FLOAT3(UINT packedInput)
UINT     D3DX_FLOAT3_to_B8G8R8X8_UNORM_SRGB(hlsl_precise XMFLOAT3 unpackedInput)

Catatan

Fungsi jenis _inexact menggunakan instruksi shader yang tidak memiliki presisi yang cukup tinggi untuk memberikan jawaban yang tepat. Fungsi alternatif menggunakan tabel pencarian yang disimpan dalam shader untuk memberikan konversi SRGB-float> yang tepat.

 

DXGI_FORMAT_R16G16_FLOAT

XMFLOAT2 D3DX_R16G16_FLOAT_to_FLOAT2(UINT packedInput)
UINT     D3DX_FLOAT2_to_R16G16_FLOAT(hlsl_precise XMFLOAT2 unpackedInput)

DXGI_FORMAT_R16G16_UNORM

XMFLOAT2 D3DX_R16G16_UNORM_to_FLOAT2(UINT packedInput)
UINT     D3DX_FLOAT2_to_R16G16_UNORM(hlsl_precise FLOAT2 unpackedInput)

DXGI_FORMAT_R16G16_UINT

XMUINT2 D3DX_R16G16_UINT_to_UINT2(UINT packedInput)
UINT    D3DX_UINT2_to_R16G16_UINT(XMUINT2 unpackedInput)

DXGI_FORMAT_R16G16_SNORM

XMFLOAT2 D3DX_R16G16_SNORM_to_FLOAT2(UINT packedInput)
UINT     D3DX_FLOAT2_to_R16G16_SNORM(hlsl_precise XMFLOAT2 unpackedInput)

DXGI_FORMAT_R16G16_SINT

XMINT2 D3DX_R16G16_SINT_to_INT2(UINT packedInput)
UINT   D3DX_INT2_to_R16G16_SINT(XMINT2 unpackedInput)

Panduan Pemrograman untuk HLSL

Panduan Pemrograman untuk HLSL