This is the documentation for Enlighten.

Enlighten SDK 4.03 Release Notes


New features

High definition probe lighting

This release makes a major upgrade to automatic probe placement and per pixel probe lighting. The resolution and accuracy of probe lighting is significantly improved, while maintaining around the same runtime cost as in the previous release.

  • Strongly directional diffuse indirect lighting now more closely matches a path traced reference.
  • Many common cases of light leaks through thin walls that separate bright outdoor and darker indoor areas are eliminated. Such light leaks now occur only where probe resolution is too low.
  • When a lower lighting detail level is used for distant areas, such light leaks now become visible at double the distance from the viewer.

The images on the left show the previous release, with the latest release on the right. Throughout, the diffuse indirect lighting matches more accurately the direct sunlight reflected by the floor. In the distance where a lower detail level is used, there is now no light leak. In the upper right, there is no longer a light leak from a bright outdoor area.

Separate sky in probe lighting

Per pixel probe lighting now provides directional environment visibility information that can be used to apply sky lighting separately from bounce lighting. With this, the lighting result more closely matches a path traced reference when Enlighten lightmaps and probes contain both sky lighting from above and sun bounce from below.

The images below show combined sky and bounce on the left, and separate sky and bounce on the right.

Lightweight probe lighting

This release includes many improvements that reduce the runtime cost of per pixel probe lighting.

  • Per pixel probe lighting compute shaders now run efficiently on AMD GPUs.
  • Reduced probe lighting GPU memory usage by around 15% compared with the previous release.
  • Reduced runtime cost for probe lighting in areas with dense transparent or double sided foliage.

It is now easier to trade per pixel probe lighting draw distance for reduced runtime cost. Use PipelineGlobalParameters::m_ProbeLodBias to limit the number of detail levels generated for automatically placed probes. When the probe LOD bias is increased, fewer detail levels are generated, reducing the distance at which per pixel probe lighting is drawn.

Eliminate unwanted lighting data

This release includes simple tools that can be used to eliminate light leaks and significant runtime cost caused by Enlighten lighting data generated for areas outside the world. 

Unless the sky will be visible far below the horizon, to eliminate sky light leaks that appear to come from below the world, use the environmentValidity radiosity parameter to specify that the lower face of the environment cube should be considered invalid.

To eliminate unnecessary Enlighten lighting data in an area outside the world that does not need Enlighten indirect lighting, the artist should place invisible geometry with a special invalid material. So that this invisible geometry incurs zero runtime cost, use an unlit instance and set the material attribute backfaceBehaviourType to doubleinvalid.

Improvements

Enlighten now automatically prevents seams in the indirect lighting when a boundary between terrain meshes lies on a steep slope.

The output pixel size parameter can now be safely left unspecified for Probe Radiosity instances.

The precompute now reports a useful diagnostic message when automatic probe placement would generate an excessive number of probes.

The precompute now reports a useful diagnostic message when an instance has an invalid scale.

The high level runtime now reports a useful diagnostic message when AllocateSystem is called twice with the same RadSystemCore object without calling RemoveSystem.

The high level runtime now reports a useful diagnostic message when the provided cubemap runtime data was corrupt.

We now distribute Enlighten core libraries built with the Visual Studio 2022 17.9.6 and VC tools version 14.39 for Win32, Win64 and XboxOne.

The DirectX SDK (June 2010) is no longer required to build tools and sample applications.

Sample Runtime now uses the GeoRender framework to compile and dispatch per pixel probe lighting compute shaders.

The framerate in GeoRadiosity and GeoViewer is now improved when per pixel probe lighting is enabled in a large scene which uses Probe Radiosity.

The GeoRadiosity process no longer consumes CPU and GPU resources when its window is minimized.

Bug Fixes

  • Fixed an intermittent GeoPrecomp2 process hang during the precompute on some machines.
  • Fixed rare black probe lighting artifacts that could occur in certain areas.
  • GetOctreeCodeWorldPositionAndSize now returns the correct value, rather than double the correct value.

  • Fixed a crash related to resource errors that affected only the prebuilt GeoRadiosity.exe compiled with VS2022.

Deprecated

Removed

  • The distribution no longer includes Stadia platform support.
  • The per pixel probe lighting legacy texture update path is no longer available.
  • IUpdateManager::UpdatePppiBorder and PppiWorld::UpdateBorder.
  • IUpdateManager::GetOutputIfUpdated.
  • IUpdateManager::GetTextureUpdateTicks.
  • CreateProbeAtlasMaxima
  • IPrecompInputProbeRegion::AddVolume
  • The overload of IPrecompInputProbeRegion::Create which takes a voxelSize argument.

Upgrade Notes

When the radiosity parameters do not specify output pixel size, the output pixel size no longer defaults to 100. If you need to preserve the previous behaviour, specify output pixel size of 100.

The probesParameterSet useCulling parameter no longer has any effect on automatic probe placement. With automatic probe placement, culling is always on. This changes probe placement behaviour for existing scenes which use automatic probe placement and set useCulling to false.

The high level runtime now reports an error when the runtime data was generated with an unsupported number of probe environment visibility SH coefficients. In the Radiosity parameters probesParameterSet envVisShNumCoefficients, for separate sky lighting use SH_ORDER_L1 (4), otherwise use SH_ORDER_DISABLED (0).

Please update your code to use the improved per pixel probe lighting API as follows:

  • Call MakePppiConfiguration to construct a PppiConfiguration with exactly the right size for the world. Don't specify the atlas resolution.
  • Call the PppiWorld::Update overload which takes the computeUpdateHandler argument as a reference. The compute shader update path is now always used.
  • Use the new version of the compute shaders in GeoRuntime/Resources/PppiInterpolate.hlsl, GeoRuntime/Resources/PppiClipmapUpdate.hlsl and GeoRuntime/Resources/PppiAtlasUpdate.hlsl.
  • Use the new version of the SamplePppiVirtualTexture function in GeoRuntime/Resources/PppiCommon.cg. Set the value of g_ProbeLodCount to PppiShaderParameters::m_LodCount.
  • For the new validity texture format PPPI_VOLUME_TEXTURE_FORMAT_R8, use the equivalent of DXGI_FORMAT_R8_UNORM.
  • For the new indirection texture format PPPI_VOLUME_TEXTURE_FORMAT_R32U, use the equivalent of DXGI_FORMAT_R32_UINT.

To improve occupancy on AMD GPUs, the compute shaders now use StructuredBuffer for resources that are accessed in a uniform manner across a wave.
If AMD GPU performance is not a priority, or StructuredBuffer is not available, replace StructuredBuffer with Buffer.