Untuk matematika shader, mengapa RGB linier menjaga gamut sRGB?

13

sRGB sering dikontraskan dengan "RGB linear."

  • Gambar disimpan pada disk dan diteruskan ke tampilan dalam sRGB, yang kira-kira intensitasnya seragam.
  • Matematika Shader dilakukan dalam RGB linier, yang intensitasnya seragam secara fisik.
  • Koreksi gamma dapat diterapkan untuk mengkonversi antara keduanya.

Sekarang, sRGB memiliki standar yang secara kolorimetri menentukan gamutnya, dengan mengatakan persis di mana letak merah, hijau, biru, dan putih murni. Tetapi tidak ada standar yang sesuai untuk hanya "RGB linear." Setiap segitiga pada diagram kromatisitas bisa dikatakan linear, dan, memang, ada beberapa gamuts terkenal untuk memilih dari:

RGB gamuts

Dalam praktiknya, ketika kita mengatakan "RGB linear," yang kami maksud adalah "sRGB tanpa koreksi gamma." (Ini secara implisit apa yang kami lakukan ketika kami menerapkan koreksi gamma sRGB sebagai langkah akhir pasca-pemrosesan tetapi mengabaikan ruang warna untuk sisa pipa render.)

Tapi mengapa bahwa RGB gamut yang benar digunakan untuk interpolasi dan pencahayaan perhitungan? Tampaknya sewenang-wenang. Jika ada, bukankah kita ingin menggunakan gamut terbesar yang mungkin untuk perhitungan internal, dan kemudian klip atau skala warna ke gamut perangkat output di akhir?

Apakah pencahayaan RGB akan mendekati apa pun yang terjadi, jadi tidak masalah gamut mana yang kita pilih, dan sebaiknya kita memilih yang terdekat dengan apa yang didukung oleh tampilan asli? Apakah itu hanya kelalaian? Atau apakah perhitungan dalam gamut yang berbeda ini benar-benar menghasilkan hasil yang sama persis, entah bagaimana?

Maxpm
sumber

Jawaban:

13

Membicarakan tentang Linear RGB harus dihindari karena tidak memberi tahu Anda apa-apa tentang intrinsik colourpace RGB, yaitu, Fungsi Utama, Fungsi Whitepoint dan Transfer Komponen Warna. Beberapa tahun yang lalu, dengan asumsi itu sRGB adalah lumayan tapi sekarang dengan DCI-P3 dan BT.2020 menjadi sangat umum, itu harus dikesampingkan.

Gamut yang ideal untuk rendering adalah yang akan meminimalkan kesalahan sehubungan dengan referensi dunia nyata atau lebih mudah menjadi render spektral kebenaran tanah. Pengambilan pertama dari kalimat ini adalah bahwa berbagai warna RGB tidak sama dan tidak akan menghasilkan hasil yang serupa.

Orang mungkin berpikir bahwa melakukan dua render dengan warna dasar yang sama tetapi satu di mana mereka dikodekan dengan sRGB / BT.709 dan yang lainnya di mana mereka dikodekan dengan DCI-P3 dan kemudian mengonversi dua gambar yang dihasilkan ke misalnya ACES2065-1 akan menghasilkan gambar yang sama tetapi tidak demikian halnya. Beberapa operasi matematika karena sifat aljabar linier dan matriks tergantung pada primary colourpace RGB yang diberikan, yaitu, pada dasar colourpaces. Operasi yang sama dilakukan dalam ruang colour RGB yang berbeda akan menghasilkan nilai tristimulus yang berbeda setelah dikonversi kembali ke ruang warna CIE XYZ. Misalnya operasi multiplikasi, pembagian, dan operasi bergantung pada RGB colourpace primary sementara penambahan dan pengurangan tidak.

RGB Colourspaces dan Exponentiation

Gambar ini menggambarkan efek mengalikan berbagai warna dengan sendirinya menjadi warna RGB yang berbeda: warna yang dihasilkan berbeda. Berbagai sampel dihasilkan sebagai berikut: 3 nilai ruang colour sRGB acak diambil dan dikonversi ke tiga colourpaces RGB dipelajari, mereka eksponensial, dikonversi kembali ke ruang colour sRGB, diplot dalam Diagram Chromaticity CIE 1931 di sebelah kiri dan ditampilkan sebagai swatch pada Baik.

Pengujian dan penelitian yang dilakukan oleh Ward dan Eydelberg-Vileshin (2002) , Langlands dan Mansencal (2014) dan Mansencal (2014) menunjukkan bahwa gamut dengan primer yang paling dekat dengan lokus spektral, yaitu primer yang secara spektra tajam, cenderung meminimalkan kesalahan dibandingkan dengan medan spektral. render kebenaran.

Ini adalah gambar yang baru-baru ini saya buat dengan Mitsuba untuk memvalidasi ulang temuan kami dengan Anders:

Rendering Colourspaces

Mereka adalah renders dari adegan yang sama menggunakan primer BT.709 (baris pertama), 47 bin spektral (baris kedua), primer BT.2020 (baris ketiga), spektral minus BT.709 primer membuat residu (baris keempat), spektral dikurangi BT 0,2020 primer membuat residu (baris kelima). Baris terakhir menampilkan gambar komposit yang dirangkai dengan tiga garis vertikal dari masing-masing primer BT.709, spektral dan, BT.2020 primer diterjemahkan. Penerangan langsung cenderung cocok antara render. Area yang menunjukkan efek pemantulan banyak cahaya, yaitu langit-langit, pada primer BT.709 dan BT.2020 cenderung menunjukkan peningkatan saturasi, terutama pada primer BT.709 membuat atau sedikit kehilangan energi, terutama di BT .2020 menyajikan. Tidak termasuk pencilan, misalnya, sumber cahaya tampak, RMSE dengan render spektral adalah 0,0083dan 0,0116 untuk masing-masing primer primer BT.2020 dan BT.709 diterjemahkan.

Sekarang tidak berarti mereka akan selalu berkinerja lebih baik, dan orang mungkin dapat menghasilkan contoh yang akan menunjukkan bias terhadap BT.709 / sRGB. Hasil utamanya adalah rendering RGB tidak cocok dengan rendering spektral dan gamut lebar yang tajam cenderung berkinerja lebih baik. Sedangkan untuk memilih ruang rendering, saya akan memilih satu dengan gamut luas yang mencakup Pointer Gamut dan DCI-P3, BT.2020 atau ACEScg adalah kandidat yang sangat baik untuk itu.

Kel Solaar
sumber
5

Dalam praktiknya, ketika kita mengatakan "RGB linear," yang kami maksud adalah "sRGB tanpa koreksi gamma."

Akan lebih tepat untuk mengatakan bahwa ada "sRGB colorspace" dan "sRGB colorspace" yang dilinearisasi, dengan definisi spesifikasi sRGB konversi dari satu ke yang lain.

Ya, ada banyak ruang warna "linear RGB" yang tak terhingga. Tapi kesamaan yang dimiliki semua ruang warna "linear RGB" ini adalah linear . Ini berarti bahwa, jika Anda menggandakan nilai komponen apa pun, Anda menggandakan intensitas cahaya yang diwakili komponen tersebut. Pada dasarnya itulah artinya menjadi "linear": ada pemetaan linier antara nilai warna dan intensitas yang dihasilkan dari warna terang itu.

Ini penting karena persamaan pencahayaan tidak berfungsi jika nilai warna tidak secara linear memetakan intensitas cahaya. Tapi persamaannya tidak peduli ruang warna linear mana yang Anda gunakan; Anda hanya harus memilih satu.

Jadi ruang warna sRGB yang dilinearisasi tidak lebih benar daripada ruang warna Adobe RGB yang dilinearisasi atau ruang warna SWOP CMYK yang dilinearisasi. Yang penting justru dua hal:

  1. Ruang warna mewakili pemetaan linear dari nilai ke intensitas cahaya.
  2. Ruang warna yang dipilih secara konsisten digunakan dalam persamaan pencahayaan. Artinya, semua warna yang digunakan dalam persamaan pencahayaan berasal dari ruang warna yang sama (linier).

Apakah pencahayaan RGB akan mendekati apa pun yang terjadi, jadi tidak masalah gamut mana yang kita pilih, dan sebaiknya kita memilih yang terdekat dengan apa yang didukung oleh tampilan asli?

Itu, dan fakta bahwa konversi sRGB dibangun ke perangkat keras akhir-akhir ini, sementara konversi colorspace lainnya sering tidak. Jadi jika Anda ingin menggunakan ruang warna Adobe RGB yang dilinearisasi, Anda harus melakukan banyak pekerjaan di shader Anda untuk membuat garis linear nilai texel dan melakukan interpolasi bilinear / trilinear dengan benar (yang perlu dilakukan setelah linierisasi) sebelum Anda bahkan dapat menerapkan mereka ke persamaan pencahayaan. Dan kemudian Anda harus melakukan konversi dari Adobe RGB linierisasi ke sRGB linierisasi, sehingga Anda dapat menulis ke gambar framebuffer sRGB untuk ditampilkan.

Atau Anda bisa menggunakan sRGB yang dilinearisasi di mana saja dan memiliki kinerja. Yang terakhir cenderung menang.

Nicol Bolas
sumber
Apa pendapat Anda tentang luncuran ini ? Jika saya membaca dengan benar, hal ini menunjukkan bahwa perhitungan di ruang warna linier yang berbeda lakukan menyebabkan hasil yang berbeda.
Maks.
@ Maxm: Itu menarik. Bacaan saya tentang kertas itu adalah bahwa masalahnya bermuara pada kenyataan bahwa cahaya tidak benar-benar cocok dengan model ruang warna RGB kami. Hal ini menyebabkan hasil visual yang berbeda dalam hal yang seharusnya secara matematis menjadi hal yang sama. Di sana, satu-satunya solusi tampaknya berhenti menggunakan RGB dan mulai menggunakan rendering spektral.
Nicol Bolas
@ Maxm tapi tentu saja mereka lakukan setelah semua ruang lain berbeda. Tapi kemudian RGB tidak berwarna jadi ada itu. Tapi kemudian ada pertanyaan yang benar yang Anda inginkan. Keuntungan menjadi lebih kecil dan lebih kecil,
joojaa
0

Ada dua sisi mengapa sRGB khususnya. Untuk input gambar non-HDR, diklaim bahwa gambar tersebut harus dianggap dikompres ke sRGB (apakah klaim ini akurat atau tidak adalah cerita yang berbeda). Oleh karena itu, sebelum Anda dapat melakukan operasi matematika linier pada mereka, Anda perlu mendekompresnya dari sRGB. Mungkin juga bahwa suatu gambar ditangkap dan dikompres ke representasi berbeda yang bukan sRGB, dalam hal ini Anda perlu mendekompresi representasi spesifik tersebut. Bagaimanapun, pengkodean menyiratkan gamut tertentu bahwa gambar input tidak akan pernah lepas (karena gambar yang disimpan sRGB biasanya terpotong menjadi 8-bit per saluran), tetapi matematika shader Anda tidak harus tetap berada di gamut itu setelah input gambar didekompresi. Namun pada akhirnya Anda harus mempertimbangkan tampilan.

Jika Anda memiliki gambar dan sekarang saatnya untuk menampilkannya, Anda menyandikannya dalam representasi yang diperlukan oleh perangkat layar. CRT memilih sRGB, kemudian LCD mengemulasi itu, jadi kompresi sRGB untuk tampilan monitor telah menjadi pilihan umum selama beberapa dekade terakhir, dan yang membatasi output untuk tetap dalam gamut sRGB, atau jika tidak akan terjadi kliping. Tampilan rentang yang lebih luas tidak harus mengikuti gamut yang tepat itu.

(Saya pikir dasar untuk klaim bahwa gambar buatan manusia dikodekan sRGB adalah karena gambar-gambar itu dianggap telah ditulis pada layar sRGB)

Jadi sekarang Anda mungkin dapat melihat lebih baik mengapa sRGB khususnya didukung dalam perangkat keras untuk input matematika shader dan tampilan gambar. Ini adalah kasus umum. Plus, ia memiliki manfaat yang baik untuk mengurangi artefak pita warna perseptual, jadi ini adalah cara yang baik untuk mengompresi warna dalam 8 bit dan membuatnya terlihat masuk akal bagi manusia.

wbahnassi
sumber
0

Jika Anda mengizinkan nilai di luar rentang 0..1, maka bahkan dengan pemilihan pendahuluan sRGB yang cukup terbatas, Anda masih bisa mengatasi keseluruhan visual manusia. Jadi untuk menyimpan nilai warna titik cahaya mengambang, seharusnya tidak terlalu penting pemilihan pendahuluan yang Anda gunakan. Namun, melakukan segala macam matematika multiplikatif menjadi agak funky, karena koordinat arbitrer dari pendahuluan bertindak sebagai 'pivot' penskalaan. sRGB primer umumnya digunakan karena secara tradisional data input Anda dikodekan sRGB dan tampilan keluaran keluar adalah sRGB atau rec709 ... Dengan rec2020, setengah dari itu telah berubah, tetapi untuk saat ini, sebagian besar data input Anda mungkin masih dikodekan sRGB, jadi gunakan pemilihan pendahuluan yang sama dengan penyimpanan Anda hanyalah pilihan termudah.

Hodgman
sumber