如何混合颜色

Tan*_*gui 6 raytracing

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

有些只是添加两种颜色.这给了我很奇怪的结果.

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

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

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

额外的问题:如果一个基元上没有被照亮的点是黑色的吗?我见过像"一半的颜色"这样的东西.

Lar*_*itz 17

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

在这个短暂的空间里解释它并不容易.也许你可以查看维基百科的文章,以及它的链接和参考文献,甚至可以打开一个体面的计算机图形教科书?

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

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

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

  • 这是一个很好的答案.谢谢 ! (3认同)