HLSL Pixel Shader 5.0 NdotL照明样本

时间:2014-08-29 18:30:02

标签: c++ directx shader hlsl

我正在使用directX浏览Pixel Shader 5.0的教程。我做得很好,直到我进入第四课,让我用下面的代码创建一个PixelShader.hlsl文件:

 cbuffer ConstantBuffer : register( b0 )
  {
    matrix World;
    matrix View;
    matrix Proj;

    float4 vLightDir[2];    
    float4 vLightColor[2];
    float4 vOutputColor;
  }

  struct PS_INPUT
  {
    float4 Pos : SV_POSITION;
    float3 Norm : TEXCOORD0;
  };

  //--------------------------------------------------------------------------------------
  // Pixel Shader
  //--------------------------------------------------------------------------------------
  float4 main( PS_INPUT input) : SV_Target
  {
    float4 finalColor = 0;

    //do NdotL lighting for 2 lights
    for(int i=0; i<2; i=""
    {
        finalColor += "saturate"( dot=""( (float3)vLightDir=""[i=""],input.Norm="") * vLightColor=""[i=""
    }
    finalColor.a = "1"
    return="" finalColor="";
  }

文件末尾的for循环让我感到困惑。 Int i被初始化为常量字符串,并且没有右括号。 同样,for循环中的代码也看起来不正确。 float4结构似乎有一个字符串&#34; saturate&#34;附加到它,这也是一个功能?没有正确关闭括号且没有分号的函数。

示例代码中似乎存在一些拼写错误,我正在努力修复它们。关于应该在这里写什么的任何想法?

当我尝试在VS2012中编译代码时,我收到以下错误:错误X3017:无法隐式转换来自&#39; const string&#39;到&#39; int&#39;

我尝试通过将for循环代码更改为

来修复它
for(int i=0, i<2, i++)

我为for循环中的代码得到了一个不同的错误:错误X3022:标量,向量或预期的矩阵

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我终于收到了网站作者的回复。结果是一个XML转换器自动格式化了代码示例并弄乱了一些东西。这是正确的代码:

    cbuffer ConstantBuffer : register( b0 )
  {
    matrix World;
    matrix View;
    matrix Proj;

    float4 vLightDir[2];    
    float4 vLightColor[2];
    float4 vOutputColor;
  }

  struct PS_INPUT
  {
    float4 Pos : SV_POSITION;
    float3 Norm : TEXCOORD0;
  };

  //--------------------------------------------------------------------------------------
  // Pixel Shader
  //--------------------------------------------------------------------------------------
  float4 main( PS_INPUT input) : SV_Target
  {
    float4 finalColor = 0;

    //do NdotL lighting for 2 lights
    for(int i=0; i<2; i++)
    {
        finalColor += saturate( dot( (float3)vLightDir[i],input.Norm) * vLightColor[i] ); 
    }
    finalColor.a = 1;
    return finalColor;
  }