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); }