[英]HLSL Pixel Shader 5.0 NdotL lighting sample
我正在使用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循环让我感到困惑。 我正在将i初始化为常量字符串,并且没有右括号。 同样,for循环中的代码也看起来不正确。 float4结构似乎附加了一个字符串“ saturate”,这也是一个函数吗? 没有适当的右花括号且没有分号的函数。
样本代码中似乎有一些错别字,而我正在努力解决这些错别字。 关于在这里应该写些什么的想法?
当我尝试在VS2012中编译代码时,出现以下错误:错误X3017:无法从'const string'隐式转换为'int'
我尝试通过将其更改为来修复for循环代码
for(int i=0, i<2, i++)
我在for循环中得到了一个不同的代码错误:错误X3022:标量,向量或矩阵均应
在此先感谢您的帮助
我终于得到了网站作者的回应。 事实证明,一个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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.