Original Post
I am trying to write a shader of ShadowMap. But once i compile it in FXcomposser, it told me that "POSITION" is an invalid input semantic even i using vs_3_0 & ps_3_0. How could this be ? This is my shader, anyone give me a hand T_T. EDIT: Please remember to use 'source' tags.
float4x4 g_mCamToLight; // 将投影后的摄像机坐标系下的位置转换为投影后的光源坐标系的矩阵
float4x4 g_mWorldViewProjCamera; // 摄像机的变换矩阵
float4x4 g_mWorldViewProjLight; // 光的变换矩阵
float g_fTanPhi; // 锥形光的顶角的1/2,用于判断定点是否在光照的范围以内
float g_fWidth; // 方向光有效范围的宽
float g_fHeight; // 方向光有效范围的高
texture g_tShadowMap; // ShadowMap
sampler sShadowMap =
sampler_state
{
Texture = <g_tShadowMap>;
MipFilter = POINT;
MinFilter = POINT;
MagFilter = POINT;
};
//struct VS_OUTPUT
//{
// float4 Pos : POSITION;
//};
struct PS_OUTPUT
{
float4 RGBColor : COLOR0;
};
float4 SHADOW_Dispose ()
{
return float4 (0,0,1,0);
}
float4 NOSHADOW_Dispose ()
{
return float4 (0,1,0,0);
}
float4 OUTOFLIGHT_Dispose ()
{
return float4 (1,1,1,0);
}
float4 VS_RenderShadowMap( float4 vPos : POSITION ) : POSITION
{
float4 Pos;
Pos= mul(vPos,g_mWorldViewProjLight);
return Pos;
}
PS_OUTPUT SPOT_RenderShadowMapPS( float4 Pos : POSITION)
{
PS_OUTPUT Out;
float fDepth = Pos.z;
//下面将深度数据写入像素信息中
fDepth *= 0.00390625; // 1.0f/256.0f
//fDepth *= 0.01;
Out.RGBColor.r = frac(fDepth);
fDepth -= Out.RGBColor.r;
fDepth *= 0.00390625;
//fDepth *= 0.01;
Out.RGBColor.g = frac(fDepth);
fDepth -= Out.RGBColor.g;
fDepth *= 0.00390625;
//fDepth *= 0.01;
Out.RGBColor.b = frac(fDepth);
fDepth -= Out.RGBColor.b;
fDepth *= 0.00390625;
//fDepth *= 0.01;
Out.RGBColor.a = frac(fDepth);
return Out;
}
float4 VS_RenderShadowToObj( float4 vPos : POSITION ): POSITION
{
float4 Pos;
Pos = mul(vPos,g_mWorldViewProjCamera);
return Pos;
}
PS_OUTPUT SPOT_RenderShadowToObjPS ( float4 Pos : POSITION )
{
PS_OUTPUT Out;
float4 vColor = float4(0,0,0,0);
float4 vShadowMapCoord = mul( Pos, g_mCamToLight );
float2 vUV = float2( vShadowMapCoord.x / vShadowMapCoord.w, vShadowMapCoord.y / vShadowMapCoord.w );
vColor = tex2D( sShadowMap, vUV );
Out.RGBColor = vColor;//forTest
return Out;
}
PS_OUTPUT DIR_RenderShadowMapPS( float4 Pos : POSITION)
{
PS_OUTPUT Out;
Out.RGBColor = float4(0,0,0,0);
return Out;
}
PS_OUTPUT DIR_RenderShadowToObjPS ( float4 Pos : POSITION )
{
PS_OUTPUT Out;
Out.RGBColor = float4(0,0,0,0);
return Out;
}
technique SPOT_RenderShadowMap
{
pass P0
{
VertexShader = compile vs_3_0 VS_RenderShadowMap();
PixelShader = compile ps_3_0 SPOT_RenderShadowMapPS( );
}
}
technique SPOT_RenderShadowToObj
{
pass P0
{
VertexShader = compile vs_3_0 VS_RenderShadowToObj();
PixelShader = compile ps_3_0 SPOT_RenderShadowToObjPS();
}
}
technique DIR_RenderShadowMap
{
pass P0
{
VertexShader = compile vs_3_0 VS_RenderShadowMap();
PixelShader = compile ps_3_0 DIR_RenderShadowMapPS( );
}
}
technique DIR_RenderShadowToObj
{
pass P0
{
VertexShader = compile vs_3_0 VS_RenderShadowToObj();
PixelShader = compile ps_3_0 DIR_RenderShadowToObjPS();
}
}