【问题标题】:relation between light intensity and R,G,B光强与 R,G,B 的关系
【发布时间】:2012-10-30 01:25:52
【问题描述】:

我有一个强度为 ( 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 )

由于强度高且最大颜色值低,我采取了错误的颜色。

【问题讨论】:

  • 你的问题没有任何意义。 “颜色”是什么意思?强度值的范围是多少?
  • @Alnitak 请查看编辑。如果还不清楚,请说
  • 你需要指定色彩空间,否则问题没有意义
  • 什么是色彩空间?
  • 另外,您可以查看 Wikipedia 上的文章:HSVLab,有各种数学可以完成这项工作。

标签: c graphics


【解决方案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”是没有意义的,因为相比之下,场景中的所有其他物体都会有一个几乎无限小的值。

因此,钳位的最终结果是,对场景贡献过多光线的光源会产生图像“饱和” - 即,如果您在图片上长时间打开快门,您会获得相同的效果的一个明亮的场景。

【讨论】:

  • 你能解释一下夹紧吗?
  • 不是真的 - 阅读我更新的答案,它应该解释你需要什么。请注意,在任何正常渲染的情况下,环境值 10000 将被视为非常高。你为什么选择这些价值观?
  • 是文字练习。我没有选择这些值。
【解决方案2】:

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

【讨论】:

  • 什么是 .241、.691 和 .068 ?它们是每种颜色的环境系数吗
  • 它们是用于校正人眼对 3 种颜色中的每一种的不同反应的系数。它们是您用来根据(人类)感知亮度正确灰度图像的工具。
  • @user1783508 它们是 RGB 分量对具有相同感知亮度的灰度“颜色”的相对贡献的标准值。眼睛对绿色最敏感,因此它的系数更高。据我所知,这与这个问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多