Deep Compositing Extended

OpenDCX 2.2.2 documentation


OpenDCX - What It Is

OpenDCX is an open-source C++ library comprising extensions for the OpenEXR library and its deep file format. It adds support for per deep-sample metadata adding subpixel-masks and surface-type flags, and provides utility functions to manipulate deep pixels with this metadata. It is developed and maintained by DreamWorks Animation for use in rendering and compositing applications typically encountered in feature film production.

DreamWorks Animation’s subpixel-mask deep compositing provides anti-aliasing of deep images while keeping memory and disk sizes in reasonable check, and received favorable feedback when presented at DigiPro 2015.


OpenDCX is currently a hack of OpenEXR & Nuke!

OpenDCX extends the current OpenEXR 2.0 deep scheme and its support in production tools such as Nuke. The DCX scheme relies on supplimentary deep surface information being stored and handled within the limitations of the current OpenEXR file format and the applications reading and writing those files.

For example there is no support in OpenEXR for 64-bit unsigned-int channels so the 8x8 subpixel mask must be split into two 32-bit float channels. Those channels must be floating point rather than integers to avoid applications like Nuke automatically converting the integers into floats and destroying the spmask bit pattern.

Ideally this per-sample surface metadata information would become a supported data type in the OpenEXR deep scheme allowing applications to formally support it.


The OpenDCX channel names and definitions have changed for release 2.2.2, for several reasons:

  • Nuke 10+ does not allow channel names which begin with a number so the spmask.1 and spmask.2 channel names will not translate properly, potentially causing problems with the OpenDCX nuke plugins.
  • It was discovered that placing all the channels in the same named layer spmask caused channel reordering problems depending on the load order of Nuke nodes. To solve these problems the spmask and flags channels have been separated into individual named layers.
  • The addition of the partial subpixel-coverage bits to the flags channel required it to be expanded from 16-bit half to 32-bit float.

Here are the channel definitions as of OpenDCX 2.2.2 (see DcxChannelDefs.h):

deepabuf.sp1    32-bit float (A-buffer bottom bits 0-31)
deepabuf.sp2    32-bit float (A-buffer top bits 32-63)
deepmeta.flags  32-bit float (flag bits & partial-spcoverage bits)

OpenDCX - What It Isn’t

A complete toolkit and system for production use. (yet)

The example Nuke plugins and example commands in the lib are exactly that - examples. While the Nuke plugins are mostly functional they have not yet been battle-proven in production at DreamWorks due to the lag between development and production cycles. We are currently (as of spring 2017) still using an internal set of libraries and plugins in our production code that implement the OpenDCX scheme.

With that caveat in mind, DreamWorks will transition to using the public OpenDCX library in production this year (2017) and we expect to add additional production-proven plugins and code to the library as time goes on.

Incomplete list of missing production components in public OpenDCX:
  • Pixel filtering support during flattening
  • Robust ray-trace sample combiner with partial subpixel-coverage filtering
  • Nuke exrReaderDeep & exrWriterDeep plugins with DCX channel management and ImageFormat support
  • Nuke DeepReformat plugin with filtering support
  • Nuke deep color correctors that avoid changing the pixel weights
  • Nuke deep defocus with hidden sample and cutout support
  • Standalone image reformat command leveraging the ImageFormat metadata

Developer and user forum

This forum is currently set as a private group so please request inclusion on the web page.

The more the merrier, except for the bots...

And Thanks

To the OpenColorIO project developers for their documentation template which we shamelessly ripped off and adapted for OpenDCX. :)