我实现了一个具有以下属性的简单着色器: - 材料(环境,漫反射和镜面反射) - 定义对象颜色的基色 - 浅色
片段着色器:( vColor是对象的基色)
vec3 lightDir = normalize(vec3($uLightPos.xyz - vPosInEye.xyz));
vec3 viewerPos = normalize(vec3(-vPosInEye.xyz));
vec3 specularReflection = normalize(-reflect(lightDir, vNormal));
float diffFactor = max(dot(vNormal, lightDir), 0.0);
vec4 Id = $uIdColor * diffFactor * vColor ;
vec4 Ia = $uIaColor * vColor;
vec4 Is = clamp($uIsColor * pow(max(dot(specularReflection, viewerPos), 0.0), $uIsShininess), 0.0, 1.0);
gl_FragColor = (Id + Ia + Is) + $uLightColor;
如您所见,我将材质的环境颜色乘以对象的基色。这似乎是正确的,因为我想将这些颜色混合在一起。
在“Open GL ES 2.0编程指南”一书中,这是以相同的方式实现的。在最后一行,我添加了灯光的颜色 我试图先增加颜色然后我得到奇怪的结果:黄色*蓝色导致黑色(这是明确的,因为黄色是(1.0,1.0,0)和蓝色(0.0,0.0,1.0)所以我用+替换*这似乎产生了正确的颜色(白色)。
所以我的问题是:当我必须将两种颜色相乘以及何时添加它们时,是否有经验法则?
答案 0 :(得分:6)
当您想要将一种颜色调制为另一种颜色时,需要相乘。 例如,如果您有蓝色材质,则需要将落在其上的光线乘以材质的颜色,因为它应仅反射蓝光。如果你在蓝色材料上有黄光,你会发现它变黑,因为蓝色材料不会反射黄光。 (在现实生活中,你从来没有这种完美的材料,它们可能是(0.5 0.5,0.75)......
如果你有两个光源,那么你可能会添加它们,因为你想要总计每个光源的贡献。你看到的光只是两盏灯的总和,所以加上它们。
答案 1 :(得分:0)
jcoder的回答是正确的。
但是,我认为你可以更简单地说。
光线照射物体时会发生相乘。 当有来自多个来源的光线时会发生增加。
我们在这个照明模型中,因为正如jcoder所说的那样,我们成倍地计算出物体光交互的原因 1)每种光色都是独立的 2)物体吸收撞击它们的光的固定颜色百分比。
好奇的提示: 您可以尝试将物体替换为物体吸收固定光量的物体(减去而不是相乘 - 显然您需要将其剪切为零,这样您就不会得到光线) 结果是当它变暗时,你会在颜色之间获得更多的对比。 不现实,但是一种比实际更真实的#34;影响。有点像吸毒"效果。