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 double
untuk warna adalah kerja keras yang berlebihan, tetapi menggunakan float
untuk 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.
half
tidak 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