Computer Graphics

Assignment 9 – Perlin Noise

Martin Heistermann and Valentin Wyss
Computer Graphics Group

Task 1: 1D Perlin Noise

  • Implement Perlin noise in fragment shader function
  • float perlin_noise_1d(float x);
  • Useful: floor to find grid point
  • Implement fractional brownian motion (fBm)
  • float perlin_fbm_1d(float x);
images/practical_10/perlin_1d_plots.png

Task 2: 2D Perlin Noise

images/practical_10/perlin_noise.jpg
Perlin noise
images/practical_10/fbm.jpg
fBm
images/practical_10/turbulence.jpg
turbulence
  • float perlin_noise(vec2 point);
  • float perlin_fbm(vec2 point);
  • float turbulence(vec2 point);

These images are zoomed, don’t expect the exact same output!

Task 3: Textures using Perlin noise

images/practical_10/tex_map.jpg
Map
images/practical_10/tex_marble.jpg
Marble
images/practical_10/tex_wood.jpg
Wood

Per-fragment:

  • Compute scalar from noise function expression
  • Map to color (mix() for interpolation)
  • Just for fun: try using uniform float t

Task 4: Terrain generation: Geometry

std::shared_ptr<Mesh> build_terrain_mesh(Array2D<float> const& height_map) {
    std::pair<size_t, size_t> const grid_size = height_map.size();
    std::vector<vec3> vertices(grid_size.first * grid_size.second);
    std::vector<Mesh::Face> faces;
    // [...]
    return std::make_shared<Mesh>(vertices, faces);
}
  • Noise-based height map rendered into Array2D (utils/array2d.h)
  • Position vertices on and above \([-0.5, 0.5]^2\) plane
  • Tesselate with triangles
images/practical_10/plane_mesh_face.svg

Task 4: Terrain generation: Shading

  • Compute normals
  • Compute normal matrix
  • Compute materials based on height: color & shininess
images/practical_10/terrain_example.jpg

Questions?