Lighting a room through curtains

I have a room that is lit entirely through a single window with tinted, curved, partially transmissible curtains. I’m using standard Cycles for rendering. (I have an AMD GPU, so no Optix and no K-Cycles for me, and I am hesitant to spend $$$ on E-Cycles since it supposedly offers little benefit on AMD. And I end up rendering on the CPU anyway, since GPU rendering actually ends up slower for some reason. But I digress.)

If I remove curtains, lighting is relatively easy. But if they are in place, achieving good quality without artifacts becomes a real challenge. The NLM denoiser utterly fails (I end up with large splotches all over the image). I get tolerable results with OpenImageDenoise with Branched Path Tracing / 32 samples or with Path Tracing / 64 samples. But then the problem is that it takes 4 minutes to render one frame in 1080p (so a 20-second animation would take over a day), and 4K is out of the question.

Things I’ve tried:

  • Illuminating the room using either an area light that’s fitted to the size of the window, or an environment HDRI. The area light seems to work slightly better.
  • Raising “Samples” in the area light setting from the default 1 to 4. This has no perceptible visual effect.
  • Adding a “light portal” in the window, sized to match the window and oriented to point inside the room. This also has no perceptible visual effect (in most cases, it has no effect whatsoever), neither with the environment light nor with the area light, and whether I place the portal in front of the curtain or behind the curtain. This makes me suspect that I’m using it wrong but I don’t see how.

There are tons of other settings in the Cycles config, but I have no clue which ones to try, and, at several minutes per render, it’s kind of hard to experiment.

Any suggestions?

One of the better-looking renders (64 samples with OpenImageDenoise):

P.S. If you’re wondering, the scene is a Blender port of

1 Like

Did a few more experiments.

On the plus side, rendering performance in general (and GPU rendering in particular) is much improved if I enable “Simplify” and set maximum texture size to 2048. This brings the memory usage below 10 GB and lets me raise path tracing samples substantially.

On the minus side, NLM still produces color splotches (though much diminished) in all shaded areas even at 1024 samples.

Tried to understand what’s happening with ray tracing. Results don’t make total sense, but at least they are interesting. I removed the curtain altogether, switched to “Path Tracing” and set it to 1 sample per pixel. With all settings I tried, between 40% and 50% of pixels come out completely black. Presumably, rays from those pixels terminate without reaching the light, but I have no idea why. Even cranking everything to the max (24 bounces, light threshold 0) and closing doors has no effect. I get around 44% black with an area light in the window, and 47% black with an environment light. Adding a light portal in the window has no effect on the area light, and has negligible effect (maybe 0.2%) on the environment light.

Restoring the curtains bumps me up to 49-51% black pixels.

With that many samples coming in black, I am not very surprised that I need lots of AA samples to minimize noise.

Branched Path Tracing radically changes the picture. Again with 1 sample per pixel and an area light in the window, only 9% of pixels are black, and, with more ‘samples’ on the area light set to 4, even fewer are black. The flip side is that I have lots of saturated pixels. I have to clamp down hard on indirect light (put the clamp setting to something like 1.0) to keep the noise down.

Then I set up a series of tests. I’d render the same frame at different settings without denoising and calculate the noise level in the same small flat area of the frame. Turns out that BP is not all that hot:
That’s with the best BP settings I could find (I tried to vary bounces and subsamples, without much gain.)
Without curtains, picture is almost good enough to live without denoising at ~3 minutes/frame (1920x1080). With curtains, there’s a lot more noise.

Got Blender installed on my old Linux machine with 2x 1080ti and did some benchmarking.

Same exact scene, same exact settings, 4K resolution, path tracing with 256 AA samples.

  • AMD Radeon 6800 XT + OpenCL: 8 minutes
  • 2x NVIDIA 1080Ti + stock Blender: 13.5 minutes
  • 1080Ti + E-Cycles, everything at default: 9.5 minutes
  • 1080Ti + E-Cycles, “very fast” preset: 7 minutes
    (Any idea what I could expect with a 3080?)

My stupid-suggestion?

First, light the scene. As though “light through the curtains” was actually lighting it.

Then, add the curtains.

Finally, modify things as necessary – “in post” if possible – to provide the illusion that “the curtains had anything to do with it.”

Rendering algorithms tempt you to actually try to replicate what you know is “physically” going on in the scene: “the only source of light is coming in through the window, and it is physically passing through that curtain.” But a far more realistic situation is that of the theater. Where there is actually an entire bank of stage-lights strategically poised just out of sight.

The lighting must be plausible. It does not have to be physically real.

Translucency is the only way to let white light pick up curtain color and get re-transmitted to the backface. That makes it highly indirect and very subject to noise. I guess you could try to bake the lighting information of the curtain and use it as a direct light source, fill the diffuse lighting with added area light inside the room with curtain color, or add world ambient light to artificially brighten the scene - I think any of those should brighten enough to get rid of some of the low light noise.

I’m also noticing a lighting fixture that appears to be on but doesn’t seem to add anything to the lighting. Regular indoor lighting would be able to compete with semi-transparent curtains, at least letting in daylight only (no direct sun). Get some interior lighting to work, that would also brighten the room sufficient to reduce low light noise. I know nothing about branched path tracing.