Bagikan melalui


Menggunakan koreksi gamma

Singkatnya, koreksi gamma, atau gamma, adalah nama operasi nonlinear yang digunakan sistem untuk membuat kode dan mendekode nilai piksel dalam gambar.

Apa itu gamma dan untuk apa itu?

Di akhir alur grafis, tepat di mana gambar meninggalkan komputer untuk melakukan perjalanannya di sepanjang kabel monitor, ada sepotong kecil perangkat keras yang dapat mengubah nilai piksel dengan cepat. Perangkat keras ini biasanya menggunakan tabel pencarian untuk mengubah piksel. Perangkat keras ini menggunakan nilai merah, hijau, dan biru yang berasal dari permukaan untuk ditampilkan untuk mencari nilai yang dikoreksi gamma dalam tabel dan kemudian mengirim nilai yang dikoreksi ke monitor alih-alih nilai permukaan aktual. Jadi, tabel pencarian ini adalah kesempatan untuk mengganti warna apa pun dengan warna lainnya. Meskipun tabel memiliki tingkat daya tersebut, penggunaan umumnya adalah mengubah gambar secara halus untuk mengimbangi perbedaan dalam respons monitor. Respons monitor adalah fungsi yang berkaitan dengan nilai numerik komponen merah, hijau, dan biru dari piksel dengan kecerahan piksel yang ditampilkan.

Itulah yang dimaksudkan tabel ini, tetapi pengembang game menemukan kegunaan kreatif untuk itu, seperti berkedip seluruh layar merah untuk efek psikologis. Dalam aplikasi game modern, sebagai bagian dari pasca-pemrosesan setiap bingkai, kami biasanya menyediakan cara lain untuk melakukan hal-hal seperti itu. Bahkan, kami sarankan Anda meninggalkan tabel gamma saja karena mungkin digunakan untuk mengkalibrasi respons monitor, dan perubahan grosir ke ramp gamma akan menghancurkan kalibrasi hati-hati ini.

Ilmu menentukan koreksi gamma itu kompleks, dan tidak disajikan di sini, selain untuk menerangi dari mana nama "gamma" berasal. Respons monitor CRT (yaitu, kaca kuno) adalah fungsi yang kompleks, tetapi fisika monitor ini berarti bahwa mereka menunjukkan respons yang dapat diwakili secara kasar oleh fungsi daya ini:

brightness( input ) =input gamma

Nilai gamma biasanya mendekati nilai 2,0. Monitor LCD dan semua teknologi lain yang lebih baru secara khusus direkayasa untuk menunjukkan respons serupa sehingga semua perangkat lunak dan gambar kami tidak perlu dikalibrasi ulang untuk teknologi baru tersebut. Standar sRGB menyatakan bahwa nilai gamma ini tepat 2,2, dan nilai ini telah menjadi standar yang diterapkan secara luas.

Mata manusia juga memiliki fungsi respons yang kira-kira menginversi fungsi daya CRT. Ini berarti bahwa kecerahan piksel yang dirasakan naik sangat linier dengan nilai RGB dalam piksel tersebut.

Karena nilai gamma 2.2 telah menjadi standar de-facto, kita biasanya tidak perlu terlalu khawatir tentang kurva gamma yang dikodekan dalam tabel ini, dan dapat membiarkannya sebagai pemetaan linier, satu-ke-satu. Pencocokan warna yang tepat tentu saja membutuhkan perhatian yang luar biasa dengan fungsi ini, tetapi diskusi itu berada di luar cakupan topik ini. Windows menyertakan alat yang memungkinkan pengguna mengkalibrasi tampilan mereka ke gamma 2.2, dan alat ini menggunakan perangkat keras tabel pencarian untuk mendapatkan tweak halus yang dipilih dengan hati-hati untuk komputer mereka. Pengguna dapat menjalankan alat ini dengan mencari "warna kalibrasi". Ada juga profil warna yang terdefinisi dengan baik untuk monitor tertentu yang mengotomatiskan proses ini. Alat "kalibrasi warna" dapat mendeteksi monitor yang lebih baru ini, dan memberi tahu pengguna bahwa kalibrasi sudah ada.

Gagasan pengodean undang-undang kekuasaan ke dalam nilai warna juga berguna di tempat lain dalam alur grafis, terutama dalam tekstur. Untuk tekstur, Anda menginginkan lebih presisi pada warna yang lebih gelap karena respons mata manusia logaritma yang baru saja kita bicarakan. Penanganan gamma yang cermat di bagian alur ini penting. Untuk informasi selengkapnya, lihat Mengonversi data untuk ruang warna.

Sisa topik ini hanya berfokus pada koreksi gamma di bagian terakhir alur ini, antara data buffer bingkai dan monitor. Jika Anda ingin menulis wizard kalibrasi atau membuat efek khusus di aplikasi layar penuh di mana langkah pasca-pemrosesan tidak praktis, berikut adalah info yang Anda butuhkan.

Latar belakang gamma di Windows

Komputer Windows biasanya memiliki tabel gamma yang merupakan tabel pencarian yang mengambil tiga byte dan menghasilkan kembar tiga byte. Kembung ini adalah RAM 768 (256 x 3) byte. Ini tidak masalah ketika format tampilan Anda berisi tiga nilai BYTE RGB tetapi tidak cukup ekspresif untuk menggambarkan transformasi yang mungkin Anda inginkan ketika format tampilan memiliki rentang yang lebih besar dari [0,1], seperti nilai titik mengambang. API di Windows yang mengontrol gamma telah mengikuti evolusi karena format tampilan telah menjadi lebih kompleks.

API Windows pertama yang menawarkan kontrol gamma adalah SetDeviceGammaRamp dari Windows Graphics Device Interface (GDI) dan GetDeviceGammaRamp. API ini bekerja dengan tiga array WORD 256-entry, dengan setiap pengodean WORD nol hingga satu, diwakili oleh nilai WORD 0 dan 65535. Presisi ekstra WORD biasanya tidak tersedia dalam tabel pencarian perangkat keras aktual, tetapi API ini dimaksudkan agar fleksibel. API ini, berbeda dengan yang lain yang dijelaskan kemudian di bagian ini, hanya memungkinkan penyimpangan kecil dari fungsi identitas. Bahkan, setiap entri dalam ramp harus dalam 32768 dari nilai identitas. Pembatasan ini berarti bahwa tidak ada aplikasi yang dapat mengubah tampilan sepenuhnya hitam atau ke beberapa warna lain yang tidak dapat dibaca.

API berikutnya adalah SetGammaRamp Microsoft Direct3D 9, yang mengikuti pola dan format data yang sama dengan SetDeviceGammaRamp. Nilai default dari ramp gamma Direct3D 9 tidak terlalu berguna; ini adalah ramp WORD yang diinisialisasi ke 0-255, bukan 0-65535, meskipun API didefinisikan dalam hal 0-65535.

API terbaru adalah IDXGIOutput::SetGammaControl. API ini memiliki skema yang lebih fleksibel untuk mengekspresikan kontrol gamma, karena sesuai dengan peningkatan set format tampilan DXGI, termasuk sepuluh bit bilangan bulat per saluran, format float 16-bit, dan format rentang XR_BIAS diperluas.

Semua API ini beroperasi pada perangkat keras yang sama, dan mengubah nilai yang sama. API Direct3D 9 dan DXGI adalah "hanya tulis". Anda tidak dapat membaca nilai perangkat keras, memodifikasinya, lalu mengaturnya. Anda hanya dapat mengatur jalan. Selain itu, Anda hanya dapat mengatur gamma saat aplikasi layar penuh. Pembatasan ini adalah cara lain untuk menjamin bahwa desktop selalu dapat dibaca. Artinya, aplikasi dapat mengganggu tampilannya sendiri, tetapi Windows akan memulihkan gamma ramp sebelumnya ketika aplikasi kehilangan layar penuh (misalnya, melalui alt-tab atau ctrl-alt-del).

Evolusi perangkat keras tampilan

Beberapa monitor yang lebih baru dapat menampilkan berbagai intensitas. Tetapi, ketika format tampilan hanya dapat mewakili nilai antara nol dan satu, tampilan harus memetakan nol ke nilai paling gelap dan satu ke nilai paling terang. Nilai paling terang ini mungkin terlalu terang untuk tampilan halaman Web yang nyaman dengan teks hitam di latar belakang putih tetapi indah untuk efek khusus yang terlalu terang, seperti melihat sinar matahari berkilauan dari danau atau petir menempa langit. Jadi, kita perlu cara untuk mengekspresikan rentang yang lebih luas ini. DXGI 1.1 dan yang lebih baru berisi nilai format tampilan yang memungkinkan 1.0 mewakili nilai putih yang nyaman dan mencadangkan nilai format tampilan yang lebih luas untuk efek khusus yang terlalu terang. DXGI 1.1 mendukung dua format tampilan yang dapat mengekspresikan nilai yang lebih luas ini: DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM dan titik float 16-bit. Untuk diskusi lengkap tentang format ini, lihat Detail Format yang Diperluas. Selanjutnya, kita lihat mengapa IDXGIOutput::SetGammaControl gamma API DXGI membutuhkan nilai piksel yang lebih besar dari 1.0.

Kemampuan kontrol Gamma di DXGI

DXGI memungkinkan driver tampilan mengekspresikan kontrol gammanya sebagai fungsi linier yang bijaksana. Fungsi linear langkah-bijaksana ini didefinisikan oleh titik kontrol fungsi ini, rentang nilai yang dapat dikonversi fungsi, dan operasi skala dan offset opsional tambahan yang dapat diterapkan setelah konversi. Aplikasi dapat memanggil metode IDXGIOutput::GetGammaControlCapabilities untuk mengambil semua kemampuan kontrol ini dalam struktur DXGI_GAMMA_CONTROL_CAPABILITIES .

Grafik ini menunjukkan fungsi linier hanya dengan empat titik kontrol.

fungsi linier koreksi gamma

DXGI mendefinisikan titik kontrol berdasarkan lokasinya di sepanjang sumbu warna permukaan. Dalam grafik sebelumnya, lokasi titik kontrol adalah 0, 0,5, 0,75 dan 1,0. Titik kontrol ini menunjukkan bahwa perangkat keras dapat mengonversi nilai dalam rentang 0 hingga 1,0. DXGI mencantumkan titik kontrol ini di anggota array ControlPointPositionsdari DXGI_GAMMA_CONTROL_CAPABILITIES dan selalu mendeklarasikannya dalam urutan yang meningkat. DXGI hanya mengisi elemen pertama dari array ControlPointPositions dan menunjukkan jumlah elemen dengan anggota NumGammaControlPointsdari DXGI_GAMMA_CONTROL_CAPABILITIES. Jika NumGammaControlPoints kurang dari 1025, DXGI membiarkan elemen ControlPointPositions lainnya tidak terdefinisi.

Perangkat keras yang diwakili oleh grafik ini dapat mengonversi nilai ke rentang 0 hingga 1,25. Jadi, DXGI menetapkan anggota MinConvertedValue dan MaxConvertedValue masing-masing menjadi 0,0f dan 1,25f.

DXGI menetapkan anggota scaleAndOffsetSupporteddari DXGI_GAMMA_CONTROL_CAPABILITIES untuk menunjukkan apakah perangkat keras mendukung kemampuan skala dan offset. Jika perangkat keras mendukung skala dan offset, perangkat keras menyimpan tabel pencarian satu-ke-satu sederhana tetapi kemudian menyesuaikan output tabel untuk meregangkan output ke rentang yang lebih besar dari [0,1]. Perangkat keras terlebih dahulu menskalakan nilai yang keluar dari tabel pencarian lalu mengimbanginya.

Catatan

Monitor yang berbeda yang terhubung ke komputer yang sama mungkin memiliki kemampuan kontrol gamma yang berbeda. Selain itu, kemampuan kontrol gamma sebenarnya dapat berubah tergantung pada mode tampilan output. Akibatnya, kami sarankan Anda selalu memanggil IDXGIOutput::GetGammaControlCapabilities untuk mengkueri kemampuan kontrol gamma setelah aplikasi Anda memasuki mode layar penuh.

 

Anda dapat menggunakan nilai kemampuan kontrol gamma ini untuk mendapatkan nilai kontrol yang kemudian dapat Anda atur dengan menggunakan IDXGIOutput::SetGammaControl API.

Mengatur kontrol gamma dengan DXGI

Untuk mengatur kontrol gamma, Anda meneruskan pointer ke struktur DXGI_GAMMA_CONTROL saat memanggil IDXGIOutput::SetGammaControl API.

Anda mengatur anggota Skala dan OffsetDXGI_GAMMA_CONTROL untuk menentukan nilai skala dan offset yang Anda inginkan untuk diterapkan perangkat keras ke nilai yang Anda dapatkan dari tabel pencarian. Anda dapat dengan aman mengatur Skala ke 1 dan Offset ke nol (yaitu, skala oleh satu tidak memiliki efek dan offset nol tidak berpengaruh) jika Anda tidak ingin menggunakan kemampuan skala dan offset atau jika perangkat keras tidak memiliki kemampuan tersebut.

Anda mengatur anggota array GammaCurvedari DXGI_GAMMA_CONTROL ke daftar struktur DXGI_RGB untuk titik-titik pada kurva gamma. Setiap elemen DXGI_RGB menentukan nilai float yang mewakili komponen merah, hijau, dan biru untuk titik tersebut. Kurva gamma tidak menggunakan nilai alfa. Anda menggunakan nomor yang Anda peroleh dari NumGammaControlPointsdari DXGI_GAMMA_CONTROL_CAPABILITIES untuk mengisi jumlah elemen tersebut dalam array GammaCurve . Setiap elemen yang Anda tempatkan dalam array GammaCurve adalah tinggi untuk setiap titik kontrol.

Perhatikan dalam grafik sebelumnya bahwa Anda sekarang memiliki kontrol atas penempatan vertikal setiap titik kontrol, dan Anda memiliki kontrol terpisah untuk merah, hijau, dan biru. Misalnya, Anda dapat mengatur semua nilai hijau dan biru ke nol dan mengatur nilai merah ke tangga naik dari nol ke satu. Dalam skenario ini, gambar yang ditampilkan hanya menunjukkan bagian merahnya, dengan biru dan hijau muncul sebagai hitam. Anda juga dapat mengatur tangga turun untuk semua warna, yang menghasilkan tampilan terbalik. Nilai apa pun yang Anda tempatkan dalam array GammaCurve harus secara inklusif dalam nilai yang Anda peroleh dari anggota MinConvertedValue dan MaxConvertedValuedari DXGI_GAMMA_CONTROL_CAPABILITIES.

Praktisitas kontrol Gamma

Kontrol gamma DXGI hanya berlaku selama aplikasi penuh. Windows memulihkan status tampilan sebelumnya ketika aplikasi keluar atau kembali ke mode berjendela. Tetapi Windows tidak memulihkan status gamma aplikasi Anda jika aplikasi memasuki kembali mode layar penuh. Aplikasi Anda harus secara eksplisit memulihkan status gammanya saat memasuki kembali mode layar penuh.

Tidak semua adaptor mendukung kontrol gamma. Jika adaptor tidak mendukung kontrol gamma, adaptor mengabaikan panggilan untuk mengatur gamma ramp.

Aplikasi yang berjalan di bawah desktop jarak jauh tidak dapat mengontrol gamma.

Kursor mouse, jika diimplementasikan dalam perangkat keras (seperti kebanyakan), biasanya tidak merespons pengaturan gamma.

Panduan Pemrograman untuk DXGI