CG Integration with Flickering Neon Lighting
My task was to composite a neon sign into the scene, which serves as the title of the film. The goal was to integrate it seamlessly into the environment, making it feel physically present through accurate tracking, rotoscoping, and custom flickering light behavior. First step, I began by tracking the video. I verified the accuracy of the camera track using a checkerboard overlay — a reliable way to ensure that the solve is sticking well to the footage.
Next, I performed rotoscoping to isolate the actor in the foreground. This step allowed me to layer the CG elements behind the actor, preserving the depth and realism of the scene. It was crucial to make the integration feel seamless — as if the CG elements were physically present during the shoot.
To speed up and enhance the rotoscoping process, I used CopyCat AI in NukeX. I manually rotoscoped a handful of keyframes to define the actor’s silhouette and then trained CopyCat to learn from that data. After training, it was able to generate a matte for the rest of the frames automatically. This greatly reduced the time spent on manual frame-by-frame rotoscoping and helped maintain consistency across the entire sequence. I then refined the result using edge blurring and garbage mattes where needed, especially for areas like hair and subtle cloth movement that benefited from AI assistance.
For the lighting design, I wanted the neon sign to feel alive — not just a glowing object, but one that flickers with character. I didn’t want a generic or predictable animation. Instead, I wrote a custom expression to drive the intensity of the neon light procedurally. This flickering behavior is grounded in real-world neon behavior: rhythmic yet unstable, soft yet erratic.
🎛 Custom Flicker Expression
nukeCopyEditclamp(
(sin(frame * 0.168) * 0.2 + noise(frame * 0.12) * 0.2 + 0.35)
+ random(frame % 10) * 0.005,
0.35, 0.75
)
🧠 Breakdown:
clamp(
(sin(frame * 0.168) * 0.2 + noise(frame * 0.12) * 0.2 + 0.35)
+ random(frame % 10) * 0.005,
0.35, 0.75
)
🧠 Breakdown:-
Sine (sin(frame * 0.168) * 0.2
) introduces smooth, cyclical brightness variation — simulating subtle voltage flow.
-
Noise (noise(frame * 0.12) * 0.2
) adds natural, randomized flicker that breaks the sine's predictability.
-
Base intensity (+ 0.35
) keeps the sign faintly lit at all times, avoiding total blackouts.
-
Micro-jitter (+ random(frame % 10) * 0.005
) creates subtle stutters every few frames to replicate analog instability.
-
Clamp (0.35–0.75) ensures the light remains within a realistic brightness range.
This hybrid approach — blending sine, noise, and randomness — gave the light an organic, imperfect energy that elevates the believability of the shot. I carefully tuned the parameters based on visual feedback until the flicker felt just right: unstable, but never distracting.
Harrison Jurgrau-Burns
Contribution
Compositing, 2D Tracking, Rotoscoping