
final result of splatting rock with bump in one shader
If you want it in your game:
//Nomadsoul's shader
//found shader help on nvidia shader and truevision3d forum
float4x4 World: World;
float4x4 View: View;
float4x4 Projection: WorldViewProjection;
float4 AmbientColor = float4(1, 1, 1, 1);
float AmbientIntensity = 0.1;
float4x4 WorldInverseTranspose: WorldInverseTranspose;
float3 DiffuseLightDirection = float3(0.2,5,-1);
float4 DiffuseColor = float4(1,1, 1, 1);
float DiffuseIntensity = 0.0;
float Shininess = 200;
float4 SpecularColor = float4(1, 1, 1, 1);
float SpecularIntensity = 10;
float3 ViewVector = float3(1, 0, 0);
texture ModelTexture
<
string ResourceName = "roadfull.jpg";
>;
sampler2D textureSampler = sampler_state {
Texture = (ModelTexture);
MinFilter = Linear;
MagFilter = Linear;
AddressU = Clamp;
AddressV = Clamp;
};
float BumpConstant = 1;
texture NormalMap
<
string ResourceName = "normalmap1.png";
>;
sampler2D bumpSampler = sampler_state {
Texture = (NormalMap);
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
struct VertexShaderInput
{
float4 Position : POSITION0;
float3 Normal : NORMAL0;
float3 Tangent : TANGENT0;
float3 Binormal : BINORMAL0;
float2 TextureCoordinate : TEXCOORD0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float2 TextureCoordinate : TEXCOORD0;
float3 Normal : TEXCOORD1;
float3 Tangent : TEXCOORD2;
float3 Binormal : TEXCOORD3;
};
//splatttin
texture baseTexturet
<
string ResourceName = "stone1.jpg";
>;
texture firstTexturet : diffuse
<
string ResourceName = "dirtandgrass.jpg";
>;
texture secondTexturet : diffuse
<
string ResourceName = "assorted_rock.jpg";
>;
texture thirdTexturet : diffuse
<
string ResourceName = "seashell-rock.jpg";
>;
sampler2D baseTexture = sampler_state
{
texture = <baseTexturet>;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Clamp;
AddressV = Clamp;
};
sampler FirstTexture = sampler_state
{
texture = <firstTexturet>;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
sampler secondTexture = sampler_state
{
texture = <secondTexturet>;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
sampler thirdTexture = sampler_state
{
texture = <thirdTexturet>;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
uniform sampler2D blendMapTexture;
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output= (VertexShaderOutput)0;
// float4 worldPosition = mul(input.Position, World);
//normalement float3 worldPosition = mul(input.Position, World).xyz;
// float4 viewPosition = mul(worldPosition, View);
// normalement float3 viewPosition = View[3].xyz;
output.Position = output.Position + mul( input.Position, Projection);
//normalement output.Position = mul( float4(worldPosition.xyz , 1.0) , Projection);
output.Normal = normalize(mul(input.Normal, WorldInverseTranspose));
output.Tangent = normalize(mul(input.Tangent, WorldInverseTranspose));
output.Binormal = normalize(mul(input.Binormal, WorldInverseTranspose));
output.TextureCoordinate = input.TextureCoordinate;
return output;
}
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
// Calculate the normal, including the information in the bump map
float3 bump = BumpConstant * (tex2D(bumpSampler, input.TextureCoordinate) - (0.5, 0.5, 0.5));
float3 bumpNormal = input.Normal + (bump.x * input.Tangent + bump.y * input.Binormal);
bumpNormal = normalize(bumpNormal);
// Calculate the diffuse light component with the bump map normal
float diffuseIntensity = dot(normalize(DiffuseLightDirection), bumpNormal);
if(diffuseIntensity < 0)
diffuseIntensity = 0.01;
// Calculate the specular light component with the bump map normal
float3 light = normalize(DiffuseLightDirection);
float3 r = normalize(2* dot(light, bumpNormal) * bumpNormal+light);
float3 v = normalize(mul(normalize(ViewVector), World));
float dotProduct = dot(r, v);
float4 specular = SpecularIntensity * SpecularColor * max(pow(dotProduct, Shininess), 0) * diffuseIntensity;
// Calculate the texture color
float4 textureColor = tex2D(textureSampler, input.TextureCoordinate);
textureColor.a = 1;
float4 BumpColor= textureColor* (diffuseIntensity) + AmbientColor * AmbientIntensity + specular;
//splattinnnnng
float4 baseColor = tex2D(baseTexture, input.TextureCoordinate.xy);
float4 firstColor = tex2D(FirstTexture, input.TextureCoordinate.xy*5 );
float4 secondColor = tex2D(secondTexture, input.TextureCoordinate.xy*5 );
float4 thirdColor = tex2D(thirdTexture,input.TextureCoordinate.xy*5);
float batchSize= 1;
float4 blendMap = tex2D(blendMapTexture, input.TextureCoordinate.xy /= batchSize);
float4 result = lerp(BumpColor ,firstColor, blendMap.r);
result= lerp(result,secondColor,blendMap.g);
result= lerp(result,thirdColor,blendMap.b);
//end splatting
// Combine all of these values into one (including the ambient light)
//normalement return (textureColor * (diffuseIntensity) + AmbientColor * AmbientIntensity + specular);
return (firstColor * result.r + secondColor * result.g + thirdColor * result.b);
// return firstColor * result.r;
}
technique BumpMapped
{
pass Pass1
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}