struct VS_OUTPUT_NEW_MAP
{
float4 Pos : POSITION;
float4 Color : COLOR0;
float4 Tex0 : TEXCOORD0;
float3 CameraDir : TEXCOORD1;
float4 ShadowTexCoord : TEXCOORD2;
float2 ShadowTexelPos : TEXCOORD3;
float Fog : FOG;
float3 SunLightDir : TEXCOORD4;
float3 SkyLightDir : TEXCOORD5;
float3 ViewDir : TEXCOORD6;
float3 WorldNormal : TEXCOORD7;
};
VS_OUTPUT_NEW_MAP vs_new_map(uniform const int PcfMode, float4 vPosition : POSITION,
float3 vNormal : NORMAL, float3 vTangent : TANGENT, float3 vBinormal : BINORMAL,
float2 tc : TEXCOORD0, float4 vColor : COLOR0,float4 vLightColor : COLOR1)
{
INITIALIZE_OUTPUT(VS_OUTPUT_NEW_MAP, Out);
Out.Pos = mul(matWorldViewProj, vPosition);
float4 vWorldPos = (float4)mul(matWorld,vPosition);
float3 vWorldN = normalize(mul((float3x3)matWorld, vNormal)); //normal in world space
float3 vWorld_binormal = normalize(mul((float3x3)matWorld, vBinormal)); //normal in world space
float3 vWorld_tangent = normalize(mul((float3x3)matWorld, vTangent)); //normal in world space
float3x3 TBNMatrix = float3x3(vWorld_tangent, vWorld_binormal, vWorldN);
Out.Tex0.xy = tc;
Out.Tex0.z = (0.7f * (vWorldPos.z - 1.5f));
Out.Tex0.w = vWorldPos.x;
float4 diffuse_light = vAmbientColor;
if (true /*_UseSecondLight*/)
{
diffuse_light += vLightColor;
}
//directional lights, compute diffuse color
diffuse_light += saturate(dot(vWorldN, -vSkyLightDir)) * vSkyLightColor;
//point lights
#ifndef USE_LIGHTING_PASS
diffuse_light += calculate_point_lights_diffuse(vWorldPos, vWorldN, false, false);
#endif
//apply material color
// Out.Color = min(1, vMaterialColor * vColor * diffuse_light);
Out.Color = (vMaterialColor * vColor * diffuse_light);
//shadow mapping variables
//move sun light to pixel shader
//float wNdotSun = saturate(dot(vWorldN, -vSunDir));
//Out.SunLight = (wNdotSun) * vSunColor * vMaterialColor * vColor;
Out.SunLightDir = normalize(mul(TBNMatrix, -vSunDir));
if (PcfMode != PCF_NONE)
{
float4 ShadowPos = mul(matSunViewProj, vWorldPos);
Out.ShadowTexCoord = ShadowPos;
Out.ShadowTexCoord.z /= ShadowPos.w;
Out.ShadowTexCoord.w = 1.0f;
Out.ShadowTexelPos = Out.ShadowTexCoord * fShadowMapSize;
//shadow mapping variables end
}
Out.ViewDir = normalize(vCameraPos-vWorldPos);
Out.CameraDir = mul(TBNMatrix, -Out.ViewDir.xyz);
Out.WorldNormal = vWorldN;
//apply fog
float3 P = mul(matWorldView, vPosition); //position in view space
float d = length(P);
Out.Fog = get_fog_amount_new(d, vWorldPos.z);
return Out;
}
PS_OUTPUT ps_new_map(VS_OUTPUT_NEW_MAP In, uniform const int PcfMode)
{
PS_OUTPUT Output;
float2 parallaxcoords = 0.95*In.Tex0.xy;
parallaxcoords.x = parallaxcoords.x + 0.1*sin(parallaxcoords.y);
//PARALLAX SECTION
float3 viewVec = normalize(In.CameraDir);
{
float factor = (0.01f * vSpecularColor.x);
float volume = (factor * 1.0);//0.04;
float bias = (factor * -0.5f);//-0.02;
//PARALLAX TEX A
float height = tex2D(EnvTextureSampler, parallaxcoords).a;
float offset = height * volume + bias;
//APPLY PARALLAX TO TEXCOORDS
In.Tex0.xy += offset * viewVec.xy;
//In.PosWater.xy += offset * viewVec.xy;
parallaxcoords +=offset * viewVec.xy;
}
//PARALLAX END
float4 tex_col = tex2D(MeshTextureSampler, In.Tex0.xy);
INPUT_TEX_GAMMA(tex_col.rgb);
float season = GetSeason();
float height = In.Tex0.z;
if (season > 2.5) //3= winter
{
height *= 2;
height += 1.65;
}
else
{
height *=1;
}
tex_col.rgb += saturate(height * (tex_col.a) - 1.5f);
tex_col.a = 1.0f;
//parallax darkening
tex_col.rgb = lerp(tex_col.rgb*float3(0.8,0.75,0.65), tex_col.rgb*1.30,1-tex2D(EnvTextureSampler, parallaxcoords).a);
//
float3 normal = (2.0f * tex2D(NormalTextureSampler, In.Tex0.xy * map_normal_detail_factor).rgb - 1.0f);
float3 normalpara = (2.0f * tex2D(EnvTextureSampler, parallaxcoords).rgb - 1.0f);
//float wNdotSun = saturate(dot(vWorldN, -vSunDir));
//Out.SunLight = (wNdotSun) * vSunColor * vMaterialColor * vColor;
float4 In_SunLight = saturate(dot(normal, In.SunLightDir)) * vSunColor * vMaterialColor;// * vColor; vertex color needed??
float sun_amount = 1;
if ((PcfMode != PCF_NONE))
{
sun_amount = GetSunAmount(PcfMode, In.ShadowTexCoord, In.ShadowTexelPos);
}
Output.RGBColor = tex_col * ((In.Color + In_SunLight * sun_amount));
//add fresnel term
{
float fresnel = 1-(saturate(dot( normalize(In.ViewDir), normalpara)));
float fresnel2 = 1-(saturate(dot( normalize(In.ViewDir), normal)));
fresnel *= fresnel2;
//fresnel = max(0.75,fresnel);
//fresnel = min(0.3,fresnel);
Output.RGBColor.rgb = lerp(Output.RGBColor.rgb,Output.RGBColor.rgb*fresnel,0.5);//max(0.6,fresnel+0.1);
}
// gamma correct
OUTPUT_GAMMA(Output.RGBColor.rgb);
return Output;
}
VertexShader vs_new_map_compiled_PCF_NONE = compile vs_2_0 vs_new_map(PCF_NONE);
VertexShader vs_new_map_compiled_PCF_DEFAULT = compile vs_2_0 vs_new_map(PCF_DEFAULT);
VertexShader vs_new_map_compiled_PCF_NVIDIA = compile vs_2_0 vs_new_map(PCF_NVIDIA);
technique new_map_shader
{
pass P0
{
VertexShader = vs_new_map_compiled_PCF_NONE;
PixelShader = compile PS_2_X ps_new_map(PCF_NONE);
}
}