8

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

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

有些乘以每个组件。它看起来不错,但在图元中是蓝色 ({0, 0, 1}) 并且光是红色 ({1, 0, 0}),它只是黑色。这是正常行为吗?

我还看到了屏幕混合模式 (screen(C1, C2) = C1 + C2 - C1 * C2)),这对我来说更合乎逻辑,因为在上述情况下,颜色实际上会混合。

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

额外的问题:图元上没有被照亮的点应该是黑色的吗?我见过像“一半颜色”这样的东西。

4

1 回答 1

19

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

在这短短的篇幅中,没有一个简单的方法来解释它。也许您可以查看Wikipedia 文章,以及它的链接和参考资料,或者甚至打开一本像样的计算机图形学教科书?

但可以这么说,对于许多 BRDF 来说,它类似于“乘法”,因为被完美蓝光照亮的完美反射朗伯纯红色表面应该看起来是黑色的。

有几个复杂的因素: 除了激光之外,没有真正的光发出纯原色,其他分量为 0.0。(如果您想要逼真的图像,请避免这样做。)没有真正的表面会在一个波长中反射所有颜色,而其他颜色分量为 0.0。(如果你想要一个逼真的图像,请避免这种情况。)并且没有一种材料是真正的朗伯式(纯漫射)——通常有一些镜面反射成分倾向于在表面反射光,然后它们到达任何底层颜料,因此反射光的一部分往往看起来像光的颜色,而不是表面。除非它是金属的,在这种情况下,金属的“颜色”会影响镜面反射。叹。就像我说的,这很复杂,

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

于 2010-11-11T05:17:14.337 回答