Scalable Ambient Obscurance

in Proceedings of ACM SIGGRAPH / Eurographics High-Performance Graphics 2012 (HPG '12)

Morgan McGuire, NVIDIA and Williams College
Michael Mara, NVIDIA
David Luebke, NVIDIA

Paper (PDF preprint)
Demo + Source (117 MB)
Presentation (
Presentation (PDF)
Acknowledgments and Followup

Result Video

ACM Copyright Notice Copyright by the Association for Computing Machinery, Inc. Permission to make digital or hard copies of part or all of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for components of this work owned by others than ACM must be honored. Abstracting with credit is permitted. To copy otherwise, to republish, to post on servers, or to redistribute to lists, requires prior specific permission and/or a fee. Request permissions from Publications Dept, ACM Inc., fax +1 (212) 869-0481, or The definitive version of this paper can be found at ACM's Digital Library


This paper presents a set of architecture-aware performance and integration improvements for a recent screen-space ambient obscurance algorithm. These improvements collectively produce a 7x performance increase at 2560x1600, generalize the algorithm to both forward and deferred renderers, and eliminate the radius- and scene-dependence of the previous algorithm to provide a hard real-time guarantee of fixed execution time. The optimizations build on three strategies: pre-filter the depth buffer to maximize memory hierarchy efficiency; reduce total bandwidth by carefully reconstructing positions and normals at high precision from a depth buffer; and exploit low-level intra- and inter-thread techniques for parallel, floating-point architectures.


Result Video



  author = {Morgan McGuire and Michael Mara and David Luebke},
  title = {Scalable Ambient Obscurance},
  month = {June},
  year = {2012},
  booktitle = {High-Performance Graphics 2012},
  location = {Paris, France},
  url = {}