Colorクラスの精度(ハーフ、フロート、ダブルなど)はどれくらいですか?


8

OpneGLの下でリアルタイムアプリケーションが色を処理する方法を読んでいると、いくつかの例ではColorを4のコレクションとして実装し、他の例では4 floatsを使用していることに気付きましたdoubles。色を4として節約することを提唱するゲーム開発分野での頂点圧縮の例を見たこともありshortます。

これらすべてから、これについてもっと学ぶことに熱心になりました。OpenGl(またはハードウェア)が色に対して処理する限界精度はどのくらいですか?しかし、もっと重要なのは、それを超えると色の違いに気付かなくなる精度の限界は何ですか?

それについてもっと注意深く学ぶと、さまざまなアプリケーションやシナリオ(たとえば、メモリ、速度、色の多様性の間でトレードオフの選択を行う)にColorクラスを実装する方法をよりよく考えて決定するのに役立つだろうという印象があります。

これについてあなたの考えをありがとう。

回答:


6

ディスプレイに表示される色、または標準の画像ファイル形式に保存される色は、コンポーネントごとに8ビットを使用します。したがって、これらの色を保存するには、4バイト(unsigned char)を使用するだけで十分です。これらの色は通常、sRGB色空間を使用します。これには、精度を再分配してより知覚的に均一にする非線形「ガンマ」変換が含まれるため、実際には、人間がすでに色の違いを細かく認識できる限界にかなり近いです。(ただし、sRGB色域は、物理的に知覚できるすべての色のサブセットにすぎません。色域が広いほど、より多くのビットが必要です。)

ただし、グラフィックスソフトウェアでカラーを生成または処理している場合(それらをロード/保存するだけでなく)、より高い精度を使用したい場合があります。

  • 明るさとコントラストの調整、アルファブレンディング、ガンマ補正など、色の操作を実行すると、精度が失われる傾向があります。より正確なヘッドルームを確保するために、16ビット以上の色を内部的に保存することをお勧めします。それ以外の場合、各操作後に8ビットに丸めを繰り返すと、品質が徐々に低下する可能性があります。
  • 同様に、ライティング計算で線形カラー(sRGBガンマエンコードされたカラーではない)を使用する場合、最終的にsRGBに変換するときに十分な精度を確保するには、追加の精度が必要です。
  • 整数の色の代わりに浮動小数点の色を使用する方が、高速で便利です。これは、整数演算命令が浮動小数点命令のスループットのごく一部しか持たないGPUで特に当てはまります。しかし、CPUでさえ、色を浮動小数点数に変換し、一連の操作を行ってから整数に戻すほうが、整数の固定小数点演算ですべてを行うよりも、確かに簡単でおそらく高速です。
  • HDRレンダリングを行う場合は、より広い色域と輝度範囲を処理するために8ビットを超える精度が必要になります。新しいHDRディスプレイは、コンポーネントごとに10ビットまたは12ビットの画像を受け入れるようになったばかりです。

double色に使用するのは大げさですがfloat、上記のすべての理由により、色の内部表現に使用するのが一般的です。GPUを使用する場合half、ハードウェアでその形式をサポートするため、(16ビット浮動小数点)も一般的です。


すばらしい答え、ありがとう!私は最後の部分を手に入れませんでしたhalf。正確さの欠如のために、あなたが前に述べたものと全く同じ問題を起こさないでしょうか?シェーダーで頻繁に行われる多くのカラー計算のために、それはGPUでは特に重要です
AndrewSteer

1
@AndrewSteer A halfは16ビットであり、仮数精度の11有効ビットを含みます。そのため、ほど正確ではありませんがfloat、ほとんどのカラー操作には十分です。(そうでないかもしれない、非常に、十分なあなたは、高色域のHDRディスプレイに出力している場合、私はわからない。)
ネイサン・リード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.