ディスプレイに表示される色、または標準の画像ファイル形式に保存される色は、コンポーネントごとに8ビットを使用します。したがって、これらの色を保存するには、4バイト(unsigned char
)を使用するだけで十分です。これらの色は通常、sRGB色空間を使用します。これには、精度を再分配してより知覚的に均一にする非線形「ガンマ」変換が含まれるため、実際には、人間がすでに色の違いを細かく認識できる限界にかなり近いです。(ただし、sRGB色域は、物理的に知覚できるすべての色のサブセットにすぎません。色域が広いほど、より多くのビットが必要です。)
ただし、グラフィックスソフトウェアでカラーを生成または処理している場合(それらをロード/保存するだけでなく)、より高い精度を使用したい場合があります。
- 明るさとコントラストの調整、アルファブレンディング、ガンマ補正など、色の操作を実行すると、精度が失われる傾向があります。より正確なヘッドルームを確保するために、16ビット以上の色を内部的に保存することをお勧めします。それ以外の場合、各操作後に8ビットに丸めを繰り返すと、品質が徐々に低下する可能性があります。
- 同様に、ライティング計算で線形カラー(sRGBガンマエンコードされたカラーではない)を使用する場合、最終的にsRGBに変換するときに十分な精度を確保するには、追加の精度が必要です。
- 整数の色の代わりに浮動小数点の色を使用する方が、高速で便利です。これは、整数演算命令が浮動小数点命令のスループットのごく一部しか持たないGPUで特に当てはまります。しかし、CPUでさえ、色を浮動小数点数に変換し、一連の操作を行ってから整数に戻すほうが、整数の固定小数点演算ですべてを行うよりも、確かに簡単でおそらく高速です。
- HDRレンダリングを行う場合は、より広い色域と輝度範囲を処理するために8ビットを超える精度が必要になります。新しいHDRディスプレイは、コンポーネントごとに10ビットまたは12ビットの画像を受け入れるようになったばかりです。
double
色に使用するのは大げさですがfloat
、上記のすべての理由により、色の内部表現に使用するのが一般的です。GPUを使用する場合half
、ハードウェアでその形式をサポートするため、(16ビット浮動小数点)も一般的です。
half
。正確さの欠如のために、あなたが前に述べたものと全く同じ問題を起こさないでしょうか?シェーダーで頻繁に行われる多くのカラー計算のために、それはGPUでは特に重要です