Opengl 什么时候我必须把两种颜色相乘,什么时候我必须把它们相加?

Opengl 什么时候我必须把两种颜色相乘,什么时候我必须把它们相加?,opengl,shader,lighting,Opengl,Shader,Lighting,我实现了一个具有以下属性的简单着色器: -材质(环境光、漫反射和镜面反射) -定义对象颜色的基础颜色 -浅色 片段着色器:(vColor是对象的基础颜色) 正如您所见,我将材质的环境色与对象的基色相乘。这似乎是正确的,因为我想把这些颜色混合在一起 在《OpenGL ES 2.0编程指南》一书中,这是以相同的方式实现的。在最后一行中,我添加了灯光的颜色。 起初我试着将颜色相乘,但后来我得到了奇怪的结果:黄色*蓝色导致黑色(这是清晰的,因为黄色是(1.0,1.0,0)和蓝色(0.0,0.0,1.0)

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

片段着色器:(vColor是对象的基础颜色)

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

在《OpenGL ES 2.0编程指南》一书中,这是以相同的方式实现的。在最后一行中,我添加了灯光的颜色。
起初我试着将颜色相乘,但后来我得到了奇怪的结果:黄色*蓝色导致黑色(这是清晰的,因为黄色是(1.0,1.0,0)和蓝色(0.0,0.0,1.0),所以我将*替换为+。这似乎产生了正确的颜色(白色)


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

当你想将一种颜色调制成另一种颜色时,你需要相乘。 例如,如果您有一个蓝色材质,您希望将落在它上面的光乘以材质的颜色,因为它应该只反射蓝光。如果您有一个蓝色材质上的黄光,您希望得到黑色,因为蓝色材质不会反射黄光。(在现实生活中,你从来没有这样完美的材料,它们可能是(0.50.5,0.75)


例如,如果您有两个光源,那么您可能会添加它们,因为您希望将每个光源的贡献相加。您看到的灯光只是两个灯光的总和,因此请添加它们。

jcoder的答案是正确的

不过,我认为你可以说得简单得多

当光线照射到对象时,会发生倍增。 当有来自多个光源的光时,会发生附加

我们之所以倍增来计算物体与光的相互作用,是因为正如jcoder所说,在这个光照模型中 1) 每种浅色都是独立的 2) 物体吸收固定的每种颜色百分比的光线

给好奇者的提示: 你可以尝试用一个物体吸收固定数量光的模型来代替这个模型(减法,而不是乘法-显然你需要剪裁到零,这样你就不会得到光) 结果是,当它变暗时,颜色之间的对比度会大得多。
不现实,但有一种“比真实更真实”的效果。有点像“被麻醉”效果。

你必须根据你想要得到的效果/结果来决定!@Günter Zöchbauer为什么要将着色器代码标记为Dart?抱歉,这是一个错误,看得不够近。为什么要添加Dart标记?我现在删除了Dart标记。这只是一个关于图形编程的一般问题。很抱歉,我添加了Dart标记,因为$symbol如果有人想知道他们是从哪里来的,那么这意味着+是错误的,因为你不希望它是白色的。我想应该再看看“色度学”(:
  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;