我正在 3D 引擎中实现照明,并且发现了计算照明方式的缺陷。在组合着色器中,我得到了漫反射颜色和光照计算。
return diffuseColor * (diffuseLight + ambient);
据我所知,这是做事的标准方式。但是,例如,如果颜色是 0,1,0,而灯光是 1,0,0,会怎样。(在此示例中忽略环境)结果将是 0,0,0。但在现实生活中,如果我得到一张纯绿色的纸,然后在上面照射一束有色的红光,它应该会变成黄色。或者至少不是黑色的。
其他游戏如何解决这个问题?
绿纸会吸收红光并呈现黑色,而不是黄色。加法意味着你用红光和绿光照亮一张白纸。然后纸张出现黄色。
http://www.physics.wisc.edu/museum/Exhibits-2/Light_Optics/ColorObj/Color_index.html
它应该是(对于每个 RGB 组件)
return (diffuseColor * diffuseLight) + ambient;
环境分量是恒定的,在所有其他光照计算完成后添加,并且不依赖于光照方向或观察方向。
正如胡里奥所说,纯绿色的纸在纯红光下看起来是黑色的。
当某些东西看起来是绿色时,这是因为它吸收了光谱中的所有其他颜色,而剩下的(即绿色)被反射了。如果你用红灯照它,就不会反射出绿色。