0

強度(10000、10000、5000)のアンビエントライトが1つあります。プリミティブに色を付けようとしています。

ご存知のように、R、G、Bの色の値は0から255の間です。光の強度に応じてピクセルの色を見つけるにはどうすればよいですか?

プラットフォーム:Linuxとプログラミング言語c

編集 :

レイトレーサーでは、計算しています

for each ambient light in the environment
 color . R  += Intensity of the light * ambient coefficient for color R
 color . G  += Intensity of the light * ambient coefficient for color G
 color . B  += Intensity of the light * ambient coefficient for color B

ただし、openGLを使用してこのピクセルカラー値を画面に出力しようとしたときはいつでも。

set pixel color ( color )

強度が高く、最大色値が低いため、色を間違えました。

4

2 に答える 2

1

必要なのはこれです:brightness = sqrt(.241 * R * R + .691 * G * G + .068 * B * B)

詳細はこちら: http: //www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx

またはここ: http: //en.wikipedia.org/wiki/Luminance_ (relative )

于 2012-10-29T17:04:16.820 に答える
1

書かれているように、質問は不明確なので、ここにいくつかの一般的なアドバイスがあります。

レンダラーの色は通常、RGBコンポーネントごとに公称範囲が[0..1]の値として保持されます。

これらの色がピクセルにレンダリングされる場合、通常は255を掛けるだけで、24ビットの色の値(コンポーネントあたり8ビット)が得られます。

元の値が[0..1]の範囲にある場合は、結果のピクセル値が[0..255]の範囲に収まるように、「クランプ」する必要があります。

そのクランプは、「コンポーネントごと」に実行できます。これにより、(255、255、255)になるか、各コンポーネントを最大コンポーネントで割って(255、255、127)になります。つまり、相対値を保持します。擬似コードの強度:

float scale = max(r, g, b);
if (scale < 1) {
    scale = 1;     // don't normalise colours that are "in range"
}

byte R = 255 * (r < 0 ? 0 : r / scale);
byte G = 255 * (g < 0 ? 0 : g / scale);
byte B = 255 * (b < 0 ? 0 : b / scale); 

すべての中間計算では、強度のダイナミックレンジ全体を保持するのが通常です。たとえば、太陽が「1」の明るさを持つことは意味がありません。これは、シーン内の他のすべてのオブジェクトの値が、比較するとほぼ無限に小さいためです。

したがって、クランプの最終的な結果は、シーンに過度の光を与える光源が画像の「飽和」を生成することです。つまり、明るい画像でシャッターを長く開いたままにした場合と同じ効果が得られます。シーン。

于 2012-10-29T17:04:32.840 に答える