我什么时候必须将两种颜色相加?

mor*_*s05 6 opengl shader lighting

我已经实现了一个具有以下属性的简单着色器: - 材质(环境,漫反射和高光) - 定义对象颜色的基色 - 浅色

片段着色器:(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;
Run Code Online (Sandbox Code Playgroud)

如您所见,我将材质的环境颜色乘以对象的基色.这似乎是正确的,因为我想将这些颜色混合在一起.

在"Open GL ES 2.0编程指南"一书中,这是以相同的方式实现的.在最后一行,我添加了灯光的颜色.
我试图先增加颜色然后我得到奇怪的结果:黄色*蓝色导致黑色(这是明确的,因为黄色是(1.0,1.0,0)和蓝色(0.0,0.0,1.0)所以我用+替换*这似乎产生了正确的颜色(白色).

所以我的问题是:当我必须将两种颜色相乘以及何时添加它们时,是否有经验法则?

jco*_*der 6

当您想要将一种颜色调制为另一种颜色时,需要相乘.例如,如果您有蓝色材质,则需要将落在其上的光线乘以材质的颜色,因为它应仅反射蓝光.如果你在蓝色材料上有黄光,你会发现它变黑,因为蓝色材料不会反射黄光.(在现实生活中,你从来没有这种完美的材料,它们可能是(0.5 0.5,0.75)......

例如,如果您有两个光源,那么您可能会根据需要添加它们,以便总计每个光源的贡献.你看到的光只是两盏灯的总和,所以加上它们.