0

我有一个强度( 10000,10000, 5000 )的环境光。我正在尝试为图元着色。

如您所知,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

正如所写的那样,这个问题还不清楚,所以这里有一些一般性的建议。

渲染器中的颜色通常保存为每个 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 回答
1

这就是你想要的:亮度 = 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 回答