fragmentShader_old top-level property

String fragmentShader_old
final

Implementation

final String fragmentShader_old = '''
  // Terrain generation parameters
  uniform int type;
  uniform float radius;
  uniform float amplitude;
  uniform float sharpness;
  uniform float offset;
  uniform float period;
  uniform float persistence;
  uniform float lacunarity;
  uniform int octaves;

  // Layer colors
  uniform vec3 color1;
  uniform vec3 color2;
  uniform vec3 color3;
  uniform vec3 color4;
  uniform vec3 color5;

  // Transition points for each layer
  uniform float transition2;
  uniform float transition3;
  uniform float transition4;
  uniform float transition5;

  // Amount of blending between each layer
  uniform float blend12;
  uniform float blend23;
  uniform float blend34;
  uniform float blend45;

  // Bump mapping parameters
  uniform float bumpStrength;
  uniform float bumpOffset;

  // Lighting parameters
  uniform float ambientIntensity;
  uniform float diffuseIntensity;
  uniform float specularIntensity;
  uniform float shininess;
  uniform vec3 lightDirection;
  uniform vec3 lightColor;

  varying vec3 fragPosition;
  varying vec3 fragNormal;
  varying vec3 fragTangent;
  varying vec3 fragBitangent;

  void main() {
    // Calculate terrain height
    float h = terrainHeight(
      type,
      fragPosition,
      amplitude,
      sharpness,
      offset,
      period,
      persistence,
      lacunarity,
      octaves);

    vec3 dx = bumpOffset * fragTangent;
    float h_dx = terrainHeight(
      type,
      fragPosition + dx,
      amplitude,
      sharpness,
      offset,
      period,
      persistence,
      lacunarity,
      octaves);

    vec3 dy = bumpOffset * fragBitangent;
    float h_dy = terrainHeight(
      type,
      fragPosition + dy,
      amplitude,
      sharpness,
      offset,
      period,
      persistence,
      lacunarity,
      octaves);

    vec3 pos = fragPosition * (radius + h);
    vec3 pos_dx = (fragPosition + dx) * (radius + h_dx);
    vec3 pos_dy = (fragPosition + dy) * (radius + h_dy);

    // Recalculate surface normal post-bump mapping
    vec3 bumpNormal = normalize(cross(pos_dx - pos, pos_dy - pos));
    // Mix original normal and bumped normal to control bump strength
    vec3 N = normalize(mix(fragNormal, bumpNormal, bumpStrength));

    // Normalized light direction (points in direction that light travels)
    vec3 L = normalize(-lightDirection);
    // View vector from camera to fragment
    vec3 V = normalize(cameraPosition - pos);
    // Reflected light vector
    vec3 R = normalize(reflect(L, N));

    float diffuse = diffuseIntensity * max(0.0, dot(N, -L));

    // https://ogldev.org/www/tutorial19/tutorial19.html
    float specularFalloff = clamp((transition3 - h) / transition3, 0.0, 1.0);
    float specular = max(0.0, specularFalloff * specularIntensity * pow(dot(V, R), shininess));

    float light = ambientIntensity + diffuse + specular;

    // Blender colors layer by layer
    vec3 color12 = mix(
      color1,
      color2,
      smoothstep(transition2 - blend12, transition2 + blend12, h));

    vec3 color123 = mix(
      color12,
      color3,
      smoothstep(transition3 - blend23, transition3 + blend23, h));

    vec3 color1234 = mix(
      color123,
      color4,
      smoothstep(transition4 - blend34, transition4 + blend34, h));

    vec3 finalColor = mix(
      color1234,
      color5,
      smoothstep(transition5 - blend45, transition5 + blend45, h));

    gl_FragColor = vec4(light * finalColor * lightColor, 1.0);
  }
''';