Code:
// Pixel shader input structure
struct PS_INPUT
{
float4 Position : POSITION;
float2 Texture : TEXCOORD0;
};
// Pixel shader output structure
struct PS_OUTPUT
{
float4 Color : COLOR0;
};
//3D Shader variables
sampler2D Tex0;
float h1;
float h2;
float c1;
float c2;
float t1;
float t2;
float l1;
float l2;
//Normal Map variables
sampler2D img;
sampler2D bkd : register(s1);
int lightAenabled, lightBenabled, lightCenabled;
float4 lightAColor, lightBColor, lightCColor, ambientLight;
float fPixelWidth;
float fPixelHeight;
float lightAX, lightBX, lightCX;
float lightAY, lightBY, lightCY;
float lightAZ, lightBZ, lightCZ;
float lightABrightness, lightBBrightness, lightCBrightness;
float objX, objY;
PS_OUTPUT ps_main( in PS_INPUT In) : COLOR
{
float4 normal = tex2D(img, In.Texture);
normal = float4(normal.x-0.5, normal.y-0.5, normal.z-0.5, normal.w);
float4 background = tex2D(bkd, In.Texture);
float4 color = float4(0,0,0,normal.a);
float3 pixelPos = float3(In.Texture.xy,0);
float3 objPos = float3(objX,objY,0);
float3 lightPos, dir;
float dist, amount;
float ch = (h1 + (h2 - h1) * In.Texture.x) / 2;
float cc = c1 + (c2 - c1) * In.Texture.x;
float cl = l1 + (l2 - l1) * In.Texture.x;
if(lightAenabled)
{
lightPos = float3((lightAX-objX)*fPixelWidth+0.5,(lightAY-objY)*fPixelHeight+0.5,lightAZ);
dir = normalize(lightPos - pixelPos);
dist = 1/length(lightPos - pixelPos);
amount = saturate(dot(normal,dir));
color.rgb += amount * lightABrightness * dist * lightAColor.rgb;
}
if(lightBenabled)
{
lightPos = float3((lightBX-objX)*fPixelWidth+0.5,(lightBY-objY)*fPixelHeight+0.5,lightBZ);
dir = normalize(lightPos - pixelPos);
dist = 1/length(lightPos - pixelPos);
amount = saturate(dot(normal,dir));
color.rgb += amount * lightBBrightness * dist * lightBColor.rgb;
}
if(lightCenabled)
{
lightPos = float3((lightCX-objX)*fPixelWidth+0.5,(lightCY-objY)*fPixelHeight+0.5,lightCZ);
dir = normalize(lightPos - pixelPos);
dist = 1/length(lightPos - pixelPos);
amount = saturate(dot(normal,dir));
color.rgb += amount * lightCBrightness * dist * lightCColor.rgb;
}
PS_OUTPUT Out, Normal;
Out.Color = float4(1,0,0,1);
Normal.Color = float4 (ambientLight.rgb,0) + color * background;
if(In.Texture.y < cc - ch || In.Texture.y > cc + ch) //<<<<<<<<<<<< = ps_2_0
{
Out.Color = float4(0,0,0,0);
}
else
{
float cy = (In.Texture.y - cc + ch) / (ch*2);
float cx = In.Texture.x * (t2 - t1) + t1;
Out.Color = tex2D(Tex0, float2(cx,cy));
Out.Color *= float4(cl,cl,cl,1) ;
}
return Out;
//OR return Normal;
//THIS WORKS BUT NOT BOTH!
}
// Effect technique
technique tech_main {pass P0{PixelShader = compile ps_2_0 ps_main();}}