51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
#version 330 core
 | 
						|
out vec4 FragColor;
 | 
						|
 | 
						|
in vec3 FragPos;
 | 
						|
in vec3 Normal;
 | 
						|
in vec3 WorldPos;
 | 
						|
in float Detail;
 | 
						|
 | 
						|
uniform vec3 objectColor;
 | 
						|
uniform vec3 lightColor;
 | 
						|
uniform vec3 lightDir; /* Normalised direction vector for the light source. */
 | 
						|
uniform bool u_IsTerrain;
 | 
						|
 | 
						|
void main() {
 | 
						|
  vec3 finalColor;
 | 
						|
  vec3 norm = normalize(Normal);
 | 
						|
 | 
						|
  /* Define colours for different terrain types. */
 | 
						|
  if(u_IsTerrain) {
 | 
						|
    vec3 grassColor1 = vec3(0.4, 0.6, 0.2);
 | 
						|
    vec3 grassColor2 = vec3(0.3, 0.5, 0.15);
 | 
						|
    vec3 rockColor = vec3(0.5, 0.5, 0.4);
 | 
						|
    vec3 steepColor = vec3(0.35, 0.3, 0.25);
 | 
						|
 | 
						|
    /* Create patchy grass colur using the detail noise. */
 | 
						|
    float detailFactor = smoothstep(-0.2, 0.2, Detail);
 | 
						|
    vec3 finalGrassColor = mix(grassColor1, grassColor2, detailFactor);
 | 
						|
 | 
						|
    /* Blend from grass to rock between height of 2.0 and 4.0. */
 | 
						|
    float heightFactor = smoothstep(2.0, 4.0, WorldPos.y);
 | 
						|
    finalColor = mix(finalGrassColor, rockColor, heightFactor);
 | 
						|
 | 
						|
    /* Flat surface has a normal.y of 1.0. A steep slope is closer to 0. */
 | 
						|
    float slopeFactor = 1.0 - smoothstep(0.6, 0.8, norm.y);
 | 
						|
    finalColor = mix(finalColor, steepColor, slopeFactor);
 | 
						|
 | 
						|
  } else {
 | 
						|
    finalColor = objectColor;
 | 
						|
  }
 | 
						|
 | 
						|
  /* Standard lighting calculations. */
 | 
						|
  float ambientStrength = 0.4;
 | 
						|
  vec3 ambient = ambientStrength * lightColor;
 | 
						|
 | 
						|
  float diff = max(dot(norm, normalize(-lightDir)), 0.0);
 | 
						|
  vec3 diffuse = diff * lightColor;
 | 
						|
 | 
						|
  vec3 result = (ambient + diffuse) * finalColor;
 | 
						|
  FragColor = vec4(result, 1.0);
 | 
						|
}
 |