To achieve our painterly look, we mainly relied on textures and shader tricks - and of course the Brush Stroke Tools. The rough idea was to get about 95% to our desired result done entirely "in-camera", and then try to enhance it even further using the compositor. Over the course of the past few Open Movie projects, a lot of development has happened in Blender's compositor to integrate it more into the rendering pipeline (GPU accelerated viewport compositing, procedural nodes, integration of the asset shelf, etc).
In this article I will try to break down the process of compositing in 'Singularity' and highlight a few of the standard and custom tools that were at our disposal.
We've packed the most used compositing node setups from our production in this handy library. In this article I'll go over some of the ideas behind these setups and show how and where they were applied.
But first, to understand how compositing fits into the pipeline, let's take a look at how we juggle our .blend files and move renders around!
How our file and image IO was set up.
The lighting file outputs a 32 bit MultiLayer EXR (we opted for 'PIZ' compression) image sequence, which gets read in the comp files. From here we deliver a bunch of passes:
We also defined shader AOVs to give us a couple of masks:
These masks were used to drive the post effects of the creatures. We opted for AOVs because these were impossible to extract with Cryptomatte alone.
During the lighting process we already used the compositor to do some basic look adjustments and do the gamut mapping from linear to SDR/HDR. This way we could already have a general idea of how the shot would look like while adjusting lights. The real-time viewport compositor was absolutely vital to this process.
This simple comp setup ensured we would see proper colours during lighting
In some cases we separated the scene into View Layers. This was done for two reasons. Firstly, we could easily re-render a part of the shot as elements got updated. Secondly, we rendered some shots with camera motion blur, but to disable motion blur on the characters (they were animated on 2's, and motion blurring them would have resulted in weird glitchy streaks that only show up every other frame!), those had to be rendered on their own separate View Layer.
During the lighting phase, dailies were rendered as 8-bit PNG image sequences in 2K resolution to save disk space on the server. When it was time to assemble the comp files, I did a first pass of rendering the entire movie in MultiLayer EXR with lossy PXR24 compression. Those acted as placeholders in the compositor until the final frames were rendered.
In the comp file the plates and passes were assembled, with a Cryptomatte node already created for convenience.
The output of the compositing stage was a 16-bit (half) MultiLayer EXR file without the gamut correction applied, this was read in the grading stage from the edit. Additionally, a 8bit JPG sequence was referenced in the edit to export daily rushes and an MP4 was output for quick checks in a video player after rendering.
Let's start with the simple stuff! I cannot overstate the usefulness of the masking tools in Blender. They are a powerful tool for applying effects and tweaks in certain areas without having to resort to pre-rendered elements. Also, Cryptomatte is really the bread and butter when it comes to extracting masks from rendered plates. I really couldn't live without it! There are several cases where masking comes in handy, and often it's the little tweaks that can really make a shot work.
Our main task is to help guide the viewer's eye over the frame. This is done through the staging (in animation) of the shot, set design and lighting. Due to time constraints, you can sometimes only get to about 90% of the readability that way. Brightening areas of the frame or dialing up or down the contrast can make a huge difference. I use masks a lot as input for the Color Balance node or even just with a simple Mix node set to Multiply to do these small adjustments.
Masks were used often for little adjustments to increase the clarity of a shot.
All of the above shots were done with a combination of a hand-animated mask and a few Cryptomatte selections. Sometimes even a quick darkening of some elements can help to tidy up the clarity.
There are always render glitches and little annoying things that pop up in single frames. Most of the time we of course would go back into the lighting file, track down the root cause of the issue and re-render. In some cases this actually proved to be simply not worth the time of searching and re-rendering. In those cases we opted for the "fix it in post" approach.
The movie has countless of these small error fixes.
I would usually draw up and animate a quick mask. This could then be used to blend in either a clean plate, a solid color, or the previous frame if I can get away with it.
One of our main story points is that the space creatures emit energy, so adding a little bit of magical glowy sparkle is very important! In most shots, the glow consists of simple glare/bloom nodes. They use the masks generated by the 'energy' and 'trails' AOV to control its intensity. To make the effect more painterly, I created a custom color dilate/erode effect (which just uses a generic dilate/erode node per RGB channel). This mimics the effect of paint pooling up and really helps to break the smooth digital blur of the standard glow.
Can't resist that glow!
When we saw our first lighting dailies, it became obvious that we needed to have some form of DoF to simplify backgrounds and direct the viewer's eye to the characters. A simple camera DoF would have looked too "computery", so I tried a treatment with the Kuwahara filter.
The painterly DoF effect uses two stacked Kuwahara filters based on the depth pass.
Since we rendered everything in 4K and would eventually see the film projected on a huge cinema screen, the frames deserved a little more "artificially handcrafted" little touches. Sometimes in watercolor art, you see traces of the old pencil sketch through the final painting. I wanted to recreate that feeling with super subtle pencil-style scribble effects.
Scribbles turned up a notch for better visibility. They were animated on 2's only on the characters, the environment was kept mostly static.
In a couple of shots I wanted to create some lens flares for dramatic effect, and of course that effect had to be stylized as well. I quickly threw together a couple of brush strokes which were projected onto the camera's view plane using geometry nodes. I added a controller which could easily be snapped to the light emitting object (in our case that was the distant sun).
The lens flare setup in a comp file.
This setup was put directly into the comp file and rendered with Eevee. Since we linked in the entire output stage from the anim file it was super simple to integrate into the rendered frames. You can check out the file here:
In each flare shot, the size and intensity of the flare was animated by hand to fit the rendered sequence.
In real-life photography, I really love light leaks that are caused by stray reflections in camera lenses. They create such a dynamic and grungy feel if used in the right moment. To fit to the painterly world of our film, those also had to be adapted into our brush stroke medium.
As a basis I created a couple of high-resolution plates filled with various brush stroke patterns. This gave us a couple of options to find the ideal pattern for each shot.
The plates were rendered at 8K resolution.
I used those plates in conjunction with animated masks and procedural noise nodes to create a light leak effect that could be added on top of the rendered plate.
In this shot the light leak effect was meant to hint at the location of the black hole in order to help with continuity.
Those brush plates also came in handy to break up and enhance the glow effect in certain shots. Here they almost acted like dust and grunge on our virtual camera lens.
Here the brush plate is used to grunge up the glow effects.
That's it! All in all, compositing on 'Singularity' wasn't necessarily about gigantic technical breakthroughs. A lot of the Blender development that happened in the time-frame of our production definitely improved the speed and workflow! The convenience of having a bunch of these simple node setups at our disposal, ready to be dragged in with the asset shelf AND running very fast in the GPU (it's all in 4k!) made a huge difference! All the little features and improvements helped to bridge the gap between lighting and compositing even further and lowered the entry barrier for users. I learned a lot in the process that can already be applied in our next projects. You'll see some results very soon!
The nodes are available in the content gallery. Let me know if you have more questions, I will try my best to answer them in the comments!
Join to leave a comment.