我正面临一个问题,我的高光照明也是彩色的..在我提到的代码中, LightColor = ambient + diffuse + specular;
FragColor = BodyColor * LightColor;
//我的镜面光线与身体颜色相同。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
当然它与身体颜色相同 - 因为你正在BodyColor
对LightColor
进行分量增加。这意味着镜面高光受到体色的影响,就像漫射和环境一样,这显然不是你想要的。
例如,如果BodyColor
为[1.0 0.0 0.0]
,又称为红色(让我们为了参数而忽略alpha),并且组合的浅色为[0.8 0.8 0.8]
,又称浅灰色,则:
FragColor = [1.0 0.0 0.0] * [0.8 0.8 0.8] = [0.8 0.0 0.0]
哪个不是很红。
您永远无法使用您拥有的数学运算基于身体颜色的输出。至少,不经过复杂的划分,即便如此,也不会使用零成分。
你的问题有很多解决方案,准确度不同,但最简单的(你想要做的似乎是)将身体乘以除镜面反射之外的组合照明,并添加镜面反射:< / p>
FragColor = BodyColor * (LightDiffuse + Ambient) + LightSpecular;
镜面光照表现出与漫反射/环境有根本不同的现象:它是从表面反射出来的光,或从表面的薄层反射出来的(如彩色镜面通常所代表的那样)。因此,它不应该乘以身体的颜色。它可能与单独的表面镜面反射颜色相乘,但通常不是。
你仍然需要一些相当复杂的线性代数来到LightSpecular
项,因为它不是平坦地应用于曲面,而是取决于相机与物体的角度以及物体与光线的角度。既然你没有问,我假设你有这个;虽然你可能没有,但我会建议在互联网上有很多关于这个主题的网页。