2010-11-09 91 views
6

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

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

一些mutiply每个组件。它看起来不错,但是在原始图像中是蓝色({0,0,1}),光线是红色({1,0,0}),它只是黑色。这是正常的行为吗?

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

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

奖励问题:一个原始的点不应该是黑色的?我见过像“一半颜色”的东西。

回答

17

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

有没有简单的方法来解释它在这个短的空间。也许你可以查看Wikipedia article,以及它的链接和参考,甚至破解开放体面的计算机图形教科书?

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

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

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

+3

这是一个很好的答案。谢谢 ! – Tangui 2010-11-13 08:36:20

+1

您提到BRDF输出为“入射辐射(从光线方向)到视线方向出射辐射的比率”。输出不是视角方向上的出射辐射与从光线方向入射的辐射的比率吗? – PeteUK 2016-10-05 14:29:20

+0

是的,我会解决它。 – 2016-10-06 04:22:13