float3 expand(float3 v)
{
return (v - 0.5) * 2;
}
void main_vp ( in float4 Position : POSITION,
in float3 Normal : NORMAL,
in float2 UV : TEXCOORD0,
in float2 UV2 : TEXCOORD1,
in float3 Tangent : TEXCOORD2,
out float4 oPosition : POSITION,
out float2 oUv : TEXCOORD0,
out float2 oUv2 : TEXCOORD1,
out float3 oNormal : TEXCOORD2,
out float3 oTangent : TEXCOORD3,
out float3 oBiNormal : TEXCOORD4,
out float2 oClouds : TEXCOORD5,
out float3 oPos : TEXCOORD6,
uniform float4x4 WorldViewProj,
uniform float4x4 World,
uniform float CloudTime)
{
oPosition = mul(WorldViewProj, Position);
oUv = UV;
oUv2 = UV2;
oPos = Position;
oNormal = normalize(Normal.xyz);
oTangent = normalize(Tangent.xyz);
oBiNormal = normalize(cross(oTangent,oNormal).xyz);
//UV coordinates for the clouds
float4 tmp = mul(World, Position);
oClouds.x = (tmp.x+10000)/5000 + (CloudTime/320.0f);
oClouds.y = (tmp.z+10000)/5000 + (CloudTime/160.0f);
}
float4 main_fp (
in float4 iPosition : POSITION,
in float2 iUv : TEXCOORD0,
in float2 iUv2 : TEXCOORD1,
in float3 iNormal : TEXCOORD2,
in float3 iTangent : TEXCOORD3,
in float3 iBiNormal : TEXCOORD4,
in float2 iClouds : TEXCOORD5,
in float3 iPos : TEXCOORD6,
uniform float3 lightDiffuse[3],
uniform float3 lightSpec[3],
uniform float4 lightAtt[3],
uniform float4 LightPos[3],
uniform float4 EyePos,
uniform float4 ambient,
uniform sampler2D DiffuseMap : register(s0),
uniform sampler2D NormalMap : register(s1),
uniform sampler2D ScatMap : register(s2)
): COLOR0
{
float4 diffusemap = tex2D(DiffuseMap, iUv);
float3 bumpVec = expand(tex2D(NormalMap, iUv).xyz);
float1 specmap = tex2D(NormalMap, iUv).w;
float1 occlusion = tex2D(DiffuseMap, iUv2).a;
float4 wolken = tex2D(ScatMap, iClouds);
float3x3 invMatrix = transpose(float3x3(iTangent, iBiNormal, iNormal));
float3 normal = normalize(mul(invMatrix, bumpVec));
//ambient lighting
float4 oColor = float4(diffusemap.rgb,1) * ambient;
for (int j = 0; j < 3; j++)
{
if (any(lightDiffuse[j]))
{
//handle both directional and point lights
float3 lightDir = LightPos[j].xyz - (iPos * LightPos[j].w);
float dist = length(lightDir);
lightDir = normalize(lightDir);
float3 eyeDir = normalize(EyePos - iPos.xyz);
float3 halfAngle = normalize(eyeDir + lightDir);
float specFactor = pow(dot(normal, halfAngle),32);
float iD = dot(lightDir, normal);
float att = 1 / (lightAtt[j].y + lightAtt[j].z * dist + lightAtt[j].w * dist * dist);
oColor.rgb += att * ((diffusemap.rgb * lightDiffuse[j] * iD) + (diffusemap.rgb * lightSpec[j] * (specFactor * specmap)));
}
}
//ambient occlusion mapping
oColor.rgb *= float3(occlusion,occlusion,occlusion);
oColor *= wolken;
return saturate(oColor);
}