You applied the LUT. The highlights look right. The shadows look muddy. You assume the light is bad. It is not. The tool is wrong for the job.
A 3D lookup table is a static map. Feed it RGB(120, 100, 80) and it hands back RGB(130, 105, 75), every time, no matter what that colour was in the scene — a shadow, a highlight, a face, a wall. It has no idea where it sits on the histogram. It knows the number and nothing else.
Film is not a lookup table. Film is a physical process. The color of a developed negative is a function of density, and density is a function of log luminance (exposure). In colour film the hue and saturation of a layer come from the dye that forms during development, and how much dye forms depends on how much exposure that layer received. This change is non-linear and dynamic. It follows the characteristic curve (H&D curve) of the emulsion.
The Yellow Object Problem
Consider a yellow object. In a correctly exposed scene, the yellow layer on the negative has a medium density. The resulting positive image shows a warm, saturated yellow.
Now, underexpose that same object by two stops. The light hitting the film is one-quarter intensity. The silver halide crystals in the yellow layer reduce less. The density drops. On a real film negative, this lower density does not just make the yellow darker. It shifts the hue. The yellow becomes greener or more olive. The saturation drops. The balance against the cyan layer changes.
A static LUT cannot replicate this. If you train a LUT on a correctly exposed yellow, it maps that specific RGB value to the "correct" film yellow. When you apply that same LUT to an underexposed yellow, it maps the darker RGB value to... nothing special. It just darkens it. It does not shift the hue toward green. It does not desaturate it in the way the emulsion would. The result is a flat, digital dark yellow. It looks like a color correction, not a chemical reaction.
This is why film LUs often look "off" in mixed lighting. The LUT was trained on one part of the curve. It cannot extrapolate to the rest. It treats the shadow yellow and the highlight yellow as the same material, just at different brightness levels. Real film treats them as different materials.
Why Static Mappings Fail
Film colorimetric response is a function of log luminance. This means the output color is dependent on the input exposure level. The relationship is not a simple linear scale. It is a curve.
In the shadows (low density), the emulsion is less sensitive. The color shift is subtle. In the highlights (high density), the emulsion is saturated. The color shift is dramatic. A LUT is a 3D grid of points. Interpolation between these points is smooth, but it is local. It does not have a global understanding of the exposure state of the pixel.
When you shoot digital, your sensor captures linear light (or log, depending on the profile). The sensor is consistent. A red is a red at 10% brightness and 90% brightness. The sensor does not change hue based on exposure. Film does. The separation of the blue, green, and red layers on the negative is a physical density. As density increases, the transmission of light through the negative changes in a complex, non-linear way. The ratios between the layers shift.
This is what makes film emulation hard. A chemical process that responds to how much light arrived is being modelled by a lookup that only sees the number in front of it.
You can mitigate this by applying a LUT to a log-graded image, but you still cannot replicate the hue shift of the emulsion itself. You are approximating the look, not the mechanism.
What to Do Instead
Stop expecting a single LUT to handle all exposure states. If you want the film look, you need to manage the exposure before the LUT. Shoot to the right. Ensure your highlights are not clipped and your shadows have detail. This keeps the input values within the range where the LUT was trained.
That is a band-aid. A LUT is a grading tool, not a colour science tool, and the distinction is not pedantic: it will give you a look, but it will not give you a response.
If you want the actual color shift of film, you need a tool that models the characteristic curve. You need to treat the color as a function of density, not just a function of RGB value. This requires a different approach than a simple 3D lookup.
The film look is a response to light, not a filter laid over it. Change the light and the response changes with it — but the LUT never saw the light, only the number that came out the other end.
This is why your favorite LUT breaks when the light changes. It is not a bug. It is a limitation of the format. The LUT is a snapshot of a curve, not the curve itself.
Try it in the Cineon studio to see how dynamic color management differs from static mapping. More on this in our piece on ACES.