VS2012 Shader Designer破解算法?

时间:2013-03-21 20:44:48

标签: visual-studio-2012 xna pixel-shader

我在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);

}

1 个答案:

答案 0 :(得分:0)

这一行应该已经考虑了纹理的颜色:

float3 diffuse = diffuseAmount * lightColor * pixelColor;

后来与环境照明混合以获得正确的结果。在您的版本中,您将添加纹理颜色两次(一次在漫反射中,一次在环境中)。 VS版本对应于我见过的Lambertian照明的各种在线示例,因此绝对正确。

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