lucas-jones / three-lightmap-baker

132 stars 9 forks source link

🍞 Three Lightmap Baker

Basic example of lightmapping in ThreeJS

✨ Big Thanks for Three Mesh BVH, Three GPU Pathtracer & XAtlas-Three for been excellent libraries ✨

Live Demo

Todo

Examples

alt text alt text alt text

How it works

  1. Pass all the geomerty into XAtlas-Three (UV unwrapping library). This will generate a "UV2" attribute on the geometry.
  2. Render the geomerties vericies in the UV2 space. Create two textures (resolution being the lightmap resolution), using the gl_FragColor to encode world position and the normal. This is packing Vec3 data into a texture using the RGB channel.

alt text alt text Visual reference: Using these textures as the lightmap (using UV2).

  1. These two texture are effectivly a 2D array of World Position & Normals covering the entire geomerty.
  2. Itterate through each World Position & Normal. Cast rays at each position to calculate incoming light.

alt text Visual reference: Creating arrows for each world positon & the normal

alt text

  1. The Three Mesh BVH library helps improve the performance of raycasting, it also allows raycasting on the GPU (this is super fast).
  2. Using A LOT of copy & pasted code from Three GPU Pathtracer to generate light

Further Reading / Watching