summaryrefslogtreecommitdiff
path: root/docs/configurations/allocation_vars.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/configurations/allocation_vars.rst')
-rw-r--r--docs/configurations/allocation_vars.rst119
1 files changed, 119 insertions, 0 deletions
diff --git a/docs/configurations/allocation_vars.rst b/docs/configurations/allocation_vars.rst
new file mode 100644
index 0000000..9cb2a05
--- /dev/null
+++ b/docs/configurations/allocation_vars.rst
@@ -0,0 +1,119 @@
+.. _allocationvars:
+
+How to Configure ColorSpace Allocation
+======================================
+
+The allocation / allocation vars are utilized using during GPU 3dlut / shader
+text generation. (Processor::getGpuShaderText, Processor::getGpuLut3D).
+
+If, in the course of GPU processing, a 3D lut is required, the "allocation /
+allocation vars" direct how OCIO should sample the colorspace, with the intent
+being to maintain maximum fidelity and minimize clamping.
+
+Currently support allocations / variables:
+
+ALLOCATION_UNIFORM::
+ 2 vars: [min, max]
+
+ALLOCATION_LG2::
+ 2 vars: [lg2min, lg2max]
+ 3 vars: [lg2min, lg2max, linear_offset]
+
+So say you have an srgb image (such as an 8-bit tif), where you know the data
+ranges between 0.0 - 1.0 (after converting to float). If you wanted to apply
+a 3d lut to this data, there is no danger in samplingthat space uniformly and
+clamping data outside (0,1). So for this colorspace we would tag it:
+
+.. code-block:: yaml
+
+ allocation: uniform
+ allocationvars: [0.0, 1.0]
+
+These are the defaults, so the tagging could also be skipped.
+
+But what if you were actually first processing the data, where occasionally
+small undershoot and overshoot values were encountered? If you wanted OCIO to
+preserve this overshoot / undershoot pixel information, you would do so by
+modifying the allocation vars.
+
+.. code-block:: yaml
+
+ allocation: uniform
+ allocationvars: [-0.125, 1.125]
+
+This would mean that any image data originally within [-0.125, 1.125] will be
+preserved during GPU processing. (Protip: Data outside this range *may*
+actually be preserved in some circumstances - such as if a 3d lut is not needed
+- but it's not required to be preserved).
+
+So why not leave this at huge values (such as [-1000.0, 1000.0]) all the time?
+Well, there's a cost to supporting this larger dynamic range, and that cost is
+reduced precision within the 3D luts sample space. So in general you're best
+served by using sensible allocations (the smallest you can get away with, but
+no smaller).
+
+Now in the case of high-dynamic range color spaces (such as float linear), a
+uniform sampling is not sufficient because the max value we need to preserve is
+so high.
+
+Say you were using a 32x32x32 3d lookup table (a common size). Middle gray is
+at 0.18, and specular values are very much above that. Say the max value we
+wanted to preserve in our coding space is 256.0, each 3d lut lattice coordinates
+would represent 8.0 units of linear light! That means the vast majority of the
+perceptually significant portions of the space wouldnt be sampled at all!
+
+unform allocation from 0-256\:
+0
+8.0
+16.0
+...
+240.0
+256.0
+
+So another allocation is defined, lg2
+
+.. code-block:: yaml
+
+ - !<ColorSpace>
+ name: linear
+ description: |
+ Scene-linear, high dynamic range. Used for rendering and compositing.
+ allocation: lg2
+ allocationvars: [-8, 8]
+
+In this case, we're saying that the appropriate ways to sample the 3d lut are
+logarithmically, from 2^-8 stops to 2^8 stops.
+
+Sample locations:
+2^-8\: 0.0039
+2^-7\: 0.0078
+2^-6\: 0.0156
+...
+2^0\: 1.0
+...
+2^6\: 64.0
+2^7\: 128.0
+2^8\: 256.0
+
+Which gives us a much better perceptual sampling of the space.
+
+The one downside of this approach is that it can't represent 0.0,
+which is why we optionally allow a 3d allocation var, a black point
+offset. If you need to preserve 0.0 values, and you have a high
+dynamic range space, you can specify a small offset.
+
+Example:
+
+.. code-block:: yaml
+
+ allocation: lg2
+ allocationvars: [-8, 8, 0.00390625]
+
+The [-15.0, 6.0] values in spi-vfx come from the fact that all of the
+linearizations provided in that profile span the region from 2^-15
+stops, to 2^6 stops. One could probably change that black point to a
+higher number (such as -8), but if you raised it too much you would
+start seeing black values be clipped. Conversely, on the high end
+one could raise it a bit but if you raised it too far the precision
+would suffer around gray, and if you lowered it further you'd start to
+see highlight clipping.