【发布时间】:2014-02-03 14:29:57
【问题描述】:
我已经实现了一个具有以下属性的简单着色器: - 材质(环境、漫反射和镜面反射) - 定义对象颜色的基色 - 浅色
片段着色器:(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 Programming guide”一书中,这是以相同的方式实现的。在最后一行中,我添加了灯光的颜色。
我一开始尝试将颜色相乘,但后来我得到了奇怪的结果:黄色 * 蓝色导致黑色(这很清楚,因为黄色是 (1.0, 1.0, 0) 和蓝色 (0.0, 0.0, 1.0) 所以我用 + 替换 * . 这似乎产生了正确的颜色(白色)。
所以我的问题是:当我必须将两种颜色相乘以及何时相加时,是否有经验法则?
【问题讨论】:
-
你必须根据你想要得到的效果/结果来做!
-
@Günter Zöchbauer 为什么将着色器代码标记为 Dart?
-
抱歉打错了,看的不够仔细。为什么要添加 dart 标签?
-
我现在删除飞镖标签。这只是关于图形编程的一般问题
-
很抱歉,如果有人想知道它们来自哪里,我添加了 dart 标签,因为着色器代码中的 $ 符号...