Volumetric Obscurance - Bradford Loos, Peter-Pike Sloan. I3D 2010
This paper presents two techniques, a simple line sampling technique and a more involved area sampling technique.
Line integral technique – Depth values are sampled in a uniform disc around each screen-space pixel. This disc has a radius that is constant in object space. For each sample, a line integral of the occupancy for that sample is computed. In plain speak, this is the ratio of stuff to non-stuff between the view-ray intersection of the unit sphere around the pixel and the aforementioned disc (see illustration). Therefore depth is considered analytically in the calculation of AO and as a result the computed AO should be less noisy during camera movement. The authors also posit that suitable results can be achieved with less samples because the samples are generated in screen-space vs. in object space, where object space sampling can result in multiple samples being close to each other in screen-space (which is where depth is ultimately sampled). This results in a more accurate consideration of nearby occluding surfaces.
Area integral technique- Very similar in spirit to Angelo Pesce’s “Variance Methods for Screen-Space Ambient Occlusion” in ShaderX7. A mip-map of depth average and variance is computed for the depth buffer. This
statistical information is then used to compute an AO value without undersampling artifacts. The authors state that only one sample can be considered before the performance becomes prohibitive. I’m probably misunderstanding their technique because it seems to me that most of the overhead is in generating the hierarchical statistical information about the depth buffer. In the case of one sample, you figure out the screen-space area of your sampling disc and sample the mip-map level in which a texel covers about the same amount of screen-space. If you decide to use five samples instead of one, each sample would represent about 1/5th the amount of screen-space as a single sample, so you would in turn sample the mip-map at the level in which a texel is about 1/5th the screen-space area of the sampling disc.I’ll have to reread this section later.
The authors also present a thickness model that is supposed to treat surfaces in the depth buffer as if they aren’t part of a relief image, i.e. each surface has a certain thickness, so nearby pixels shouldn’t be occluded by them if they are a certain z-distance away. I’m pretty sure that just about every SSAO technique already does this. It’s usually covered by a world-space distance falloff or depth thresholding.
The paper also discusses computing AO at different frequencies and combining them, which I believe is what is done in the article “Multi-layered, Dual Resolution Ambient Occlusion” by the guys at NVIDIA.
Volumetric Ambient Occlusion – László Szirmay-Kalos, Tamás Umenhoffer, Balázs Tóth, László Szécsi, and Mateu Sbert. IEEE Computer Graphics and Applications. 2009.
Though this paper is a little dense, it boils down to a few simple ideas. The most important is a method for generating occlusion test samples that are above the tangent plane, without actually having to do tangent plane calculations (ala Horizon-Based Ambient Occlusion). This is done by sampling within a sphere of radius R/2, with its center R/2 units away from the shaded point along the normal. This is the largest sphere above the tangent plane and also contained within the original sampling sphere (of radius R). Occlusion is calculated via an integral similar to that used in the Volumetric Obscurance paper discussed above.
Ambient Occlusion Volumes – Morgan McGuire. Technical Report. 2009.
This tech report is a much more fully developed implementation of the ideas I discussed in the article “Deferred Occlusion by Analytic Surfaces” in ShaderX7. The occlusion due to a triangle is computed analytically and splatted onto the scene in a deferred manner. The same equation was used for computing form-factors in Baum’s 1989 radiosity paper and was previously used for AO by Hoberock and Jia in the GPU Gems 3 article “High-Quality Ambient Occlusion”. A 3D bounding volume of the influence of each primitive is generated via the Geometry Shader to compute the occlusion value to be splatted. The reported framerates are surprisingly good, though I believe it is mentioned that AO is computed at a drastically reduced resolution. At least I think that is what is being referred to by “15×15 subsampling”. There is probably a lot of room for performance improvements to this algorithm. The author states that all AO Volumes are precomputed (dynamically outputting geometry from the GS adds 25% more render time). I don’t think is an unreasonable assumption.. most scene geometry in games is static. But considering that all bounding geometry is essentially a cube, an instanced stream of cubes could be rendered, where each cube fetches the primitive’s vertices it is bounding and computes its own vertex positions in the vertex shader. This would eliminate the use of the GS. Also, doing an early out in the pixel shader based on depth would help with fill in situations where the volume is covering parts of the screen that are in the distance and couldn’t possibly be occluded.
Hybrid Ambient Occlusion – Christoph K. Reinbothe, Tamy Boubekeur and Marc Alexa. Eurographics 2009.
Computes ambient occlusion by raycasting a voxelized representation of the scene per-pixel and filtering the results. This uses everyone’s (especially mine) favorite scene voxelization technique. Didn’t read this one too in-depth, but it seems to be worth a closer look.