Gamma (Direct3D 9)
Konten tekstur sering disimpan dalam format sRGB. Secara tradisional, alur piksel mengasumsikan warna menjadi linier sehingga operasi pencambukan dilakukan di ruang linier. Namun, karena konten sRGB dikoreksi gamma, operasi blending di ruang linier akan menghasilkan hasil yang salah. Kartu video sekarang dapat memperbaiki masalah ini dengan membatalkan koreksi gamma saat membaca konten sRGB apa pun, dan mengonversi data piksel kembali ke format sRGB saat menulis piksel. Dalam hal ini, semua operasi di dalam alur piksel dilakukan di ruang linier.
Direct3D 9 dapat:
- Menunjukkan apakah tekstur gamma 2.2 dikoreksi atau tidak (sRGB atau tidak). Driver akan mengonversi ke gamma linier untuk memadukan operasi pada waktu SetTexture, atau sampler akan mengonversinya menjadi data linier pada waktu pencarian.
- Tunjukkan apakah alur piksel harus mengoreksi kembali ke ruang sRGB saat menulis ke target render.
Semua warna lainnya (warna bening, warna bahan, warna puncak, dll.) diasumsikan berada di ruang linier. Aplikasi dapat mengoreksi warna yang ditulis ke dalam buffer bingkai menggunakan instruksi piksel shader. Linearisasi harus diterapkan hanya ke saluran RGB dan bukan ke saluran alfa.
Tidak semua format permukaan dapat di linearisasi. Hanya format yang melewati CheckDeviceFormat dengan D3DUSAGE_QUERY_SRGBREAD yang dapat di-linearisasi. Status sampler D3DSAMP_SRGBTEXTURE diabaikan untuk sisanya. Hanya format tekstur yang tidak ditandatangani yang diharapkan untuk mendukung konversi ini. Format tekstur yang tidak ditandatangani hanya mencakup komponen R, G, B, dan L. Jika saluran alfa ada, saluran tersebut diabaikan. Jika format campuran mendukung linearisasi sRGB, hanya saluran yang tidak ditandatangani yang terpengaruh. Idealnya, perangkat keras harus melakukan linearisasi sebelum pemfilteran tetapi di Direct3D 9, perangkat keras diizinkan untuk melakukan linierisasi setelah pemfilteran.
Tidak semua format permukaan dapat ditulis dalam ruang sRGB. Hanya format yang meneruskan CheckDeviceFormat dengan bendera penggunaan D3DUSAGE_QUERY_SRGBWRITE yang dapat di linearisasi. Status render D3DRS_SRGBWRITEENABLE diabaikan untuk sisanya. Delapan bit per format RGB saluran yang tidak ditandatangani diharapkan untuk mengekspos kemampuan ini.
Idealnya, perangkat keras harus melakukan operasi blending buffer bingkai di ruang linier, tetapi perangkat keras diizinkan untuk melakukannya setelah piksel shader tetapi sebelum blender buffer bingkai. Ini berarti bahwa operasi campuran buffer bingkai yang berlangsung di ruang sRGB akan menghasilkan hasil yang salah. D3DRS_SRGBWRITEENABLE dihormati saat melakukan jelas dari target render. Untuk perangkat keras yang mendukung Multiple Render Targets (Direct3D 9) atau Multiple-element Textures (Direct3D 9), hanya target atau elemen render pertama yang ditulis.
// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE // Default FALSE
// New render state (DWORD)
D3DRS_SRGBWRITEENABLE // Default FALSE
// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD
Sangat berharga bagi aplikasi untuk menjaga buffer belakang rantai pertukaran mereka di ruang linier untuk memungkinkan operasi pencambelan yang benar. Karena desktop biasanya tidak dalam ruang linier, koreksi gamma diperlukan sebelum konten buffer belakang dapat disajikan. Aplikasi dapat memengaruhi koreksi ini dengan mengalokasikan buffer tambahan dan melakukan salinan koreksinya sendiri dari buffer linier ke buffer belakang. Ini mengharuskan salinan tambahan yang dapat dihindari jika driver melakukan koreksi gamma sebagai bagian dari blit presentasi.
Di Direct3D 9, bendera baru, D3DPRESENT_LINEAR_CONTENT, tersedia untuk Present yang memungkinkan presentasi untuk secara implisit mengonversi dari ruang linier ke sRGB/gamma 2.2. Aplikasi harus menentukan bendera ini jika format backbuffer adalah titik mengambang 16-bit untuk mencocokkan mode berjendela yang ada dengan perilaku gamma layar penuh, asalkan D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION dikembalikan untuk kemampuan perangkat yang diambil melalui GetDeviceCaps.