我在VS2012中使用着色器设计器发出的这个函数没有遇到麻烦。如果你看下面的代码,你可以看到VS版和我的版本之间的区别。
在VS版本中,它们没有考虑纹理,因此任何仅由环境照亮的对象的“阴暗”边只是灰色。在我的版本中,你可以看到我添加了pixelcolor(来自纹理)然后它工作得很好。由于它们将像素颜色考虑在内以用于漫反射照明,我无法弄清楚为什么它们不适用于环境光。
由于我对3D很陌生,我不想假设我很聪明,VS团队从未对此进行过测试。因为它是如此根本,我想知道我是否只是缺少一些东西。想法?
float3 LambertLighting(
float3 lightNormal,
float3 surfaceNormal,
float3 materialAmbient,
float3 lightAmbient,
float3 lightColor,
float3 pixelColor
)
{
// compute amount of contribution per light
float diffuseAmount = saturate(dot(lightNormal, surfaceNormal));
float3 diffuse = diffuseAmount * lightColor * pixelColor;
// combine ambient with diffuse
// VS Version:
return saturate((materialAmbient * lightAmbient) + diffuse);
// MY Version:
return saturate((materialAmbient * lightAmbient * pixelColor) + diffuse);
}
答案 0 :(得分:0)
这一行应该已经考虑了纹理的颜色:
float3 diffuse = diffuseAmount * lightColor * pixelColor;
后来与环境照明混合以获得正确的结果。在您的版本中,您将添加纹理颜色两次(一次在漫反射中,一次在环境中)。 VS版本对应于我见过的Lambertian照明的各种在线示例,因此绝对正确。
可能出现的问题是,在测试设置中,漫反射颜色为黑色或灰色,这会使像素颜色看起来也是灰色。