I have looked further into various other volume rendering techniques:
Splatting
Object-order technique. Every voxel is projected onto the image plane. Each one is then rendered, in back to front order, to produce the final image.
Each voxel’s contribution to the image is based on a gaussian (or sometimes linear) distribution, based on the voxel’s colour and opacity. The size of the splat should be large enough that gaps do not appear between neighbouring voxels, and small enough to avoid excessive overlapping which leads to blurring. The size can also be altered per voxel in the case of a perspective projection.
- Fast rendering technique, but generally results in a lower-quality image
- Every voxel is taken into account in the final image, compared to ray tracing which may miss details if the rays are far apart or the step it too large.
Shear Warp
The view matrix is created using a shear, so axis-aligned voxel slices remain aligned with the image plane. To achieve perspective, the slices can also be scaled.
These slices are then efficiently rendered. Run length encoding is used to easily skip areas of transparent voxels. The RLE is calculated in a preprocess step. The preprocessing is done for the volume in the 3 principle axes, so the data does not need to be transposed at runtime.
Finally this image is warped to counteract the shearing effect. The resulting image is as if rendered from the originally desired viewpoint.
- Very fast because of the optimisations.
- Shearing / warping can reduce the image quality, especially at an angle of 45 degrees which is the worst case (requires the most extreme warp).
- There is no loss of small details due to undersampling
- More memory usage due to the need to store the volume data multiple times
- 3D Volume is only traversed once
- If the opacity threshold/table is changed, the RLE must be recalculated. Alternatively an alternate version of the algorithm can be used.
Marching Cubes
8 samples are taken around a location in the volume (equivalent to the 8 vertices in a cube). Each sample is determined to be either inside or outside the volume (the sample value is less than or greater than the threshold value).
The 8 binary values are used to lookup one of 256 (28) configurations of polygons, which describe the mesh surface within the sampled cube. Vertices that lie on the edge of the cube can be weighted between that edge’s vertices based on the two sample values. These polygons are then inserted into the mesh.
The algorithm continues across the entire volume to produce the complete mesh. The size of the sample cube can be altered to achieve a higher resolution mesh.
- If the sample size is too large, the algorithm can produce false positives (bridging a gap between two surfaces that are not connected) or false negatives (creating a gap between two connected surfaces, or missing a small surface entirely).
Marching Tetrahedrons
This is similar to the Marching Cubes algorithm. It was originally developed in order to circumvent a patent on Marching Cubes which was in effect at the time. The theory is essentially the same, but using tetrahedrons instead of cubes. This results in a higher number of sample points and therefore a more detailed mesh. This is at the cost of a longer processing time and higher memory usage.
Main sources:
Splatting:
http://www.ifi.uzh.ch/vmml/files/Seminar/Huebner_Handouts.pdf
Marching Cubes:
http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/
I also read:
Frequency Domain Volume Rendering
Takashi Totsuka and Marc Levoy, Proc. SIGGRAPH '93, Anaheim, California, August, 1993, pp. 271-278.
http://www-graphics.stanford.edu/papers/fvr/
My understanding of the technique, involving Fourier transforms, is currently very limited however.
I have prepared some notes and a handout for the Friday presentation. I intend to give an overview of Ray Casting, Splatting, Shear Warp, and Marching Cubes. I will then state which algorithm I have chosen to implement first:
The first technique will be ray tracing, because:
- It produces high quality images so it is a useful technique.
- It is one of the slower techniques so speeding it up is desired (either for faster rendering or to render a better quality image in the same time).
- It appears to be fairly easy to implement, so I will have more time to work on the rendering program at the same time as the technique.
- It should also be quite straightforward to parallelize, which is currently desirable as I still need to learn the syntax and methods for parallel processing.
I have not currently decided which technique to implement second, I think that will be better decided in a few weeks once I have a greater understanding from implementing ray tracing. The second technique will be a more in-depth one that is less directly parallelizable, possibly Shear Warp, Marching Cubes or another technique found through further research.
Currently I don't have any problems to address in the next meeting, I am quite happy to begin work on the programming next week.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment