I know how to do a heat distortion effect in compositing.

What I am looking for is a way to do the same effect with a material set up in cycles.

What would be the best way to create a procedural material that can be placed in front of any object and make it look like heat is rising in front of it (without compositing)?

Any ideas would be greatly appreciated.

  • 1
    $\begingroup$ I've never done it before but I remembered a tutorial from Andrew Price. It's from 2010, so it might be a little outdated in terms of Blender's UI but it still covers the nuts and bolts. blenderguru.com/tutorials/how-to-create-heat-distortion $\endgroup$ Aug 2, 2016 at 22:18
  • $\begingroup$ Hi icYou. This is an interesting question and it's definitely possible as a material. The trick is to add a plane between the objects and the camera and to either vary the IOR or the Normal based on a noise texture. This answer blender.stackexchange.com/a/19298/29586 does get most of the way there but it doesn't allow for changing angles between the camera, object, and plane. I think I've got a solution using the Incoming geometry node output into the Refraction shader normal (so the rays are always treated as perpendicular) with variation based on a noise texture. $\endgroup$ Oct 14, 2016 at 23:00

1 Answer 1


While it's not possible to vary the refraction throughout an object using volumetrics we can mimic the effect by varying the refraction at points on a surface and view the scene through that surface.

The Refraction shader affects the ray at the point of hitting the surface. If the ray hits the front of the surface then it is treated as a transition from air (IOR = 1.0) into the material, while if it hits the back of a surface then it is calculated as exiting the material back into air. Normally the ray would travel through the mesh, entering through one surface (bending one way) and exiting through another (bending the other way), resulting in the material acting like a prism. However, if we use a plane rather than a manifold mesh then only one side of the refraction effect takes place and we can use this to redirect the ray - as if it had passed through a lower density patch of air.

Refraction is dependent on the angle the ray hits the surface - with zero refraction if it's incident along the Normal and increasing refraction as the angle with the normal increases. We can use the 'Incident' Light Path property to determine the angle of the incoming ray and use this to manipulate the Normal of the surface to get the desired bending of the ray.

To achieve the effect, create a plane and add a new material to it. Open the node editor, remove the default Diffuse shader and replace it with a Refraction shader. Add a Geometry node and link the Incoming node with the Refraction shader Normal. This will mean that the Normal at any point in the shader will always be the same angle as the incident ray and will result in the surface behaving simply as if it were a Transparent shader (as all rays will hit it along the Normal and so no refraction will take place).

Add a Bump node between the Geometry node and the Refraction Shader to affect the distortion and feed this with your heat map as a series of images. Placing the plane between the camera and your scene will now distort the view to simulate heat haze distortion.

distort nodes

Note the addition of a Transparent shader mixed in for Shadow rays to prevent the distortion plane from casting a shadow. Also, ensure the Refraction shader colour is set to pure white.

For the heat map you can either use a Blender smoke simulation saved to a sequence of images or generate simulated smoke using a procedural texture. I used the following crudely generated heat map. This was generated using a Musgrave texture (and some noise), warped so as to taper towards the top, and masked off at the sides. It was animated by simply keyframing the Z-coordinate for the vector of the texture nodes.

heat map

This produced the following result :

heat haze

See the attached blend files for details.

Heat Haze

Heat Map

  • $\begingroup$ WOW Rich! great job. That works perfect! much better than what I came up with. Thank you for going into so much detail about it. I will make sure I mark this as answered. $\endgroup$
    – icYou520
    Oct 16, 2016 at 16:29
  • $\begingroup$ You're very welcome - glad I could help. $\endgroup$ Oct 16, 2016 at 20:06

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .