|
|
我以前是用9.0C August 2006写的
现在改成9.0C之后的某版本后(忘记下的是哪版的了)
D3DXCreateEffectFromFile( Device, "***", NULL, NULL, 0, NULL, &teffect, NULL );
这样的函数总返回FAILED,本来没问题的
到底是SHADER编写上的问题还是,D3DXCreateEffectFromFile函数的问题啊。。。。
PS:貌似是SHADER编写上的问题 用别人的FX没问题,难道版本更新了 HLSL兼容变差了。。。
这是其中一个EFFECT
//
// 简单的顶点着色
//
//变换矩
float4x4 matW: WORLD;
float4x4 matV: VIEW;
float4x4 matP: PROJECTION;
float4 s;
// 纹理
texture tex0;
texture tex1;
texture tex2;
texture tex3;
texture tex4;
texture tex5;
// 输入顶点格式
struct VS_INPUT
{
float3 pos : POSITION;
float4 diff : COLOR;
float2 tex : TEXCOORD0;
float2 tex1 : TEXCOORD1;
};
// 输出顶点格式
struct VS_OUTPUT
{
float4 pos : POSITION;
float4 diff : COLOR;
float2 tex : TEXCOORD0;
float2 tex1 : TEXCOORD1;
float2 tex2 : TEXCOORD2;
};
// 声明名为VS的顶点着色器
VS_OUTPUT VS( VS_INPUT In )
{
VS_OUTPUT Out = (VS_OUTPUT)0;
float4x4 WorldView = mul(matW, matV);
float3 P = mul(float4(In.pos, 1), (float4x3)WorldView);
Out.pos = mul(float4(P, 1), matP);
Out.tex.x = In.tex.x;
Out.tex.y = In.tex.y;
Out.tex1.x = In.tex1.x;
Out.tex1.y = In.tex1.y;
Out.diff=In.diff;
float3 aa={1,1,1};
float2 tt=mul(aa,(float2x2)matW);
float4 p2=mul(float4(In.pos,1),matW);
Out.tex2.x=p2.x;
Out.tex2.y=p2.z;
return Out;
}
// 纹理采样状态
sampler s0 = sampler_state{Texture=(tex0);MipFilter=LINEAR;MinFilter=LINEAR;MagFilter=LINEAR;};
sampler s1 = sampler_state{Texture=(tex1);MipFilter=LINEAR;MinFilter=LINEAR;MagFilter=LINEAR;};
sampler s2 = sampler_state{Texture=(tex2);MipFilter=LINEAR;MinFilter=LINEAR;MagFilter=LINEAR;};
sampler s3 = sampler_state{Texture=(tex3);MipFilter=LINEAR;MinFilter=LINEAR;MagFilter=LINEAR;};
sampler s4 = sampler_state{Texture=(tex4);MipFilter=LINEAR;MinFilter=LINEAR;MagFilter=LINEAR;};
sampler s5 = sampler_state{Texture=(tex5);MipFilter=LINEAR;MinFilter=LINEAR;MagFilter=LINEAR;};
float4 PS(
float4 diff : COLOR,
float2 Tex0 : TEXCOORD0,
float2 Tex1 : TEXCOORD1,
float2 Tex2 : TEXCOORD2
) : COLOR
{
float4 vfade =tex2D(s3, Tex1);
float4 d1=tex2D(s0,Tex0);
float4 d2=tex2D(s1,Tex0);
float4 d3=tex2D(s2,Tex0);
float4 shadow=tex2D(s4,Tex1);
float4 outf=shadow*(vfade.r*lerp(0,d1,1)+vfade.g*lerp(0,d2,1)+vfade.b*lerp(0,d3,1));
return outf;
}
float4 PS_shadow(
float4 diff : COLOR,
float2 Tex0 : TEXCOORD0,
float2 Tex1 : TEXCOORD1,
float2 Tex2 : TEXCOORD2
) : COLOR
{
float4 vfade =tex2D(s3, Tex1);
float4 d1=tex2D(s0,Tex0);
float4 d2=tex2D(s1,Tex0);
float4 d3=tex2D(s2,Tex0);
float4 shadow=tex2D(s4,Tex1);
float shadow2=1.0f;
if(Tex2.x<s.x+2&&Tex2.y<s.z+2&&Tex2.x>s.x-2&&Tex2.y>s.z-2)
{
float2 texx={0,0};
texx.x=(Tex2.x-s.x+2)/4;
texx.y=1-(Tex2.y-s.z+2)/4;
shadow2=tex2D(s5,texx);
}
float4 outf=shadow2*shadow*(vfade.r*lerp(0,d1,1)+vfade.g*lerp(0,d2,1)+vfade.b*lerp(0,d3,1));
return outf;
}
float4 PSline(
float2 Tex0 : TEXCOORD0,
float2 Tex1 : TEXCOORD1,
float4 diff : COLOR
) : COLOR
{
return ((float4)0);
}
// MyShader技巧声明
technique MyShader
{
pass P0 // 最初的0号pass
{
// shaders
VertexShader = compile vs_2_0 VS();
PixelShader = compile ps_2_0 PS();
}
}
technique MyShadow
{
pass P0 // 最初的0号pass
{
// shaders
VertexShader = compile vs_1_0 VS();
PixelShader = compile ps_2_0 PS_shadow();
}
}
technique MyShader2
{
pass P0 // 最初的0号pass
{
// shaders
VertexShader = compile vs_1_0 VS();
PixelShader = compile ps_1_0 PSline();
}
} |
|