Our group implemented the volume visualization tecnique described in the paper "Interactive Dynamic Volume Illumination with Refraction and Caustics" by Jens G. Magnus and Stefan Bruckner (2018).
We implemented the algorithm described in the paper using C++20 and the Vulkan API, with external utility libraries like AutoVK, GLFW, glm and Dear ImGui.
In summary we render the volume by dividing it into a set of slices, with each slice representing a 2D cross section of the volume data, then for each slice we do a backward integration step to compute light directions and intensities and a forward integration step to compute view ray directions.
To store intermediate results we use two sets of 6 buffers and on each iteration we select one set as input and the other as output and swap them at the end of each iteration in a ping-pong fashing. The buffers are as follows:
lb): containing the radiance arriving at the voxelldb): containing the direction to the light (at the viewer position)cb): used to store the accumulated color and opacity along the view raysmb): containing the accumulated medium colorvpb)vdb)<-- TODO -->