Developers have tried to render refraction since they started to render reflections because these processes take place together in any semi-transparent surface. There are several techniques for rendering reflections but not many for refraction.
Existing methods for implementing refraction at runtime differ depending on the specific type of refraction. Most of the techniques render the scene behind the refractive object to a texture at runtime, and then apply a texture distortion in a second pass to achieve the refracted appearance. Depending on the texture distortion, you can use this approach to render refraction effects such as water, heat haze, glass, and other effects.
Some of these techniques can achieve good results, but the texture distortion is not physically based so the results are not always correct. For example, if you render a texture from the point of view of the refraction camera, there might be areas that are not directly visible to the camera but are visible in a physically based refraction.
The main limitation of using render-to-texture methods is quality. When the camera is moving, pixel shimmering or pixel instability is often visible.