While working on my thesis I added the treatment of caustics to my CUDA-application. A caustic results from light that undergoes specular reflexion/transmission at a curved surface. Scattered light rays travel in different directions and create interesting patterns at nearby surfaces.
To handle caustics, I added another photon map for photons that were scattered using specular reflection or specular transmission only. This is the caustics photon map. The other photon map, the global photon map, stores all other photons that hit a nonspecular surface (surface that can scatter light in a nonspecular way). On the one hand these are the direct photons which hit some surface right after emission from a light source. On the other hand these are indirect photons that underwent nonspecular scattering at least once.
I used Blender to construct some simple test scene for my implementation. It contains an orange, reflective sphere and a green, transmissive sphere with refraction index of 1.7. The smooth shadows are the result of an area light source. Bump-mapping is used to improve the quality of the brick walls.
Light is transmitted using the law of refraction. This leads to the focussed light below the green sphere (caustic). Approximately 100,000 photons were stored in the caustics photon map as well as in the global photon map. Both photon maps are visualized in the following images.
It should be noted that I did not apply any acceleration techniques (e.g. adaptive selection of final gather points) to speed up the calculations.