我正在尝试对一个立方体进行纹理处理,但当我尝试运行程序时,fx文件出现错误X3004未声明的标识符"input",但input是在顶部附近声明的,所以我不知道出了什么问题。我已经尽力争取了4天的帮助。
该代码包括diffuce照明以及纹理。我认为output.tex=input.tex是个问题,但我不确定。
Texture2D txDiffuse : register(t0);
SamplerState samLinear : register(s0);
float4 textureColour = txDiffuse.Sample(samLinear, input.Tex);
struct VS_INPUT
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
//--------------------------------------------------------------------------------------
// Constant Buffer Variables
//--------------------------------------------------------------------------------------
cbuffer ConstantBuffer : register( b0 )
{
matrix World;
matrix View;
matrix Projection;
float4 DiffuseMtrl;
float4 DiffuseLight;
float3 LightVecW;
}
//--------------------------------------------------------------------------------------
struct VS_OUTPUT
{
float4 Pos : SV_POSITION;
float4 Color : COLOR0;
float2 Tex : TEXCOORD0;
};
//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
//guroud shading with diffuse lighting
VS_OUTPUT VS(float4 Pos : POSITION, float3 NormalL : NORMAL)
{
VS_OUTPUT output = (VS_OUTPUT)0;
output.Pos = mul(Pos, World);
output.Pos = mul(output.Pos, View);
output.Pos = mul(output.Pos, Projection);
// Convert from local space to world space
// W component of vector is 0 as vectors cannot be translated
float3 normalW = mul(float4(NormalL, 0.0f), World).xyz;
normalW = normalize(normalW);
// Compute Colour using Diffuse lighting only
float diffuseAmount = max(dot(LightVecW, normalW), 0.0f);
output.Color.rgb = diffuseAmount * (DiffuseMtrl * DiffuseLight).rgb;
output.Color.a = DiffuseMtrl.a;
return output;
output.Tex = input.Tex;
}
//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 PS( VS_OUTPUT input ) : SV_Target
{
return input.Color;
}
错误Framework.fx(12,53-57):错误X3004:未声明的标识符"input"
您试图在任何函数之外对纹理进行采样(第4行)。您希望此代码在顶点着色器(VS)或像素着色器(PS)中的何处运行?
删除第4行并将像素着色器更改为:
return txDiffuse.Sample(samLinear, input.Tex);
您似乎有一些根本没有使用的结构(VSINPUT、PSINPUT)。顶点着色器的最后一行也不会编译,因为您使用的是"input.Tex",而顶点着色器没有名为"input"的变量。如果你不打算使用它们,请将VS的第一行更改为:
VS_OUTPUT VS(float4 Pos : POSITION, float3 NormalL : NORMAL, float2 Tex : TEXCOORD0)
着色器的结束为:
output.Color.a = DiffuseMtrl.a;
output.Tex = Tex;
return output;