Mengonversi data untuk ruang warna

Untuk menyusun ke layar atau melakukan operasi floating-point, Anda perlu bekerja di ruang warna yang benar. Kami menyarankan agar Anda melakukan operasi floating point di ruang warna linier. Kemudian, untuk menyajikan gambar Anda ke layar, konversikan data ke ruang warna data RGB standar (sRGB, gamma 2.2-corrected). Menyajikan ke layar di ruang warna sRGB penting untuk akurasi warna. Jika gambar tidak dikoreksi gamma 2.2, mereka mengalokasikan terlalu banyak bit atau terlalu banyak bandwidth untuk menyoroti bahwa orang tidak dapat membedakan, dan terlalu sedikit bit atau bandwidth untuk nilai bayangan yang sensitif terhadap orang, sehingga akan membutuhkan lebih banyak bit atau bandwidth untuk mempertahankan kualitas visual yang sama. Oleh karena itu, untuk memastikan akurasi warna terbaik, sajikan gambar ke layar yang dikoreksi gamma 2.2.

Akurasi warna

Untuk presentasi, format tampilan bernilai bilangan bulat (seperti DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM, dan sebagainya) selalu berisi data yang dikoreksi gamma sRGB. Format tampilan bernilai float (saat ini hanya DXGI_FORMAT_R16G16B16A16_FLOAT) berisi data bernilai linier.

Pengubah format _SRGB menunjukkan ke sistem operasi untuk membantu aplikasi menempatkan data sRGB di layar. Aplikasi harus selalu menempatkan data sRGB ke buffer belakang dengan format bernilai bilangan bulat untuk menyajikan data sRGB ke layar, bahkan jika data tidak memiliki pengubah format ini dalam nama formatnya. Untuk daftar lengkap format pemindaian tampilan:

Saat Anda menulis nilai output floating-point dari shader piksel menjadi tampilan target render (RenderTargetViews) dengan pengubah format _SRGB yang terikat ke alur, Anda mengonversinya menjadi ruang warna gamma 2.2 yang dikoreksi. Demikian pula, ketika tampilan shader-resource (ShaderResourceViews) dengan pengubah format _SRGB terikat ke alur, Anda mengonversi nilai dari ruang warna yang dikoreksi gamma 2.2 ke ruang warna linier saat Anda membacanya dari ShaderResourceView. Shader kemudian dapat melakukan operasi pada mereka.

Misalnya, gunakan kode yang mirip dengan ini untuk menulis nilai output floating-point dari shader ke dalam format RenderTargetView :

struct PSOut
{
    float4 color : SV_Target;
};

PSOut S( PSIn input )
{
    PSOut output;
    output.color = float4( 1.0, 0.0, 0.0, 1.0 );
    return output;
}

Saat rutinitas 'S' kembali, nilai floating point (1, 0, 0, 1) dikonversi ke format RenderTargetView . Kemudian, jika Anda menetapkan pengubah format _SRGB ke RenderTargetView, konversi gamma terjadi.

Ini adalah langkah-langkah yang harus diikuti untuk memastikan bahwa konten yang ditampilkan di layar memiliki akurasi warna terbaik.

Untuk memastikan akurasi warna dalam alur

  1. Jika tekstur memiliki konten sRGB, pastikan ShaderResourceView memiliki pengubah format _SRGB sehingga ketika Anda membaca dari ShaderResourceView menjadi shader, Anda mengonversi konten tekstur dari ruang warna yang dikoreksi gamma 2.2 ke ruang warna linier.
  2. Pastikan RenderTargetView juga memiliki pengubah format _SRGB sehingga nilai output shader dikonversi gamma.

Jika Anda mengikuti langkah-langkah sebelumnya, saat Anda memanggil metode IDXGISwapChain1::P resent1 , konten yang ditampilkan di layar memiliki akurasi warna terbaik.

Anda dapat menggunakan metode ID3D11Device::CreateRenderTargetView untuk membuat tampilan DXGI_FORMAT_*_SRGB pada buffer belakang dari rantai pertukaran yang anda buat hanya dengan format DXGI_FORMAT_*_UNORM . Ini adalah pengecualian khusus untuk aturan untuk membuat tampilan target render, yang menyatakan bahwa Anda dapat menggunakan format yang berbeda dengan ID3D11Device::CreateRenderTargetView hanya jika Anda membuat sumber daya yang ingin Anda lihat dengan DXGI_FORMAT_*_TYPELESS.

Untuk informasi selengkapnya tentang aturan untuk mengonversi data, lihat Aturan Konversi Data.

Untuk informasi tentang cara membaca dan menulis ke tekstur secara bersamaan, lihat Membongkah dan Mengemas DXGI_FORMAT untuk Pengeditan Gambar In-Place.

Meningkatkan presentasi dengan model balik, persegi panjang kotor, dan area tergulir