2012-10-29 26 views
0

我有intesity(10000,10000,5000)一個環境光。我正在嘗試着色原始。,G,B

大家知道,對於R,G和B顏色值是從0到255如何可以根據光intesity我發現的像素的顏色?

平臺: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)

我已經採取了,因爲強度的顏色不對高,最大顏色值低。

+0

你的問題沒有寫作的意義。 「顏色」是什麼意思?強度值的範圍是多少? – Alnitak

+0

@Alnitak請看編輯。如果還不清楚,請說 – user1783508

+0

你需要指定顏色空間,否則問題沒有意義 –

回答

1

這個問題不清楚,因爲寫的,所以這裏的一些普遍性的建議。

顏色渲染器通常與標稱範圍[0..1]的每個RGB分量的保持爲值。

當這些顏色被渲染到像素,它們通常只是乘以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」是沒有意義的,因爲場景中的每個其他物體都將具有幾乎無限小的值。

因此,合模的最終結果將是光源對場景貢獻太多光線會產生圖像的「飽和度」 - 即如果您將快門打開時間過長,則會產生同樣的效果一個明亮的場景的圖片。

+0

你能解釋一下嗎? – user1783508

+0

IS問題仍不清楚? – user1783508

+0

不是真的 - 閱讀我更新的答案,它應該解釋你需要什麼。請注意,在任何正常呈現中,環境值10000會被視爲_very_高。你爲什麼選擇這些值? – Alnitak

0

這是這一個你想要的: 亮度=開方(0.241 * R * R + 0.691 * G * G + 0.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

+0

什麼是.241,.691和.068?它們對於每種顏色都是環境係數 – user1783508

+0

它們是用於校正人眼對三種顏色中的每一種的不同響應的係數。它們是您用來根據(人類)感知的亮度正確地對圖像進行灰度調整的。 – enhzflep

+0

@ user1783508它們是將RGB分量的_relative_貢獻轉換爲具有相同感知亮度的灰度「顏色」的標準值。眼睛對綠色最敏感,因此其係數更高。據我所知,這個問題並不重要。 – Alnitak

相關問題