About Color Correction Nodes |
In general, Shake has three classes of color correctors, all of which are under the Color tab:
Atomic-level correctors. Each of these (Add, Brightness, Clamp, Lookup, etc.) does one basic mathematical function to your color, such as add, multiply, gamma, and basic lookup curve functions. Usually, these concatenate together to give you speed and accuracy, and are fast ways to manipulate your data for a wide variety of purposes. A graph that represents their behavior appears on the icons to help you understand the difference between a Clamp, a Compress and an Expand node.
Consolidated correctors. Ron suggested calling these Uber-correctors. Hmmm. Anyway, the name doesn't matter, and we don't have to decide right now, do we? These correctors (ColorCorrect, ColorMatch, ColorReplace, HueCurves) are your primary tools when you try to do things like match skin tones, shadow levels, spill suppression, etc. The atomic-level correctors can also be found in these, but are wrapped in with many other tools to provide more control.
Utility correctors. These tools are to prepare your data for other functions. Typically, these functions are ColorSpace, ColorX, Lookup, MDiv, MMult, Reorder, Set, SetAlpha, SetBGColor and VideoSafe. There is a also certain degree of programmability in ColorX and the Lookup functions, giving you the ability to enter expressions on your image.
These are general guidelines to help you understand why there are so many nodes in the Color tab. If you do an Add operation with an Add node or with ColorCorrect, you should have no difference in the result, except that Add is a bit easier to wade through, and concatenates with many other operators.
Here is a basic list of the nodes and how they are useful:
Function | Explanation |
Add
|
Raise or lower colors evenly. This is the only legal color correction in log space. |
AdjustHSV | Shifts the entire Hue, Saturation or Value range. |
Brightness | Multiplies the RGB channels by a single value. |
Clamp | Good for clamping off values that go above or below a desired level. |
ColorCorrect | A mondo-maximus titanic node of color-correctness. Does tons of things, and includes a premultiplied input flag. |
ColorMatch | Matches your lows, midtones and highlights to a second set of colors. |
ColorReplace | This is good to switch one color with another. It also makes a better Chromakeyer than the ChromaKey node. Go figure. |
ColorSpace | Swaps your image into a different color space. For example, RGB, HSV, CMY, etc. |
ColorX | You can do pixel-based mathematical expressions. |
Compress | Squeezes your ranges up and down, and is particularly useful for fog effects with a DepthKey mask. |
ContrastLum/RGB | Contrast. Use Lum to preserve your color levels. |
Expand | Another levels adjuster to lower or raise your low and high points. |
Fade | Opacity control. Same thing as using Mult with identical values in all 4 channels. |
Gamma | Uh, a gamma correction. |
HueCurves | A node to isolate and adjust an image based on its hue. Ideal for spill suppression. |
Invert | Makes black turn to white and vice versa. Works best on normalized images between 0 and 1. |
LogLin | Logarithmic color space conversion. |
Lookup/HLS/HSV | Lookup expressions or curve manipulation on your image. For non-pixel based lookups, it goes faster than ColorX. |
LookupFile | Pulls a lookup table from a file. |
MDiv/MMult | Used to unpremultiply and premultiply an image by its Alpha channel. |
Monochrome | Gives you weighted control over turning your image black and white. |
Mult | Multiplies your channels separately from each other. |
Reorder | Swaps channels around within an image. See also Layer - Copy and Layer - SwitchMatte to grab channels from other images. |
Saturation | Controls your saturation levels. |
Set | Sets a channel(s) to a constant level. |
SetAlpha | Used to set your Alpha level to a constant value, and crops off the infinite workspace. |
SetBGColor | Used to set the color outside of the DOD. |
Solarize | A misguided Invert function. Good for Beatles album covers. |
Threshold | Clips your values. |
VideoSafe | Clips values above video-legal ranges. |
Color Space
Shake works with a color range of 0 to 1. This allows you to not have to monkey with the values when going up or down in bit depth. All operations are working in RGB Linear space. This has two implications:
If you work with logarithmic (usually) Cineon plates, you want to apply a LogLin operator or risk unpredictable results. This node allows you to jump from logarithmic to linear, or the other way around. See Overview - Log Space for more information.
If you want to apply an effect like a Blur in a different space (like blurring the color difference channels in a YUV image but not the luminance), you can use the ColorSpace node to throw it into that space. You then apply the effect, and then create a second node tbat takes you out of it after the effect. See Overview - Keying for a practical discussion of why you might want to do this.
A powerful aspect of Shake's color handling is that it concatenates many color corrections. This means if you have ten concatenating Color operations in a row, it internally compiles them into one big lookup table, and executes it (internally, one node is processed, rather than ten). An important second benefit is that by not clipping your data, you preserve much more mathematical information. Therefore, concatenation preserves quality and speeds up your processing time. This is good.
In the following example with concatenation, a Brightness of 4 is placed on Vanilla, and then a second Brightness of .25 is added. In the first tree, the examples concatenate to multiply the image by 1, so no change occurs.
![]() |
![]() |
In the second example without concatenation, all of the values get boosted up to 1 when you multiply by 4, and since the Blur breaks the concatenation, gets dropped to a maximum value of .25 when you apply a Brightness of .25 afterwards:
![]() |
![]() |
This is bad.
The following nodes concatenate:
Add
Brightness
Clamp
Compress
ContrastRGB (but not ContrastLum)
DelogC
Expand
Fade
Gamma
Invert
LogC
Lookup
Mult
Set
Solarize
AdjustHSV and LookupHSV concatenate only with each other.
You can also look for the "C" symbol in the upper left corner of the icon:
![]() |
To avoid broken concatenation, booste your bit depth to float with an Other - Bytes node. This means you can preserve your values above 1 or below zero. There is a processing penalty for the extra overhead, so be careful. See Overview - Bit Depth for more infomation.
You may see a problem on your edges when you color correct an image from a 3D render. In this example, Vanilla's contrast is dropped to .4, which quickly reveals premultiplication problems:
To clean this up, insert a MDiv before your color correction nodes (all of them) ensure you premultiply your images before you composite with a MMult node, or you can toggle on preMultiply in the Over node:
In this example, the Fade and the Add are within a MDiv and a MMult pair. The tree looks something like this.
![]() |
Because the Shake engine applies effects to a potentially infinite canvas, you may get unexpected results when you color correct and pan a small elemen across a larger element. This particularly occurs when you apply an Invert, Set, or Add on your image, since they turn the previously black pixels outside of the frame to a different color.
In the following example, a fine expression of fin de siecle angst is created with a Text node. The black background color is raised to a blue with a Color - Add node:
When the image is panned image over, it is blue in the areas that were previously outside of the frame:
![]() |
![]() |
For a black outline, you insert a Crop node before the Pan:
![]() |
![]() |
You can color correct the area outside of the Domain of Definition (DOD, represented by the green box) with the SetBGColor node:
![]() |
![]() |
See Overview - Infinite Workspace and Overview - DOD for more information.
To better understand some of the Shake color-correction nodes, use the Other - PlotScanline node, or the Plotscanline Viewer Script. PlotScanline looks at a single horizontal scan line of an image and plots the brightness value of a pixel for each X location. The most basic example of this is shown below. The example starts with a source image that is a simple horizontal gradient, that varies linearly from 0 to 1. The PlotScanline resolution is set to 256x256 (for an 8-bit image):
![]() |
![]() |
The ramp goes from black (on the left) to white (on the right). This is reflected in the graph as a linear line.
When a node is inserted above the PlotScanline node, such as a ContrastLum node, you can begin to understand the node. In the ContrastLum, value is set to 1.5 and the center and softClip parameters are adjusted:
![]() |
![]() |
The affect on the ramp is reflected in the plot.
This also works for non-color correctors, and makes it an interesting
analysis tool for the Filter - Grain or Warp - Randomize
nodes:
![]() |
![]() |
![]() ![]() ![]() |