Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Aesthetics
Gamedevelopment

Pembetulan Gamma dan Mengapa Ia Penting

by
Length:LongLanguages:

Malay (Melayu) translation by Seurion (you can also view the original English article)

Jika anda seorang pemaju permainan, anda mungkin pernah mendengar istilah gamma dan pembetulan gamma. Anda mungkin atau mungkin tidak tahu apa yang mereka maksudkan, tetapi mereka tidak sepatutnya diberhentikan.

Pemaju permainan cenderung mengabaikan gamma kerana kesannya cukup halus untuk diperbetulkan lebih kurang dengan menyesuaikan intensiti cahaya, keamatan spekular, dan sejenisnya, tetapi untuk mencapai kualiti imej yang benar dengan pencahayaan yang realistis, penting untuk memahami nilai gamma dan langkah-langkah yang diperlukan untuk mengendalikan kehadirannya dalam pengimejan digital, untuk menerima kualiti yang terbaik. Memohon pembetulan gamma yang betul adalah salah satu cara yang paling mudah untuk secara radikal meningkatkan penampilan grafik 3D masa nyata anda.

Pengenalan: Bagaimana Monitor Berfungsi

Monitor CRT yang pada mulanya digunakan untuk memaparkan komputer mempunyai sifat yang aneh: tindak balas warna di skrin mereka adalah tidak-linear berkenaan dengan nilai mentah yang diluluskan dari kad grafik.

Bukan linear, dalam pengertian ini, bermakna peningkatan salah satu komponen warna anda dengan nisbah malar (katakan, jika komponen merah warna menjadi dua kali lebih tinggi) tidak akan menyebabkan peningkatan intensiti cahaya yang dipancarkan oleh bahawa nisbah yang sama (itu bermakna, lampu merah yang dipancarkan dari skrin tidak akan dua kali lebih tinggi).

Sambutan warna monitor CRT sebenarnya merupakan fungsi eksponen. (Seperti dalam semua fizik, ini adalah cara yang lebih kompleks daripada yang kita gambarkan, tetapi untuk kesederhanaan, kita akan berpegang kepada andaian ini.) Iaitu, fungsi EmittedLight (C), di mana C adalah nilai komponen komponen (merah , hijau, atau biru) dari 0 (tiada cahaya) hingga 1 (intensiti cahaya penuh), adalah C dibangkitkan kepada beberapa kuasa γ.

Nombor ini, γ, dipanggil eksponen gamma atau hanya gamma. Nilai gamma biasa berkisar antara 2.0 hingga 2.4, dan apabila berurusan dengan gamma dalam erti kata umum, nilai itu dipersetujui untuk menjadi 2.2 sebagai kompromi, dan banyak monitor baru direka bentuk untuk mempunyai nilai gamma dengan tepat 2.2

Dalam senario umum gamma=2.2, ini adalah bagaimana monitor sebenarnya memaparkan intensiti warna dari permainan anda (lengkung hijau). Garis merah bertitik menunjukkan bagaimana monitor linear akan menunjukkan intensiti yang sama.

Dalam praktiknya, ini bermakna bahawa hitam dan putih akan ditunjukkan tidak jelas di skrin (kerana sifar yang dinaikkan kepada mana-mana kuasa adalah sifar, dan yang dibangkitkan kepada mana-mana kuasa adalah satu), tetapi semua nilai di antara akan menjadi miring tanpa cara yang boleh dipercayai untuk melihat ini berlaku hanya dengan menonton.

Misalnya, jika anda memaparkan warna yang sepatutnya dua kali lebih gelap daripada hitam—iaitu RGB (0.5, 0.5, 0.5)—itu sebenarnya akan ditunjukkan kurang daripada empat kali lebih gelap, memandangkan nilai gamma biasa sebanyak 2.2 , sejak 0.5 dinaikkan kepada 2.2 ialah sekitar 0.22. Jelas, ini bukan apa yang anda maksudkan, dan ini bukan hanya dengan monitor CRT: LCD, sementara tidak secara tidak sengaja mempunyai harta ini, direka untuk bersesuaian dengan rakan-rakan lama mereka, dan dengan itu memaparkan nilai warna anda seperti ini.

Lebih-lebih lagi, sebagai komponen merah, hijau dan biru dirawat secara berasingan, nada warna imej yang dicadangkan mudah diganggu kerana intensiti dari tiga komponen warna tidak akan bersatu seragam. Apa yang akan berlaku apabila anda memaparkan nilai warna RGB (1, 0.5, 0.5)? Komponen merah akan kekal pada 1, tetapi yang lain akan menurunkan separuh nilai mereka, sama sekali mengubah nada warna anda.

Warna kedua diperoleh dari yang pertama dengan menggunakan skala tidak linear yang memantau. Perhatikan bagaimana bukan sahaja kecerahan warna, tetapi juga ketepuannya, dipengaruhi oleh transformasi ini.

Sekarang kita telah melihat apa kesan monitor harta ini pada data warna yang diberikan kepada monitor, kita dapat melihat langkah-langkah yang ada untuk memerangi mereka.

Apakah pembetulan Gamma?

Pembetulan Gamma adalah perbuatan membongkar kerja malang monitor. Pembetulan gamma adalah pada dasarnya meningkatkan intensiti warna menjadi 1/gamma, sehingga ketika monitor pada gilirannya menaikkan nilai ke gamma, ini akan dibatalkan, dan hasilnya adalah warna yang pada awalnya kami ingin ditunjukkan.

(Ingat bahawa A dibangkitkan ke B, dan kemudian dibangkitkan ke C, sama dengan A yang diangkat ke B×C, dan inilah sebab mengapa operasi ini akan dibatalkan, seperti gamma × (1/gamma) adalah 1.)

Oleh kerana pengguna purata tidak mengkalibrasi monitor mereka untuk mempunyai tindak balas linear, banyak imej yang mereka hadapi diperbetulkan sehingga mereka tidak pernah merasakan perbezaannya. Sebagai konvensyen, kebanyakan fail gambar di Internet diedarkan dalam apa yang dipanggil ruang warna sRGB—ini bermakna bahawa nilai warna yang dimaksudkan kira-kira dikumpulkan kepada kuasa 1/2.2 sebelum memasukkannya ke dalam fail (walaupun persamaan yang lebih kompleks mengambil tempat dalam realiti). Ini memastikan semua pengguna dengan paparan konvensional melihat warna sebenar. Pengimbas, kamera dan banyak alat pengimejan digital semua mengambil kira ini, dan membetulkan keluaran mereka untuk anda semasa menyimpan dalam format imej konvensional.

Imej ini menunjukkan pemetaan intensiti warna seperti yang dihantar ke monitor oleh kad grafik, dan intensiti yang dipaparkan oleh monitor.

Lihat imej di atas. Sekiranya kita tidak mengambil kira gamma, lengkung akan menjadi eksponen (lengkung hijau yang lebih rendah). Sekiranya kita melakukan pembetulan gamma tindak balas sebenar akan linear, sebagaimana mestinya. Sebagai perbandingan, imej juga menunjukkan bagaimana graf kelihatan apabila kita melakukan pembetulan gamma tetapi monitor sebenarnya mempunyai tindak balas linear. Dalam kes ini, keamatan akan diputarbelitkan dalam keadaan yang bertentangan, dan kita dapat melihat bahawa apabila monitor nonlinear mengganggu mereka pula, ini dibatalkan, dan kita berakhir dengan garis lurus.

Bilakah saya Perlu Bimbang?

Setakat ini, kami telah menerangkan teori di sebalik fenomena ini—pasti, monitor tidak linear dan kebanyakan imej diperbetulkan supaya mereka kelihatan tepat pada monitor ini, tetapi apa yang menjadi masalah? Kenapa saya harus, pemaju permainan 3D yang bercita-cita, membimbangkan diri saya dengan pembetulan gamma dan melakukan apa-apa selain hanya mengetahui mengenainya?

Jawapannya mudah: selagi imej dibuat hanya untuk dipaparkan, masalah sebenarnya tidak wujud. Walau bagaimanapun, sebaik sahaja anda mahu program melakukan sesuatu untuk imej ini (skala mereka, gunakannya sebagai tekstur, anda namakannya), anda harus menjaga bahawa program mengetahui bahawa nilai-nilai itu tidak benar dan hanya diperbetulkan supaya mereka kelihatan nyata pada monitor.

Khususnya, ini berlaku dalam penarik apabila ia mengambil peta tekstur, seperti permukaan yang meresap, sebagai masukan. Ia menjalankan operasi mereka dengan mengandaikan nilai warna mereka dengan tepat mewakili intensiti cahaya; iaitu, dengan mengambil kira korespondensi linear dengan fenomena kehidupan sebenar yang mereka nyatakan.

Tetapi ini adalah ralat asas: jika anda mahu jumlah nilai warna dan mereka diperbetulkan oleh gamma (dibangkitkan kepada 1/gamma) anda mendapat nilai yang salah. Ia tidak mengambil genius matematik untuk menyedari bahawa A dibangkitkan kepada 1/gamma ditambah B yang dibangkitkan kepada 1/gamma tidak sama (A+B) dinaikkan kepada 1/gamma. Masalah ini juga berlaku apabila penunjuk mengeluarkan beberapa nilai, seperti apabila ia menghasilkan sumbangan cahaya: jika ia menjumlah dua sumbangan cahaya tetapi tidak tahu hasilnya akan dibangkitkan kepada gamma apabila dipaparkan pada skrin, ia menghasilkan nilai yang salah.

Dan ini adalah tepat di mana masalahnya berlaku: apabila seorang penanda mengandaikan bahawa warna-warna ia secara linear sesuai dengan fenomena kehidupan sebenar apabila mereka tidak, atau mengandaikan bahawa warna outputnya secara linear akan sesuai dengan keamatan cahaya pada skrin apabila mereka memenangi ' t, ia dibuat ralat yang serius yang boleh menjejaskan rupa dan rasa imej yang dihasilkannya.

Jika anda tidak membetulkan apa-apa kesilapan, jangan pastikan warna tekstur input yang dimasukkan ke dalam penghantar adalah linear, dan jangan pastikan imej output penghala akan linear berkenaan dengan skrin, imej-imej ini akan membatalkan setiap lain sehingga tahap tertentu, sama seperti cara mereka membatalkan setiap keluar apabila memaparkan fail JPEG yang terdahulu dalam pelayar web. Bagaimanapun, sebaik sahaja anda memasukkan beberapa pengiraan perantaraan yang menganggap korespondensi linear, matematik anda akan salah.


(a) Tidak membetulkan tekstur dan tidak membetulkan imej akhir, (b) tidak membetulkan tekstur tetapi membetulkan imej akhir, (c) membetulkan tekstur tetapi tidak membetulkan imej akhir, (d) membetulkan kedua-dua tekstur dan imej akhir.

Ingat apa yang kami katakan tentang menukar nada warna sebelum ini—fakta ini boleh (kadang-kadang) membantu anda melihat bukan garis lurus. Peraturan praktikal adalah: jika, apabila anda menggunakan tweak linear kepada parameter (seperti menggandakan kecerahan lampu di tempat kejadian), imej yang dihasilkan tidak hanya berubah dalam kecerahan tetapi juga dalam nada warna (contohnya, satu kawasan akan dari warna kemerahan-orange ke arah kuning), ini bermakna bahawa beberapa proses perantaraan tidak linear mungkin berlaku.

Ini boleh terjadi dengan peta tekstur yang diambil dari pelbagai sumber—Internet, kamera digital yang menjimatkan ke sRGB JPEG, pengimbas, atau jika tekstur dicat pada monitor yang tidak dikesali secara jelas untuk mempunyai tindak balas linear atau tidak secara eksplisit diperbetulkan selepas itu. Mana-mana matematik yang dilakukan pada peta tekstur ini akan salah, dan menyimpang sedikit dari nilai-nilai teori yang betul. Ini boleh dilihat dengan penapisan tekstur dan mipmaps: kerana penapisan menganggap tindak balas linear apabila nilai warna rata-rata, anda akan melihat kesilapan ketara: tekstur yang lebih kecil (yang jauh) akan kelihatan lebih gelap daripada yang lebih besar (yaitu, ketika mereka lebih dekat dengan anda): ini kerana apabila mereka jauh, algoritma penapisan purata lebih banyak sampel dan kelainan mereka tidak mempengaruhi hasilnya.

Pencahayaan juga akan mengalami gamma yang tidak wajar: sumbangan cahaya kepada jumlah permukaan di dunia nyata, dan akibatnya dalam penyajian, tetapi penjumlahan bukan operasi yang setia jika hasilnya tidak miring secara linier. Jika anda mempunyai shaders serpihan kompleks yang melakukan pencahayaan yang canggih, seperti penyebaran bawah permukaan atau HDR, kesilapan menjadi lebih dan lebih jelas, sehingga anda benar-benar tertanya-tanya apa yang salah dengan imej itu, berbanding dengan rasa tidak selesa 'mungkin agak pencahayaan yang salah, tetapi mungkin saya hanya 'yang juga boleh berlaku. Menggelur tekstur atau mencerahkan imej akhir oleh faktor yang tetap atau linier tidak membunuh kesannya, kerana ia juga merupakan operasi linear, dan anda memerlukan yang tidak linear untuk memerangi lengkung tindak balas eksponen yang wujud dalam monitor.

Bagaimana Saya Membaikinya?

Sekarang, mudah-mudahan, anda benar-benar mengetahui apa pembetulan gamma dan gamma, dan mengapa ini adalah masalah besar ketika melakukan grafik 3D masa nyata. Tetapi, tentu saja, mesti ada beberapa cara untuk menyelesaikan masalah ini?

Jawapannya adalah ya, dan penetapan gamma adalah operasi yang agak mudah yang tidak memerlukan anda mengubah apa-apa selain menambah beberapa baris kod, tidak mengira parameter tambahan, intensiti, dan tweak warna yang perlu anda lakukan untuk mendapatkan pencahayaan yang betul jika anda telah menetapkan adegan anda untuk kelihatan baik pada monitor bukan linear tanpa membetulkannya.

Terdapat tiga langkah asas untuk memastikan anda kekal linear selama mungkin dan melakukan pembetulan pada titik yang betul:

1. Pastikan Warna Tekstur Anda Betul

Anda tidak seharusnya mengubah imej sumber supaya ia mengandungi warna linear; mempunyai warna yang diperbetulkan gamma untuk pemantau tipikal dalam bidang warna lapan bit memberikan anda penyelesaian tambahan yang diperlukan di kawasan yang lebih gelap di mana mata manusia lebih sensitif terhadap variasi intensiti. Walau bagaimanapun, anda boleh memastikan bahawa nilai warna linear sebelum mencapai shader anda.

Biasanya, dalam OpenGL, anda boleh melakukan ini dengan melayari GL_SRGB8 bukannya GL_RGB8, dan GL_SRGB8_ALPHA8 bukannya GL_RGBA8, untuk glTexImage2D(), ketika menentukan tekstur. Ini akan memastikan bahawa semua nilai yang dibaca dari tekstur ini melalui pensinteran shader akan diperbetulkan dari ruang warna sRGB ke satu linear, yang tepatnya apa yang kita perlukan! Sekiranya anda menggunakan enjin rendering atau permainan yang memuatkan tekstur untuk anda, ia mungkin mengambil kira ini atau anda mungkin perlu menyatakannya secara manual; rujuk dokumentasi perpustakaan atau tanya seseorang untuk mendapatkan bantuan jika anda tidak pasti.

Walau bagaimanapun, pastikan anda tidak melakukan kesalahan ini dengan imej yang, menurut takrif, tidak mewakili maklumat warna, dan secara jelas dicat dengan ini. Contohnya termasuk peta biasa, peta bonggol, atau peta ketinggian, yang semuanya menyandikan beberapa data selain daripada warna dalam saluran warna tekstur dan oleh itu tidak mungkin memerlukan jenis pendaratan seperti ini.

Dari demo yang disertakan dalam artikel ini (beberapa parameter bertukar dengan nilai sebenar mereka untuk kejelasan):

Ini akan memuatkan tekstur dalam ruang warna yang tidak dikesan. Walau bagaimanapun, jika data dalam fail tekstur berada dalam ruang warna sRGB, kita patut menukar parameter ketiga ke GL_SRGB8, menghasilkan:

Ini akan memastikan OpenGL membetulkan data tekstur apabila kita melihatnya.

2. Pastikan Yuran Imej Output Anda Benar

Kini anda perlu memohon pembetulan warna pada imej output akhir penghantar anda. Pastikan anda tidak menggunakan koreksi untuk apa-apa tetapi framebuffer akhir yang akan dipaparkan pada skrin. (Jangan sentuh buffer perantara yang input kepada pemprosesan pasca pemprosesan yang lain, kerana ini masih akan mengharapkan untuk bekerja dengan nilai linier.)

Ini boleh dilakukan di OpenGL dengan menyatakan renderbuffer (framebuffer yang terakhir, tanpa sampel) untuk mempunyai pengekodan warna sRGB dengan lulus GL_SRGB dan bukannya GL_RGB sebagai parameter kepada glRenderbufferStorage(). Selepas itu, anda perlu menaikkan bendera GL_FRAMEBUFFER_SRGB dengan memanggil glEnable. Dengan cara ini, shader menulis ke buffer sRGB akan diperbetulkan supaya ia dipaparkan tepat pada monitor biasa.

Sekiranya anda menggunakan enjin atau rangka kerja, mungkin ada beberapa jenis pilihan untuk membuat framebuffer sRGB untuk anda dan menetapkannya dengan betul. Sekali lagi, anda boleh merujuk dokumentasi perpustakaan atau meminta seseorang untuk memperjelaskan ini untuk anda.

Dalam demo, kami menggunakan perpustakaan GLFW, yang menawarkan kami cara yang tidak menyakitkan untuk meminta sRGB framebuffer. Khususnya, kami menetapkan petunjuk tetingkap dan kemudian, kemudian, beritahu OpenGL untuk membolehkan operasi framebuffer berada dalam ruang sRGB:

3. Betulkan Intensiti Cahaya Tweak dan Parameter Warna Anda

Sekiranya ini bukan permulaan sesuatu projek baru, kemungkinan pencahayaan dan pemfilteran gamma yang tidak betul telah menimpa anda. Mungkin anda telah mengecilkan warna reflektif, intensiti cahaya dan apa yang cuba dicuba untuk menimbulkan gangguan yang tidak diingini oleh gamma yang telah dibawa kepada anda.

Anda perlu meneruskan nilai-nilai ini sekali lagi dan tweak mereka supaya mereka kelihatan betul lagi—walau bagaimanapun, kali ini, adegan anda akan kelihatan lebih semula jadi kerana pencahayaan lebih tepat mewakili keadaan dunia sebenar. Sudut tidak kelihatan terlalu gelap sehingga anda tidak perlu menambah intensiti ke lampu (dengan itu menghancurkan pencahayaan objek yang lebih cerah yang kemudian akan kelihatan cerah secara artifisial untuk jumlah cahaya di tempat kejadian).

Ini akan membayar: meninjau semula parameter anda untuk membuat persekitaran semulajadi dengan pembetulan gamma akan pergi jauh ke arah menyediakan pengguna anda dengan pengedaran pengalaman dan kecerahan yang kelihatan tepat untuk mata mereka, begitu biasa dan peka terhadap bagaimana cahaya berfungsi dalam kehidupan sebenar .

Demo

Termasuk dengan artikel ini adalah demo kecil OpenGL 3.3 yang menunjukkan adegan mudah dengan beberapa tekstur yang diterangi oleh dua sumber cahaya bergerak. Ia membolehkan anda beralih antara beberapa senario: tidak membetulkan tekstur tetapi membetulkan imej akhir; membetulkan tekstur tetapi mengabaikan untuk membetulkan imej akhir; membetulkan kedua (iaitu, melakukan semua yang betul); dan gagal membetulkan sama ada (berkesan membuat kesilapan berganda).

Demo ini ditulis dalam C++ (dengan dua shaders GLSL) dan menggunakan perpustakaan GLFW dan GLEW mudah alih supaya ia berjalan pada pelbagai platform. Kod sumber masak dengan komen supaya anda boleh pergi dan meneroka setiap aspek aplikasi pendek ini.

Demo dalam tindakan.

Gunakan kekunci 1 pada papan kekunci anda untuk mengitar antara membetulkan tekstur dan tidak membetulkan tekstur, dan 2 kekunci untuk membuat kitaran antara membetulkan framebuffer dan tidak membetulkan framebuffer. Untuk kitar kedua-duanya pada masa yang sama, tekan 3—berguna untuk melihat perbezaan antara mengabaikan gamma sepenuhnya (dua kesilapan yang membatalkan satu sama lain untuk sebahagian besar) dan melakukan semuanya dengan betul. Apabila demo dimulakan, tiada pembetulan dilakukan, jadi tekan 3 untuk melihat kelebihan pembetulan gamma yang betul.

Saya telah memasukkan projek Microsoft Visual C++ 2013, versi 64-bit kompilasi perpustakaan GLFW dan GLEW, dan Windows executable 64-bit. Bagaimanapun, anda boleh menyusunnya dengan mudah di mana-mana platform dengan sokongan GLFW dan GLEW: hanya menyusun main.cpp dan loader.cpp bersama-sama dan menghubungkannya ke kedua-dua perpustakaan tersebut. Di Linux, memasang perpustakaan ini melalui pengurus pakej anda dan -lglew -lglfw lulus ke g++ harus melakukan silap mata. (Sila ambil perhatian bahawa ini tidak diuji pada sistem operasi selain Windows, tetapi sepatutnya berfungsi—jika anda menghadapi masalah, sila beritahu saya dalam komen dan saya akan membetulkannya secepat mungkin.)

Seperti yang anda dapat lihat semasa menjalankan demo, kesannya cukup ketara walaupun dengan model mudah dan adegan mudah seperti ini. Sudah tentu, dalam kes yang mudah ini, anda mungkin boleh lari dengan tweaker parameter shader supaya imej kelihatan baik apabila tidak diturap. Walau bagaimanapun, sebaik sahaja anda mula membina kerumitan dalam tabir anda, perbezaan itu hanya akan kelihatan sekali untuk mengimbangi dengan cara ini.

Kesimpulan

Dalam artikel ini kita telah meliputi istilah seperti gamma, pembetulan gamma, input dan output bukan linear, dan matematik tidak linear. Mudah-mudahan, saya dapat meyakinkan anda bahawa anda perlu mula membimbangkan tentang pembetulan gamma sekarang jika anda telah mengabaikannya setakat ini, dan jika anda telah berhati-hati dengan gamma sebelum menemui artikel ini, saya harap ia memberi anda beberapa perkara baru sekeping maklumat kecil untuk menangani masalah ini.

Kami, yang paling penting, belajar bagaimana untuk menyelesaikan masalah yang timbul apabila anda melakukan manipulasi yang salah pada nilai warna, dengan mengandaikannya linear, dan kami telah menyemak perangkap dan gejala biasa yang berlaku apabila anda mengabaikan aspek penting grafik komputer ini.

Saya berharap anda telah bersenang-senang dan belajar sesuatu yang baru semasa membaca artikel ini. Sehingga masa depan!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.