Ok, this should get you moving in the right direction.
// Parallax shader
// Untweaks
matrix WorldVP:WorldViewProjection;
matrix World:World;
matrix ViewInv:ViewInverse;
// Tweaks
float4 LightPosition_1={150.0f,150.0f,0.0f,1.0f};
float4 LightColor_1={1.0f,1.0f,1.0f,1.0f};
float LightRange_1=3000.0f;
float4 LightPosition_2={-150.0f,-150.0f,0.0f,1.0f};
float4 LightColor_2={1.0f,0.0f,0.0f,1.0f};
float LightRange_2=3000.0f;
float4 Ambient={0.25f,0.25f,0.25f,1.0f};
float SpecularPow=32.0f;
float Heightvec=0.03;
float BiasHeight=0.1;
float U=1.0f;
float V=1.0f;
float Fog=1.0f;
float FogRange=100.0f;
float4 FogColor={0.78f,0.78f,0.78f,1.0f};
// Texture
texture BaseTX<string Name="";>;
sampler2D Base=sampler_state{texture=<BaseTX>;};
texture NormalTX<string Name="";>;
sampler2D Normal=sampler_state{texture=<NormalTX>;};
texture HeightTX<string Name="";>;
sampler2D Height=sampler_state{texture=<HeightTX>;};
// Structures
struct input
{
float4 Pos:POSITION;
float2 UV:TEXCOORD;
float3 Normal:NORMAL;
float3 Tangent:TANGENT;
float3 Binormal:BINORMAL;
};
struct output
{
float4 OPos:POSITION;
float4 Pos:TEXCOORD4;
float2 Tex:TEXCOORD0;
float3 LightVec:TEXCOORD1;
float3 Attenuation:TEXCOORD2;
float3 ViewVec:TEXCOORD3;
};
// Vertex shader
output VS_L1(input IN)
{
output OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Pos=mul(IN.Pos,WorldVP );
OUT.Tex=IN.UV*float2(U,V);
float3 WNor=mul(IN.Normal,World);
WNor=normalize(WNor);
float3 Wtan=mul(IN.Tangent,World);
Wtan=normalize(Wtan);
float3 Wbin=mul(IN.Binormal,World);
Wbin=normalize(Wbin);
float3 WPos=mul(IN.Pos,World);
float3x3 TBN={Wtan,Wbin,WNor};TBN=transpose(TBN);
float3 LightPos=LightPosition_1-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-LightPos/LightRange_1;
OUT.ViewVec=mul(ViewPos,TBN);
return OUT;
}
// Vertex shader
output VS_L2(input IN)
{
output OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Pos=mul(IN.Pos,WorldVP );
OUT.Tex=IN.UV*float2(U,V);
float3 WNor=mul(IN.Normal,World);
WNor=normalize(WNor);
float3 Wtan=mul(IN.Tangent,World);
Wtan=normalize(Wtan);
float3 Wbin=mul(IN.Binormal,World);
Wbin=normalize(Wbin);
float3 WPos=mul(IN.Pos,World);
float3x3 TBN={Wtan,Wbin,WNor};TBN=transpose(TBN);
float3 LightPos=LightPosition_2-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-LightPos/LightRange_2;
OUT.ViewVec=mul(ViewPos,TBN);
return OUT;
}
// Pixel shader
float4 PS_L1(output IN):COLOR
{
float3 View=normalize(IN.ViewVec);
float HeightTex=tex2D(Height,IN.Tex).x+BiasHeight;
float2 NewUv=(Heightvec*HeightTex-0.02)*View+IN.Tex;
float4 Texture=tex2D(Base,NewUv);
float3 NormalMap=tex2D(Normal,NewUv)*2-1;
NormalMap=normalize(NormalMap);
float3 LightV=normalize(IN.LightVec);
float Normal=saturate(dot(NormalMap,LightV));
float Specular=saturate(dot(reflect(-View,NormalMap),LightV));
Specular=pow(Specular,SpecularPow);
float4 DiffuseLight=1-dot(IN.Attenuation,IN.Attenuation);
float4 Light=saturate(DiffuseLight*LightColor_1);
float4 PixelColour=Texture*(((Normal+Specular)*Light)+Ambient);
float FogStrength=IN.Pos.z/FogRange;
return lerp(PixelColour,FogColor,FogStrength);
}
// Pixel shader
float4 PS_L2(output IN):COLOR
{
float3 View=normalize(IN.ViewVec);
float HeightTex=tex2D(Height,IN.Tex).x+BiasHeight;
float2 NewUv=(Heightvec*HeightTex-0.02)*View+IN.Tex;
float4 Texture=tex2D(Base,NewUv);
float3 NormalMap=tex2D(Normal,NewUv)*2-1;
NormalMap=normalize(NormalMap);
float3 LightV=normalize(IN.LightVec);
float Normal=saturate(dot(NormalMap,LightV));
float Specular=saturate(dot(reflect(-View,NormalMap),LightV));
Specular=pow(Specular,SpecularPow);
float4 DiffuseLight=1-dot(IN.Attenuation,IN.Attenuation);
float4 Light=saturate(DiffuseLight*LightColor_2);
return Texture*((Normal+Specular)*Light);
}
// Techniques
technique Light1
{
pass p1
{
vertexShader=compile vs_2_0 VS_L1();
pixelShader=compile ps_2_0 PS_L1();
}
}
technique Light2
{
pass p1
{
vertexShader=compile vs_2_0 VS_L1();
pixelShader=compile ps_2_0 PS_L1();
}
pass p2
{
vertexShader=compile vs_2_0 VS_L2();
pixelShader=compile ps_2_0 PS_L2();
AlphaBlendEnable = True;
SrcBlend = One;
DestBlend = One;
}
}