HDRI in Corona and 3ds Max: softer shadows with Composite

If an HDRI produces overly sharp patches of sunlight, blend several copies of the same map with different amounts of blur. The sharp copy preserves the light pattern, while the blurred copies add a softer component. In Corona, the setup uses CoronaBitmap, Composite, and CoronaMix; the map weights and Blur can then be adjusted from a single panel.

Connect the HDRI and a shared rotation controller

This guide assumes familiarity with Slate Material Editor and basic HDRI lighting. The demonstration uses 3ds Max 2026 and Corona 13 (Hotfix 1). First build the setup in a simple scene with a window: the light patches on the wall and floor make it easier to compare sharp and soft lighting.

Create a CoronaBitmap and load the HDRI. For a spherical panorama, choose Environment mapping → Mode: Spherical. If the map uses another projection, select the matching mode. Enable Transform from object and assign a helper object in the scene. Later, assign the same object to every copy of the map so that their directions match.

The tutorial uses a circle with an arrow as the controller. The arrow indicates the sun's direction only if the sun occupies the corresponding position in the panorama; check this reference when using a different HDRI.

In Render Setup → Scene → Scene Environment, select Single map. During construction, connect the Composite here; after brightness compensation, connect the output of the final CoronaMix. In this mode, the map in the standard 3ds Max Environment slot does not control Corona's main environment.

HDRI graph in Slate Material Editor and the Single map slot in Corona settings
Composite connected to Scene Environment → Single map. Brightness compensation has not yet been added at this stage. 00:08:20

Create map copies with different Blur settings

Make independent copies of CoronaBitmap that read the same HDRI file. Instances of the map node are unsuitable here: changing Blur should affect the selected copy, rather than every copy at once. Keep the orientation and image-loading settings consistent.

The final demonstration uses four Blur values: 1, 5, 10, and 25. They produce different levels of blur on the selected panorama. Choose values for your own HDRI by comparing the lighting: identical numbers do not guarantee identical softness on different maps.

Blur is in the Filtering rollout of CoronaBitmap. In this tutorial, it changes the HDRI directly in the editor, so the demonstrated setup does not require separate blurred files prepared in Photoshop.

  • Start with the least blurred copy and assess the edges of the sunlit patch.
  • View each more heavily blurred copy on its own before blending them.
  • Choose levels with visibly different results: an intermediate version, clear softening, and a broad diffuse component.
Blurred CoronaBitmap copies and the Blur parameter in Filtering
Copies of one HDRI with different Blur settings. 00:07:10

Add the maps in Composite and set their weights

Create a Composite with four layers and connect a CoronaBitmap to each Layer input. Use Addition to sum the maps. Do not leave the upper layers in Normal: an opaque upper layer would cover the lower layers instead of adding them.

Create a separate OSL Float Value for each map and connect it to the corresponding Layer (Mask). These numeric values become the weights: increasing a weight strengthens the contribution of that HDRI copy. An initial range from 0 to 1 is convenient for the control panel.

Composite alone already lets you soften the lighting. However, if all four identical maps have full weight, their combined intensity increases fourfold. Brightness will drift as the weights change; fix this before tuning the lighting.

Compensate for brightness with a second Composite and CoronaMix

Build a second Composite with the same number of layers and Addition mode. This one sums only the weights: connect the same OSL Float Value nodes to its Layer inputs. Share the value nodes between both branches so that each HDRI weight and its contribution to the denominator always change together.

Add a CoronaMix with Mix Operation: Divide. Connect the HDRI sum to Base and the weight sum to Top. In the demonstrated setup, the image in Base is divided by the value in Top; reversing these inputs gives a different result.

The calculation can be written as: final map = sum of weighted HDRIs / sum of weights. If identical maps made the light four times stronger, dividing by the total weight restores the original intensity scale. With different Blur levels, the setup compensates for changes in total weight, while the light pattern and brightness of individual areas still change.

After the division, add another CoronaMix with Multiply. Its Base receives the normalized blend, and Top receives a separate OSL Float Value for overall intensity. Connect this node's output to Single map. This separates the balance of sharp and soft copies from the overall light multiplier.

  • Keep at least one weight above zero. If all weights are zero, the denominator is also zero; this setup does not protect against that case by itself.
  • Start with an overall multiplier of 1. This is a linear map multiplier, not an exposure value in EV stops.
  • Check that changing one weight affects both branches. If only the HDRI sum changes, the compensation no longer matches the blend.
Two Composite maps and the Base and Top inputs of a CoronaMix set to Divide
CoronaMix in Divide mode: the HDRI sum connects to Base and the weight sum to Top. 00:13:35

Expose the controls in Attribute Holder

Add Attribute Holder to the object that already controls environment rotation. In Animation → Parameter Editor, create parameters on the selected modifier: sliders for HDRI weights, numeric controls for Blur, and a separate control for overall intensity. The overall intensity control is labelled GLOBAL_EXP in the demonstrated panel.

In the tutorial, the weights use Float parameters with sliders, while Blur uses Float parameters with the Spinner interface. The weights range from 0 to 1; the demonstrated Blur range is from 1 to 100. Adjust it to suit the task. Panel values do not change the lighting until they are wired to the maps.

Open Parameter Wiring. On one side, select the modifier's Custom Attributes; on the other, select the relevant node parameter in the environment map tree. Wire each weight to its mask's Float, Blur to filteringBlur in its CoronaBitmap, and the overall multiplier to the Float after Divide.

The demonstration uses two-way connections. With this type of connection, Driver determines where the initial value comes from. Before clicking Connect, check that you have selected the correct pair and are preserving the intended value. Repeat for the remaining maps.

  • Change a weight on the panel and confirm that the corresponding OSL Float Value changes.
  • Change Blur and check the number in the correct CoronaBitmap.
  • Test the overall multiplier separately from the weights: it should control the entire blend.
Parameter Wiring showing the Blur-to-filteringBlur connection beside the Attribute Holder panel
Parameter Wiring connects the panel's numeric Blur control to filteringBlur in the corresponding CoronaBitmap. 00:20:40

Compare soft lighting with a blended version

Start interactive rendering and initially keep only one copy contributing. This makes it easier to see what each component adds. With the demonstrated HDRI, a small Blur preserves distinct window-shaped light patches, while heavy blurring makes the lighting much softer and removes clear edges.

Then restore the sharp copy and gradually add the more blurred copies. Assess the wall, the light boundary on the floor, and the room's overall contrast. The blurred component can fill transitions, while the sharp component keeps the sunlight pattern readable.

The final example combines different blur levels, retaining light patches on the wall within softer surrounding illumination. Choose the weights by looking at the image: there is no universal ratio for every interior.

  • Keep the camera and display settings unchanged for comparison.
  • Do not adjust weights, Blur, and tone mapping simultaneously: it becomes difficult to identify what caused the result.
  • Once the light is tuned, check it with the materials in your working scene.
Test interior in Corona VFB with a heavily blurred HDRI and soft wall lighting
Testing heavy blur: the sunlight pattern almost disappears and the wall lighting becomes soft. 00:23:20
Interior render with sunlight patches and a panel controlling the weights and Blur of HDRI copies
Blended result: the window-shaped light patches remain while the blurred copies add a softer component. 00:24:10

Set Tone Mapping separately from the HDRI blend

HDRI blending controls scene illumination, while Tone Mapping in Corona VFB controls how the result is displayed. The tutorial demonstrates a separate tonal treatment: ACES OT is removed, Reinhard is used through the Highlight Compression operator, and LUT plus Lift, Gamma, Gain are added.

This is an image treatment option, rather than a requirement for Composite to work. For a LUT, account for its intended input color space: the demonstration discusses linear and sRGB versions. Do not choose a mode solely by the folder name if the LUT's origin is unknown.

First assess the blend using familiar VFB settings. Then adjust the tonal treatment and recheck the highlights. Replacing the LUT or contrast curve changes the visual comparison between weights.

What to check if the setup behaves unexpectedly

If interactive rendering responds slowly, try disabling Auto Preview through the Composite node's context menu. Parameter changes will then no longer require an update to its thumbnail each time. This is a technique from the tutorial, rather than a promise of faster performance in every scene.

The demonstration reports freezes and crashes when working with the setup, including while rotating the controller during interactive rendering. If you encounter this behavior, stop interactive rendering before rotating. An alternative discussed in the tutorial is controlling map rotation through Wire Parameters.

For repeatable comparisons, save the camera settings, weights, and Blur values with the scene. Before the final render, check that the environment receives the output of the entire chain, including division and the overall multiplier.

  • The lighting does not change: check Single map and the output node connection.
  • Brightness jumps: check the shared masks, weight summation, and Divide inputs.
  • Map rotations differ: assign the same Transform from object controller to every CoronaBitmap.
  • The panel changes the wrong map: revisit the parameter pairs in Parameter Wiring.

Questions and answers

Can HDRI shadows be softened without Photoshop?

In this setup, yes: CoronaBitmap Blur changes the HDRI's blur inside 3ds Max. Several copies with different Blur settings are blended through Composite, and their contributions can be adjusted independently.

Why does blending HDRIs make the scene brighter?

Addition sums map intensities. To compensate, the setup divides the sum of weighted HDRIs by the sum of the same weights. This maintains the overall multiplier scale, but does not make every pixel equally bright when Blur changes.

Do I have to copy the tutorial's Tone Mapping?

No. Composite and CoronaMix form the environment map independently of the chosen VFB image treatment. Compare blends with unchanged tone mapping and account for your LUT's input color space.

Related tutorials

Technical documentation: Chaos: HDRI environment in Corona · Autodesk: Composite Map

Source of the article and frames: Adán Martín — El SECRETO detrás de la MEJOR ILUMINACIÓN HDRi en Corona Renderer