This is the documentation for Enlighten.

Enlighten SDK 4.02 Release Notes


New features

High quality glossy specular reflections

For only a minor increase in runtime cost, Enlighten lighting for physically based materials is now much more accurate. Compared with the previous release, the shape of specular highlights and overall specular brightness in Enlighten reflections now much more closely matches a path traced reference.

The Enlighten runtime now optionally generates a convolved reflection cubemap mipchain compatible with the Unreal Engine physically based material model. The additional cost to solve the cubemap varies depending on the indirect lighting resolution of the surrounding area, and we measured an average of 1.5x the previous cost on the Enlighten thread. This option is disabled by default, and can be enabled in the High level runtime with IUpdateManagerWorkerProperties::m_CubemapFilterMode.

The images below show spheres with roughness 0.4, 0.6 and 0.8 in a location lit indirectly with bright lighting coming from directly above, which is now more accurately captured in Enlighten reflections. The image on the left was created with release 4.01, while the image on the right was created with release 4.02.

Halved cost of per pixel probe lighting

This release significantly reduces the runtime cost of per pixel probe lighting. The remaining per pixel probe lighting interpolation step that previously ran on the CPU now runs in a compute shader on the GPU. The update process can now use 16-bit float internal buffers, which halves the cost of per pixel probe lighting updates. To make use of this, use the compute shader update path with the new interpolation step, and use FP16 probe output with UpdateManagerProperties::m_ProbeOutputFormat.

With the compute shader update path and FP16 solver output, probe memory usage is less than half of the previous release, and the render thread CPU cost for probe lighting updates is around half of the previous release. The cost of asynchronous updates for probe lighting on the Enlighten thread is also reduced by around 10%.

4.02.P1 Smoother per pixel probe lighting

Enlighten automatically adapts the per pixel probe lighting detail level as objects move closer or further away.  When the lighting intensity differs significantly between detail levels the transition is now stable and smooth without obvious noise.  If you use temporal anti-aliasing this transition can become even smoother and often invisible.

The image on the left shows the transition in Release 4.02.R.  The image on the right shows the smooth transition in 4.02.P1.

LitLit IGN

The images below show the same comparison with simple white materials to make the comparison more obvious.

UnlitUnlit IGN

4.02.P1 Smarter automatic probe placement

Enlighten uses invalid back-faces to detect areas that are outside the world and do not need indirect lighting.  This release improves the way automatic probe placement detects areas that are outside the world, so that areas inside the world always have valid Enlighten indirect lighting.  This eliminates broken Enlighten indirect lighting in areas that see invalid back-faces.  The Enlighten indirect lighting in such areas may still be much less accurate and could appear unexpectedly bright or dark.  We still recommend not to leave invalid back-faces visible in areas where accurate indirect lighting is important.

Independent radiosity simulations

This release makes it simple to quickly switch between two Enlighten data sets that have completely independent lighting. This enables a transition between two independently precomputed scenes, without a loading screen. To make large scale changes to the entire world that affect radiosity, precompute multiple versions of the same world and switch between them. For a quick transition between two independently precomputed areas of the world, precompute multiple independent areas and switch between them.

In the high level runtime, when an optional partition argument is provided for a system, probe set or cubemap object, the object is assigned to that partition. The partition argument passed to IUpdateManager::Update specifies the partition that is currently active and requires Enlighten indirect lighting output for rendering. All systems, probe sets and cube maps in the same partition are required to have been precomputed at the same time.

Only one partition can be active for any given update frame. It is not recommended to alternate back and forth between two different partitions on consecutive updates, because this will incur a performance penalty. Indirect lighting will not be available until around 1-3 frames after the first update of a partition that newly became active. Accurate indirect lighting is available after about 20 consecutive update frames with the same partition.

By default, all input lights affect all partitions. To control which partitions are affected by a given input light, use the optional lightChannels argument of IUpdateManager::AllocateSystem, in combination with UpdateLightOptions::m_LightChannels.

GeoRadiosity with scaled displays

To ensure compatibility with High DPI displays and Remote Desktop, GeoRadiosity now renders with D3D11 instead of D3D9. By default, the GeoRadiosity window is now automatically scaled to match the display scale setting of the display onto which the window is positioned.

It is not currently possible to resize or maximize the GeoRadiosity window. This functionality will be added in a future release.

Improvements

Per pixel probe lighting: After a probe set is added to the HLRT, its probe coefficients will not be uploaded to the virtual texture until after the first solve. To revert to the previous behaviour where probe coefficients are uploaded immediately, provide a RawBuffer object constructed with initialised=true as the optional output argument of IUpdateManager::AllocateProbeSet.

High level build system: The CreateSceneOutput and CreateSceneRadiosity steps now run only when the IncludeSampleFrameWorkSteps parameter is true. By default these steps do not run, which speeds up the precompute significantly in a scene with a very large number of instances.

ExtractOctreeProbePositions now indicates when a culled probe was automatically moved to a valid location, so that these probes can be hidden or highlighted in visualisations. A negative value in the W coordinate of the probe position indicates that the probe was moved. The XYZ coordinates indicate the original location of the culled probe, not the new location.

The Enlighten Pipeline library is now optimized to speed up the export process significantly for a scene which contains millions of instances.

CodeBuildTool now reports an error when a source file listed in the Visual Studio project file is missing on disk.

This release includes prebuilt binaries compiled with Visual Studio 2022 17.3.6 and VC tools version 14.33 for Win32, Win64 and XboxOne

4.02.P1 The Enlighten Pipeline library now reports a detailed warning message when an instance or probe region covers an extremely large volume of space.  When this warning is reported, we recommend to reduce the Enlighten probe lighting resolution for the instance or probe region.

Bug Fixes

  • Fixed artifacts in per pixel probe lighting that could occur when a surface is exactly aligned with the automatic probe placement grid.

  • Fixed a crash during the CreateOutputProbeSet stage of the precompute that could occur in a world with very high probe resolution and dense geometry.

  • Fixed a bug in IntelTBB library which could trigger a precompute crash only with very specific build configurations.

  • Fixed failure to report an error when the precompute memory limit was exceeded for a very complex scene.

  • Fixed a minor memory leak in the CreateLightTransport stage of the precompute that would cause unnecessary warnings.

  • 4.02.P1 Fixed unexpected black spots in probe lighting that could occur around thin walls even when no invalid back-faces are visible.
  • 4.02.P1 EnlightenPipeline: Fixed a precompute hang when the exported scene file is larger than 2GB.

Deprecated

Removed

  • The distribution no longer includes Enlighten libraries and tools built with VS2015.
  • The distribution no longer includes Enlighten libraries for Google Stadia.

Upgrade Notes

If you use per pixel probe lighting, please update your code to use the compute shader update path with the new interpolation step.

If you use per mesh probe lighting, please update your code to use per pixel probe lighting. To temporarily enable per mesh probe lighting in the high level runtime, set UpdateManagerProperties::m_UseLegacyProbeInterpolation to LegacyProbeInterpolation::NonOctree.

ExtractOctreeProbePositions now requires RadProbeSetCore::m_DebugData to be valid, because this function is intended to be called only for debugging purposes. To obtain a valid RadProbeSetCore for this function, specify Iff::ProbeSetDebugDataSection when you call ReadRadProbeSetCore.

4.02.P1 If you use per pixel probe lighting please update your code to use the new implementation of SamplePppiVirtualTexture.

4.02.P1 So that artists can easily check for areas that have incorrect indirect lighting, we recommend that your world editor provides visualisations that highlight visible invalid back-faces.