blob: b0b594c62459f9d247399b40bc738021757de946 [file] [log] [blame]
uniform vec3 m_region1;
uniform vec3 m_region2;
uniform vec3 m_region3;
uniform vec3 m_region4;
uniform sampler2D m_region1ColorMap;
uniform sampler2D m_region2ColorMap;
uniform sampler2D m_region3ColorMap;
uniform sampler2D m_region4ColorMap;
uniform sampler2D m_slopeColorMap;
uniform float m_slopeTileFactor;
uniform float m_terrainSize;
varying vec3 normal;
varying vec4 position;
vec4 GenerateTerrainColor() {
float height = position.y;
vec4 p = position / m_terrainSize;
vec3 blend = abs( normal );
blend = (blend -0.2) * 0.7;
blend = normalize(max(blend, 0.00001)); // Force weights to sum to 1.0 (very important!)
float b = (blend.x + blend.y + blend.z);
blend /= vec3(b, b, b);
vec4 terrainColor = vec4(0.0, 0.0, 0.0, 1.0);
float m_regionMin = 0.0;
float m_regionMax = 0.0;
float m_regionRange = 0.0;
float m_regionWeight = 0.0;
vec4 slopeCol1 = texture2D(m_slopeColorMap, p.yz * m_slopeTileFactor);
vec4 slopeCol2 = texture2D(m_slopeColorMap, p.xy * m_slopeTileFactor);
// Terrain m_region 1.
m_regionMin = m_region1.x;
m_regionMax = m_region1.y;
m_regionRange = m_regionMax - m_regionMin;
m_regionWeight = (m_regionRange - abs(height - m_regionMax)) / m_regionRange;
m_regionWeight = max(0.0, m_regionWeight);
terrainColor += m_regionWeight * texture2D(m_region1ColorMap, p.xz * m_region1.z);
// Terrain m_region 2.
m_regionMin = m_region2.x;
m_regionMax = m_region2.y;
m_regionRange = m_regionMax - m_regionMin;
m_regionWeight = (m_regionRange - abs(height - m_regionMax)) / m_regionRange;
m_regionWeight = max(0.0, m_regionWeight);
terrainColor += m_regionWeight * (texture2D(m_region2ColorMap, p.xz * m_region2.z));
// Terrain m_region 3.
m_regionMin = m_region3.x;
m_regionMax = m_region3.y;
m_regionRange = m_regionMax - m_regionMin;
m_regionWeight = (m_regionRange - abs(height - m_regionMax)) / m_regionRange;
m_regionWeight = max(0.0, m_regionWeight);
terrainColor += m_regionWeight * texture2D(m_region3ColorMap, p.xz * m_region3.z);
// Terrain m_region 4.
m_regionMin = m_region4.x;
m_regionMax = m_region4.y;
m_regionRange = m_regionMax - m_regionMin;
m_regionWeight = (m_regionRange - abs(height - m_regionMax)) / m_regionRange;
m_regionWeight = max(0.0, m_regionWeight);
terrainColor += m_regionWeight * texture2D(m_region4ColorMap, p.xz * m_region4.z);
return (blend.y * terrainColor + blend.x * slopeCol1 + blend.z * slopeCol2);
}
void main() {
vec4 color = GenerateTerrainColor();
gl_FragColor = color;
}