reflection probes in 1.80

2025-04-22

Did you know reflection probes?

Cubemap. Environment map. Reflection probe. Reflection capture. They go by many names, but they are all essentially just a fancy way of saying "a full 360 degree panoramic image". Although that's not quite accurate. 360 degree panoramic images are usually equirectangular projections of a sphere to a 2D image, whereas cubemaps are simply 6 images of the scene taken in 6 different directions, that can map to faces of a cube. To view the "panorama" you must then simply exist within the cube and gaze at it (ideally from the very center).

A video rendered in Blender 1.80 showing a reflective sphere moving over a cube, and then the cube itself moving. The moving cube also moves in the reflection.

Blender started out as a scanline renderer, with no type of raytracing. This was intentional as raytracers were known to be slow on the computers of the time, and Blender was made for quick day to day animation studio work. You can read about it in the Blender 1.5 manual!. Anyways, since scanline renderers scan lines instead of tracing rays, they can't do real reflections. But you don't need real reflections to make something look reflective!

Reflections must be one of the most faked effects in computer graphics, as doing it the *proper* way would involve actually reflecting all camera rays hitting the reflective surface, or rendering the entire scene again from the perspective of a mirror. For realtime graphics (games) you can get away with environment mapping for faking reflections on a lot of objects.

This environment map trick can be stretched to work for planar reflections too, like a water surface. You just need to make sure that the environment map is being captured from the "reflected" position of the camera, i.e. below the surface of the water. (And then you need to make sure that only objects above the water should appear in the environment map).

In the video below, the capture point for the environment map (the EnvMap empty) starts out in the middle of the scene, and is moved into the correct position. Notice how the reflections appear more correct after it's been put into place.

A test scene with moving objects and a wavy water surface. The water has environment map reflections and the capture point for the environment map is moved to the point below the water surface relative to the camera.

One problem with using environment maps for planar reflections like water is that only the top face of the cubemap is actually useful. This leads to a lot of wasted rendering if you use an environment map that is recalculated every frame, which is necessary if you want moving objects to reflect on things. And this waste is worsened if you want crisp reflections! In Blender 1.80 the max resolution per cube face of environment maps is 1000 pixels, and even with the maximum the reflections are noticeably low quality.

high resolution environment map reflections

But yeah! reflections!! sorta!!!

I'm slowly getting back to my plans of making an animation in 1.80 on the late 90s PC, and that's why I've been researching the various effects I need for the scene. Puno themselves are made of dark reflective latex, so they will be using an environment map that captures from the location they are in, and it will update each frame as they walk through the scene.

The water reflection question came up because I wanted to include a river in the scene, which should reflect the buildings of a city at the very least. I probably won't use too many animated envmaps as then the render time would just explode. But I got a working prototype down for the water (and height based terrain shading too), shown here with a static environment map.

A test scene with moving water reflecting a static environment map.