Berapa banyak presisi (setengah, float, double, dll) yang cukup untuk kelas Warna?


8

Saat melakukan beberapa bacaan tentang bagaimana aplikasi waktu nyata menangani warna di bawah OpneGL, saya perhatikan bahwa beberapa contoh menerapkan Warna sebagai koleksi 4 floats, sementara yang lain menggunakan 4 doubles. Saya bahkan telah melihat beberapa contoh kompresi titik di bidang pengembangan game yang menganjurkan penghematan warna sebagai 4 short.

Semua ini membuat saya ingin belajar lebih banyak tentang ini: apa batas presisi yang ditangani OpenGl (atau perangkat keras) untuk warna? Lebih penting lagi, berapa batas presisi di atas perbedaan warna yang menjadi tidak mungkin untuk diperhatikan?

Saya memiliki kesan bahwa belajar lebih hati-hati tentang hal itu akan membantu saya berpikir lebih baik dan memutuskan bagaimana menerapkan kelas Warna untuk berbagai aplikasi dan skenario (misalnya membuat pilihan trade-off antara memori, kecepatan dan variasi warna).

Terima kasih atas ide Anda tentang ini.

Jawaban:


6

Warna yang ditampilkan pada layar Anda atau disimpan ke format file gambar standar menggunakan 8 bit per komponen. Jadi untuk menyimpan warna-warna ini, cukup menggunakan empat byte ( unsigned char). Warna-warna ini biasanya menggunakan ruang warna sRGB , yang mencakup transformasi "gamma" non-linier yang mendistribusikan kembali presisi untuk membuatnya agak lebih seragam secara perseptual, jadi sebenarnya cukup dekat dengan batas bagaimana manusia dengan halus dapat merasakan perbedaan warna. (Namun, gamut sRGB hanya sebagian dari semua warna yang dapat dilihat secara fisik. Gamut yang lebih luas membutuhkan lebih banyak bit.)

Namun, jika Anda menghasilkan atau memproses warna dalam perangkat lunak grafis (dan tidak hanya memuat / menyimpannya), ada berbagai alasan Anda mungkin ingin menggunakan lebih presisi.

  • Melakukan operasi pada warna, seperti mengatur kecerahan dan kontras, alpha blending, koreksi gamma, dll semua cenderung kehilangan presisi. Anda mungkin ingin menyimpan warna sebagai 16-bit atau lebih secara internal untuk memberi Anda ruang kepala yang lebih presisi. Jika tidak, pembulatan berulang menjadi 8 bit setelah setiap operasi dapat menyebabkan penurunan kualitas yang progresif.
  • Demikian pula, ketika bekerja dengan warna linier (bukan warna yang disandikan gamma sRGB) untuk menerangi matematika, dibutuhkan ketelitian ekstra untuk memastikan Anda memiliki ketepatan yang cukup ketika Anda akhirnya kembali ke sRGB.
  • Mungkin lebih cepat dan nyaman untuk bekerja dengan warna titik-mengambang daripada warna bilangan bulat. Ini terutama berlaku pada GPU, di mana instruksi matematika integer hanya memiliki sebagian kecil dari throughput instruksi float. Tetapi bahkan pada CPU tentu lebih mudah dan mungkin lebih cepat untuk mengubah warna menjadi float, melakukan banyak operasi, dan kemudian mengkonversi kembali ke integer, daripada mencoba melakukan segala sesuatu dengan integer fixed-point math.
  • Jika Anda melakukan rendering HDR sama sekali maka Anda akan membutuhkan lebih dari 8 bit presisi untuk menangani gamut warna yang lebih besar dan rentang intensitas. Layar HDR yang baru mulai keluar menerima gambar dengan 10 atau 12 bit per komponen.

Menggunakan doubleuntuk warna adalah kerja keras yang berlebihan, tetapi menggunakan floatuntuk representasi internal warna adalah umum untuk semua alasan di atas. Ketika bekerja dengan GPU, half(float 16-bit) juga umum, karena mereka mendukung format itu dalam perangkat keras.


Jawaban yang bagus, terima kasih! Saya hanya tidak mendapatkan bagian terakhir: menggunakan halftidak akan menimbulkan masalah yang sama yang Anda sebutkan sebelumnya, karena kurangnya presisi? Saya pikir itu akan menjadi sangat penting di GPU, karena banyaknya perhitungan warna yang sering dilakukan dalam shader
AndrewSteer

1
@AndrewSteer A halfadalah 16 bit, termasuk 11 bit efektif presisi mantissa, jadi meski tidak setepat float, itu masih cukup untuk sebagian besar operasi warna. (Mungkin tidak cukup memadai jika Anda menghasilkan tampilan HDR gamut tinggi; saya tidak yakin.)
Nathan Reed
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.