首先,我强烈建议您阅读Naty Hoffman的Siggraph 演示文稿,其中涉及渲染的物理原理。就是说,我将尝试借由他的演讲中的图像来回答您的特定问题。
查看单个轻粒子撞击材料表面上的一点,它可以做两件事:反射或折射。反射光会反射出表面,类似于镜子。折射的光在材料内部反射,并可能从材料进入的位置离开材料一定距离。最后,每次光与材料的分子相互作用时,它都会损失一些能量。如果失去足够的能量,我们认为它会被完全吸收。
引用纳蒂的话,“光是由电磁波组成的。因此,物质的光学性质与其电性质紧密相关。” 这就是为什么我们将材料归为金属或非金属的原因。
非金属将同时显示反射和折射。
金属材料仅具有反射作用。所有折射光都被吸收。
尝试对光粒子与材料分子的相互作用进行建模将是非常昂贵的。相反,我们做一些假设和简化。
如果像素大小或阴影区域与出入口距离相比较大,我们可以假设该距离实际上为零。为了方便起见,我们将光的相互作用分为两个不同的术语。我们将表面反射术语称为“镜面反射”,将由折射,吸收,散射和再折射产生的术语称为“漫射”。
但是,这是一个很大的假设。对于大多数不透明的材料,此假设是可以的,与现实生活相差不大。但是,对于具有任何透明度的材料,该假设将失败。例如,牛奶,皮肤,肥皂等。
材料的观察到的颜色是未被吸收的光。这是反射光以及从材料出射的任何折射光的组合。例如,纯绿色材料将吸收所有不是绿色的光,因此到达我们的眼睛的唯一光就是绿色光。
因此,美术师通过给我们提供材料的衰减函数,即光如何被材料吸收,来对材料的颜色建模。在我们简化的漫反射/镜面反射模型中,这可以用两种颜色表示,即漫反射颜色和镜面反射颜色。在使用基于物理的材料之前,艺术家会随意选择每种颜色。但是,这两种颜色应该相关联似乎很明显。这是反照率颜色出现的地方。例如,在UE4中,它们按以下方式计算漫反射和镜面反射颜色:
DiffuseColor = AlbedoColor - AlbedoColor * Metallic;
SpecColor = lerp(0.08 * Specular.xxx, AlbedoColor, Metallic)
其中Metallic(非金属)为0,金属为1。“镜面反射”参数控制对象的镜面反射(但对于99%的材料,通常为0.5)