2014-08-29 120 views
0

我正在通过使用directX的Pixel Shader 5.0教程。我做得很好,直到我到了第四个教训,其中有我创建一个PixelShader.hlsl文件用下面的代码:HLSL像素着色器5.0 NdotL照明示例

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结构似乎有一个字符串“饱和”被追加到它,这也是一个函数?一个函数没有适当的闭括号,没有分号也不会少。

它看起来像样本代码中有一些拼写错误,我努力修复它们。有什么想法应该写在这里?

当我尝试编译在VS2012的代码,我收到以下错误:错误X3017:不能隐式地从“常量字符串”到“廉政”

转换我试图将其更改为固定的循环代码

for(int i=0, i<2, i++) 

,我得到的代码不同的误差范围内的for循环:错误X3022:标量,矢量或矩阵预期提前

感谢您的帮助

回答

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; 
    }