2014-01-15 27 views
5

我实现一个简单的着色器具有以下属性: - 材料(环境,漫反射和镜面) - 基本颜色定义了对象 的颜色 - 光色何时必须将两种颜色相乘,何时需要添加?

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

你必须根据你想要得到的效果/结果来做! – Vallentin

+0

@GünterZöchbauer为什么你将着色器代码标记为Dart? – Fox32

+0

抱歉是一个错误,没有足够接近。你为什么要添加飞镖标签? –

回答

6

你需要?例如,如果您有一种蓝色材质,您希望将其上的光线乘以材料的颜色,因为它应该只反射蓝光;如果您有黄光一个蓝色的材料,你会期望得到黑色,因为蓝色材料不会反射黄光。 (在现实生活中,你永远不会有这种完美的材料,他们可能是(0.5 0.5,0.75)...

如果你有两个光源,例如,那么你可能会添加他们,因为你想总计从各贡献。你看光是简单相加两个灯的,所以添加。

+0

所以这意味着+是错误的,因为你不要指望它是白色的。我想应该再看看“色彩”( - : – morpheus05

0

jcoder的答案是正确的。

不过,我觉得你可以把更加简单。

乘以发生当光线遇到物体时 当有多个光源发出光线时会发生添加

我们之所以乘以计算物体光交互作用,是因为jcoder说,在这种照明模式下 1)每个光源颜色都是独立的 2)物体吸收光的固定颜色百分比击中他们。

好奇的提示: 你可以尝试用一个物体吸收固定光量的物体来代替这个模型(减去,不是乘 - 显然你需要将其剪成零,所以你不会得到-ve光) 结果是当它变暗时,你会在颜色之间获得更多的对比。 不现实,但有一种“更真实”的效果。有点像“麻醉剂”效应。