如何混合颜色

时间:2010-11-09 11:54:58

标签: raytracing

我正在编写光线跟踪器。我想知道如何将原始颜色与浅色混合。 我见过很多种组合。

有些人只是添加两种颜色。这给了我非常奇怪的结果。

每个组件都有些笨拙。它看起来不错,但在原语是蓝色({0,0,1})而灯是红色({1,0,0}),它只是黑色。这是正常行为吗?

我也看过屏幕混合模式(屏幕(C1,C2)= C1 + C2 - C1 * C2))这对我来说更合乎逻辑,因为在上面的例子中,颜色实际上会混合。

反射光线颜色的相同问题:如何将它们与局部颜色混合?

奖金问题:如果未点亮的原语上的一个点应该是黑色的吗?我见过像“颜色的一半”这样的东西。

1 个答案:

答案 0 :(得分:17)

实际上方式更复杂。光和表面材料通过称为双向反射分布函数(简称BRDF)的公式相互作用,这是一种四维函数,其输入是光的方向和视角的方向(两者都相对于表面法线,即垂直于表面的单位矢量),其输出是视图方向的出射辐射与光的方向的入射辐照度之比。

在这个短暂的空间里解释它并不容易。也许你可以查看Wikipedia article,以及它的链接和参考资料,甚至可以打开一个像样的计算机图形教科书?

但是,对于许多BRDF而言,它足以说明它类似于“乘法”,因为完美反射的Lambertian纯红色表面应该看起来是黑色的。

有几个复杂的因素:除了激光之外,没有真正的光发出纯原色,其他成分为0.0。 (如果想要逼真的图像,请避免这种情况。)没有真实表面反映一个波长的所有颜色,其他颜色分量为0.0。 (如果你想要一个真实的图像,请避免这种情况。)并且没有任何材料真的非常朗伯(纯粹漫反射) - 通常有一些镜面反射成分倾向于在它们到达任何底层颜料之前反射表面上的光,因此反射光的一部分往往看起来像光的颜色,而不是表面。除非它是金属的,否则金属的“颜色”会影响镜面反射。叹。就像我说的那样,它很复杂,你需要实际阅读物理学(以及40年的计算机图形学研究,其中所有这些问题早在您考虑问题之前就已经解决了。)

奖励回答(“未点亮的点会发生什么”):真正未点亮的点应为黑色。但是你肯定知道这一点,以及在任何现实世界的情况下,没有任何一点没有任何照明(也可以被拍照)。这个问题的一个更有趣的表述是这样的:我的渲染器只考虑来自光源的直接光路,而不是所有照亮较暗角落的间接路径(物体到物体),所以我该如何防止它变黑了吗?一个便宜的答案是添加一个“环境”光,只是在任何地方抛出恒定的光量。这是人们长时间做的事情,看起来很像你想象的那样。更好的方法是使用各种“全局照明”技术。仔细看看。但绝对不要只是“照亮它的一半”,除非你的目标是非常风格(而不是逼真)的外观。