86 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//-*****************************************************************************
 | 
						|
 | 
						|
Pixar's Dtex to Exr conversion utility
 | 
						|
Aug 1, 2012 - first checkin to OpenEXR 2.0 branch of OpenEXR git repository.
 | 
						|
 | 
						|
This utility converts a DTEX deep shadow file to an OpenEXR 2.0 deep exr file,
 | 
						|
formerly, ".odz" (or .dexr, or whatever extension your facility may use). As of
 | 
						|
the first checkin, the utility only supports 1, 3, or 4-channel dtex files,
 | 
						|
corresponding to deep alpha or deep RGBA only.  The Nuke DTEX reader, which
 | 
						|
uses basically the same code, will support a more complete arbitrary channel
 | 
						|
set, and this utility may be upgraded as well. We also only support a single
 | 
						|
view for the time being.
 | 
						|
 | 
						|
DTEX has a complicated set of interpretations, which represent six separate
 | 
						|
code paths for conversion to the deep representation in OpenEXR 2.0. They
 | 
						|
represent the permutations of these exemplary Display Driver config strings
 | 
						|
to prman:
 | 
						|
 | 
						|
Display "+filename.dtex" "deepshad" "deepopacity" "string volumeinterpretation" "continuous"
 | 
						|
Display "+filename.dtex" "deepshad" "deepopacity" "string volumeinterpretation" "discrete"
 | 
						|
Display "+filename.dtex" "deepshad" "a" "string volumeinterpretation" "continuous"
 | 
						|
Display "+filename.dtex" "deepshad" "a" "string volumeinterpretation" "discrete"
 | 
						|
Display "+filename.dtex" "deepshad" "rgba" "string volumeinterpretation" "continuous"
 | 
						|
Display "+filename.dtex" "deepshad" "rgba" "string volumeinterpretation" "discrete"
 | 
						|
 | 
						|
In our terminology, these six options are called:
 | 
						|
 | 
						|
OneChanDeepOpacityContinuous
 | 
						|
OneChanDeepOpacityDiscrete
 | 
						|
OneChanDeepAlphaContinuous
 | 
						|
OneChanDeepAlphaDiscrete
 | 
						|
FourChanDeepRgbaContinuous
 | 
						|
FourChanDeepRgbaDiscrete
 | 
						|
 | 
						|
Renderman will write out both 1-channel and 3-channel opacity in the 
 | 
						|
"deepopacity" case, which we currently only use the first channel of, as
 | 
						|
we are only targeting a single opacity curve in space. This may evolve in
 | 
						|
the future.
 | 
						|
 | 
						|
There are weird gotchas for each of these 6 cases, and they are documented
 | 
						|
in the PxDeepUtils.h file, along with specific comments in each of the six
 | 
						|
header files that correspond to each case:
 | 
						|
 | 
						|
PxOneChanDeepOpacityContinuous.h
 | 
						|
PxOneChanDeepOpacityDiscrete.h
 | 
						|
PxOneChanDeepAlphaContinuous.h
 | 
						|
PxOneChanDeepAlphaDiscrete.h
 | 
						|
PxFourChanDeepRgbaContinuous.h
 | 
						|
PxFourChanDeepRgbaDiscrete.h
 | 
						|
 | 
						|
The gotchas relate to several issues, mostly to do with coincident or
 | 
						|
out-of-order samples, precision issues, compression artifacts, and the
 | 
						|
differences between the "deepopacity" vs "deepalpha" interpretations.
 | 
						|
 | 
						|
With "deepopacity" (the pre-prman 16 usage), opacity values stored in
 | 
						|
dtex files were accumulated, so they were bounded between 0 and 1. The
 | 
						|
values stored are actually not opacities, but rather transmissivities
 | 
						|
(1-opacity), and monotonically decreased from fully transparent (1)
 | 
						|
to fully opaque (0). This representation is ideal for meaningful error 
 | 
						|
minimization during  compression, and also for usage as a shadow map 
 | 
						|
by a renderer, because the extinction at a particular depth, at a 
 | 
						|
particular pixel, can be evaluated with a single look-up. However, 
 | 
						|
this representation is poor for deep compositing, because each of the 
 | 
						|
samples includes data from smaller depth samples, and recombination is 
 | 
						|
difficult. With these types of files, when using volumetric (continuous) 
 | 
						|
interpretation, the samples represent the accumulated transmissivity at 
 | 
						|
the NEAR SIDE of a depth span, and our code paths take this into account.
 | 
						|
 | 
						|
With all other usages - "a" and "rgba", the values represent filtered
 | 
						|
samples of the given field at that point in space. The alpha values
 | 
						|
will be between 0 and 1, but are not guaranteed to be increasing or
 | 
						|
decreasing. This presents a strange problem for volumetric interpretation,
 | 
						|
as what does it mean to describe the alpha of an infintesimally small
 | 
						|
region of space (point sample). The best interpretation of the data
 | 
						|
in this case uses the alpha to represent the accumulated opacity of 
 | 
						|
the region of space nearer than the sample, and thus each sample
 | 
						|
represents the FAR SIDE of a depth span. Our code paths take this into
 | 
						|
account as well.
 | 
						|
 | 
						|
Please see the files for additional comments, and the command
 | 
						|
"dtexToExr" may be run with -h, --h, --help, or no arguments to 
 | 
						|
print its usage.
 | 
						|
 | 
						|
-Christopher Horvath, Aug 2012, Pixar
 | 
						|
 |