gpt4 book ai didi

opengl - 什么时候必须将两种颜色相乘,什么时候必须相加?

转载 作者:行者123 更新时间:2023-12-04 14:28:26 24 4
gpt4 key购买 nike

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

片段着色器:(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;

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

在“Open GL ES 2.0 Programming guide”一书中,这是以相同的方式实现的。在最后一行中,我添加了灯光的颜色。
我一开始试图乘以颜色,但后来得到了奇怪的结果:黄色 * 蓝色导致黑色(这很清楚,因为黄色是 (1.0, 1.0, 0) 和蓝色 (0.0, 0.0, 1.0) 所以我用 + 替换了 * . 这似乎产生了正确的颜色(白色)。

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

最佳答案

当您想用另一种颜色调制一种颜色时,您需要进行乘法运算。
例如,如果您有一个蓝色 Material ,您希望将落在它上面的光乘以该 Material 的颜色,因为它应该只反射蓝光。如果你在蓝色 Material 上有黄光,你会期望得到黑色,因为蓝色 Material 不会反射黄光。 (在现实生活中,您永远不会拥有如此完美的 Material ,它们可能是 (0.5 0.5, 0.75) ...

例如,如果您有两个光源,那么您可能会添加它们,因为您想要合计每个光源的贡献。你看到的光只是两个光的总和,所以把它们相加。

关于opengl - 什么时候必须将两种颜色相乘,什么时候必须相加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21132037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com