2

VS2012 中的着色器设计器发出的这个函数给我带来了无穷无尽的麻烦。如果您查看下面的代码,您可以看到 VS 版本和 MY 版本之间的区别。

在 VS 版本中,它们不考虑纹理,因此任何仅由环境光照亮的对象的“阴影”侧都只是灰色。在我的版本中,您可以看到我添加了像素颜色(来自纹理),然后效果很好。由于他们将像素颜色考虑到漫反射照明,我无法弄清楚为什么他们不会考虑环境光。

因为我对 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);

}
4

1 回答 1

0

这条线应该已经考虑了纹理的颜色:

float3 diffuse = diffuseAmount * lightColor * pixelColor;

稍后将其与环境照明混合以获得正确的结果。在您的版本中,您添加了两次纹理颜色(一次在漫反射中,一次在环境中)。VS 版本对应于我看到的各种在线朗伯光照示例,所以这绝对是正确的。

可能出问题的是,在您的测试设置中,漫反射颜色是黑色或灰色,这会使像素颜色也看起来是灰色的。

于 2014-08-12T09:56:52.153 回答