Kontrol Gamma (Direct3D 9)

Kontrol Gamma memungkinkan Anda mengubah cara sistem menampilkan isi permukaan, tanpa memengaruhi isi permukaan itu sendiri. Anggap kontrol ini sebagai filter yang sangat sederhana yang diterapkan Direct3D ke data karena meninggalkan permukaan dan sebelum dirender di layar.

Kontrol Gamma adalah milik rantai pertukaran. Kontrol Gamma memungkinkan untuk secara dinamis mengubah bagaimana tingkat merah, hijau, dan biru permukaan memetakan ke tingkat aktual yang ditampilkan sistem. Dengan mengatur tingkat gamma, Anda dapat menyebabkan layar pengguna berkedip warna - merah saat karakter pengguna dibidik, hijau saat karakter mengambil item baru, dan sebagainya - tanpa menyalin gambar baru ke buffer bingkai untuk mencapai efeknya. Atau, Anda dapat menyesuaikan tingkat warna untuk menerapkan bias warna ke gambar di buffer belakang.

Selalu ada setidaknya satu rantai pertukaran (rantai pertukaran implisit) untuk setiap perangkat karena Direct3D 9 memiliki satu rantai pertukaran sebagai properti perangkat. Karena ramp gamma adalah milik rantai pertukaran, gamma ramp dapat diterapkan ketika rantai pertukaran berjendela. Jalan gamma segera berlaku. Tidak ada yang menunggu operasi sinkronisasi vertikal.

Metode SetGammaRamp dan GetGammaRamp memungkinkan Anda memanipulasi tingkat ramp yang memengaruhi komponen warna merah, hijau, dan biru piksel dari permukaan sebelum dikirim ke pengonversi digital-ke-analog (DAC) untuk ditampilkan.

Tingkat Ramp Gamma

Di Direct3D, istilah gamma ramp menjelaskan sekumpulan nilai yang memetakan tingkat komponen warna tertentu - merah, hijau, biru - untuk semua piksel dalam buffer bingkai ke tingkat baru yang diterima oleh DAC untuk ditampilkan. Remapping dilakukan dengan cara tiga tabel pencarian, satu untuk setiap komponen warna.

Berikut cara kerjanya: Direct3D mengambil piksel dari buffer bingkai dan mengevaluasi komponen warna merah, hijau, dan biru individualnya. Setiap komponen diwakili oleh nilai dari 0 hingga 65535. Direct3D mengambil nilai asli dan menggunakannya untuk mengindeks array 256-elemen (ramp), di mana setiap elemen berisi nilai yang menggantikan yang asli. Direct3D melakukan proses pencarian dan penggantian ini untuk setiap komponen warna setiap piksel dalam buffer bingkai, sehingga mengubah warna akhir untuk semua piksel di layar.

Sangat berguna untuk memvisualisasikan nilai ramp dengan membuat grafik, seperti yang ditunjukkan pada dua grafik berikut. Grafik kiri menunjukkan ramp yang tidak memodifikasi warna sama sekali. Grafik yang tepat menunjukkan ramp yang memberlakukan bias negatif pada komponen warna tempat grafik diterapkan.

grafik nilai ramp gamma

Elemen array untuk grafik di sebelah kiri berisi nilai yang identik dengan indeksnya - 0 dalam elemen pada indeks 0, dan 65535 pada indeks 255. Jenis ramp ini adalah default, karena tidak mengubah nilai input sebelum ditampilkan. Grafik yang tepat memberikan lebih banyak variasi; ramp berisi nilai yang berkisar dari 0 di elemen pertama hingga 32768 di elemen terakhir, dengan nilai berkisar secara seragam di antaranya. Efeknya adalah bahwa komponen warna yang menggunakan ramp ini muncul dibisukan pada layar. Anda tidak terbatas pada penggunaan grafik linier; jika aplikasi Anda dapat menetapkan pemetaan arbitrer jika diperlukan. Anda bahkan dapat mengatur entri ke semua nol untuk menghapus komponen warna sepenuhnya dari tampilan.

Mengatur dan Mengambil Tingkat Ramp Gamma

Tingkat ramp Gamma adalah tabel pencarian efektif yang digunakan Direct3D untuk memetakan komponen warna buffer bingkai ke tingkat baru yang akan ditampilkan. Anda dapat mengatur dan mengambil tingkat ramp untuk permukaan utama dengan memanggil metode SetGammaRamp dan GetGammaRamp . SetGammaRamp menerima dua parameter dan GetGammaRamp menerima satu parameter. Untuk SetGammaRamp, parameter pertama adalah D3DSGR_CALIBRATE atau D3DSGR_NO_CALIBRATION. Parameter kedua, pRamp, adalah penunjuk ke struktur D3DGAMMARAMP . Struktur D3DGAMMARAMP berisi tiga array WORD 256 elemen, masing-masing satu array berisi landai gamma merah, hijau, dan biru. GetGammaRamp memiliki satu parameter yang membawa pointer ke jenis D3DGAMMARAMP yang akan diisi dengan ramp gamma saat ini.

Anda dapat menyertakan nilai D3DSGR_CALIBRATE untuk parameter pertama SetGammaRamp untuk memanggil calibrator saat mengatur tingkat gamma baru. Mengkalibrasi landaian gamma menimbulkan beberapa overhead pemrosesan, dan tidak boleh sering digunakan. Mengatur ramp gamma yang dikalibrasi memberikan nilai gamma yang konsisten dan absolut untuk pengguna, terlepas dari adaptor tampilan dan monitor.

Tidak semua sistem mendukung kalibrasi gamma. Untuk menentukan apakah kalibrasi gamma didukung, panggil GetDeviceCaps, dan periksa anggota Caps2 dari struktur D3DCAPS9 terkait setelah metode kembali. Jika bendera kemampuan D3DCAPS2_CANCALIBRATEGAMMA ada, kalibrasi gamma didukung.

Saat mengatur tingkat ramp baru, perlu diingat bahwa tingkat yang Anda tetapkan dalam array hanya digunakan saat aplikasi Anda berada dalam mode eksklusif layar penuh. Setiap kali aplikasi Anda berubah ke mode normal, tingkat ramp disisihkan, berlaku lagi ketika aplikasi menginstal ulang mode layar penuh.

Jika perangkat tidak mendukung gamma landai dalam mode presentasi rantai pertukaran saat ini (layar penuh atau berjendela), tidak ada nilai kesalahan yang dikembalikan. Aplikasi dapat memeriksa bit kemampuan D3DCAPS2_FULLSCREENGAMMA dan D3DCAPS2_CANCALIBRATEGAMMA di anggota Caps2 dari jenis D3DCAPS9 untuk menentukan kemampuan perangkat dan apakah kalibrator diinstal.

Permukaan Direct3D