|
|
请大家帮我看看,我的这个shader有没有问题
//================================
//Global variebles;
//===============================
float4x4 matWorld;
float4x4 matWorldViewProj;
float3 LightPos;
float3 EyePos;
float3 LightAttenuation = float3(1, 0.8, 0.6);
float4 LightColor = float4(1, 0, 0, 1);
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 Normal : TEXCOORD0;
float2 Tex : TEXCOORD1;
float4 LightDir : TEXCOORD2;
float3 EyeDir : TEXCOORD3;
};
VS_OUTPUT main_vs(float3 inPos : POSITION,
float3 inNormal : NORMAL,
float2 inTex : TEXCOORD
)
{
VS_OUTPUT vsOut = (VS_OUTPUT)0;
vsOut.Pos = mul(float4(inPos, 1), matWorldViewProj);
vsOut.Normal = normalize(mul(float4(inNormal, 1), matWorld));
vsOut.Tex = inTex;
vsOut.LightDir.xyz = LightPos - mul(float4(inPos, 1), matWorld);
float Dist = length(vsOut.LightDir.xyz);
vsOut.LightDir.xyz /= Dist;
vsOut.LightDir.w = saturate(1 / (LightAttenuation.x + LightAttenuation.y * Dist + LightAttenuation.z * Dist * Dist));
vsOut.EyeDir = mul(float4(inPos, 1), matWorld) - EyePos;
return vsOut;
}
float4 main_ps(float3 inNormal : TEXCOORD0,
float4 inLightDir : TEXCOORD2,
float3 inEyeDir : TEXCOORD3
) : COLOR
{
float4 Color = float4(0, 0, 0, 0);
//=============
//Ambient
Color += LightColor * 0.2;
//================
//Diffuse
float Diff = saturate(dot(inNormal, inLightDir.xyz));
Color += LightColor * Diff * inLightDir.w;
//=================
//Specular
Diff = pow(saturate(dot(inLightDir.xyz, inEyeDir)), 16);
Color += LightColor * Diff * inLightDir.w;
return Color;
}
technique Phong
{
pass p0
{
VertexShader = compile vs_2_0 main_vs();
PixelShader = compile ps_2_0 main_ps();
}
}
|
|