1 | // Vertex program for automatic terrain texture generation |
---|
2 | void main_vp |
---|
3 | ( |
---|
4 | float4 iPosition : POSITION, |
---|
5 | float4 iNormal : NORMAL, |
---|
6 | float2 iTexcoord : TEXCOORD0, |
---|
7 | |
---|
8 | out float4 oPosition : POSITION, |
---|
9 | out float4 oTexcoord : TEXCOORD0, |
---|
10 | out float4 oColor0 : COLOR0, |
---|
11 | out float4 oColor1 : COLOR1, |
---|
12 | out float4 oFog : TEXCOORD1, |
---|
13 | |
---|
14 | uniform float4x4 worldViewProj, |
---|
15 | uniform float4 lightDirection, |
---|
16 | uniform float4 ambientLight, |
---|
17 | |
---|
18 | uniform float4 configSettings, |
---|
19 | uniform float4 fogSettings, |
---|
20 | uniform float4 fogColour |
---|
21 | ) |
---|
22 | { |
---|
23 | // Calculate the output position and texture coordinates |
---|
24 | oPosition = mul(worldViewProj,iPosition); |
---|
25 | oTexcoord = float4(iPosition.x,iPosition.z,0.0,0.0) * configSettings[0]; |
---|
26 | |
---|
27 | float fog = clamp(( oPosition.z - fogSettings[0] ) / (fogSettings[1] - fogSettings[0]),0.0,1.0) * fogSettings[2]; |
---|
28 | |
---|
29 | // Calculate the diffuse and the ambient lighting |
---|
30 | float diffuse = dot(iNormal,lightDirection); |
---|
31 | |
---|
32 | // Set the output color based on the lighting |
---|
33 | float rock_factor = (iNormal.y > configSettings[1])?0.0:(clamp((configSettings[1] - iNormal.y) * configSettings[2],0.0,1.0)); |
---|
34 | float4 color = float4(diffuse,diffuse,diffuse,1.0) + (ambientLight * configSettings[3]); |
---|
35 | oColor0 = (1.0 - fog) * (color * (1.0 - rock_factor)); |
---|
36 | oColor1 = (1.0 - fog) * (color * rock_factor); |
---|
37 | oFog = fogColour * fog; |
---|
38 | } |
---|
39 | |
---|
40 | // Fragment program for automatic terrain texture generation |
---|
41 | void main_fp |
---|
42 | ( |
---|
43 | float4 iTexcoord : TEXCOORD0, |
---|
44 | float4 iColor0 : COLOR0, |
---|
45 | float4 iColor1 : COLOR1, |
---|
46 | float4 iFog : TEXCOORD1, |
---|
47 | |
---|
48 | out float4 oColor : COLOR, |
---|
49 | |
---|
50 | uniform sampler2D textureUnit0, |
---|
51 | uniform sampler2D textureUnit1 |
---|
52 | ) |
---|
53 | { |
---|
54 | // Sample the texture to get the output colour, times the lighting |
---|
55 | oColor = iFog + (tex2D(textureUnit0,iTexcoord.xy) * iColor0) + (tex2D(textureUnit1,iTexcoord.xy) * iColor1); |
---|
56 | oColor.a = 1.0; |
---|
57 | } |
---|
58 | |
---|