Occlusion Data

Left holes in the ocean. Right no holes in the ocean.

The game uses several different optimizations methods, like manually placed occlusion planes/boxes or view frustum culling.

In addition to those methods, each exterior cell record has a field (TVDT - Occlusion data) that keeps track if a LOD mesh covering 4x4, 8x8, 16x16 or 32x32 cells should be visible. For example a big mountain hides any LOD behind it, so that occluded LOD is disabled, which helps performance. The data covers the 4 LOD levels up to 256 x 256 cells for the worldspace.

The vanilla game only includes this occlusion data for the Tamriel worldspace. It is famously wrong for several cells resulting in visible rectangular holes in the LOD, especially in the sea of ghosts.

TVDT - Occlusion Data can be generated as part of the LOD generation process after terrain LOD and object LOD. Since the occlusion data has to be generated for many exterior cell records, it means a lot of them need to be overwritten, which can result in more plugins being required as masters by the plugin that contains the overwritten cell records.

So, unless maybe generating for Enderal, it seems overall more convenient to generate a separate Occlusion.esp plugin. Having the data in a separate plugin makes it easier to deal with overwrite orders or load order updates.

DynDOLOD offers both options - generate the occlusion data into the DynDOLOD.esp or a separate Occlusion.esp (which is equivalent to using xLODGen) - in the advanced mode options. The Occlusion.esp is flagged as light plugin (ESL) automatically if possible.

In case of questions or feedback, check the Skyrim TVDT - Occlusion Culling Data thread on the official DynDOLOD support forum.

Generation

By default the occlusion data generation is always checked and a separate Occlusion.esp will be generated unless Enderal is detected, in which case the occlusion data is generated into the DynDOLOD.esp. This can be changed in the advanced mode.

It also possible to only update an existing or generate a new Occlusion.esp with xLODGen or DynDOLOD at any time. The process is the same, however DynDOLOD uses some pre-defined settings from ..\DynDOLOD\Edit Scripts\DynDOLOD\DynDOLOD_[GAME MODE].ini as explained below. To only generate or update Occlusion.esp with DynDOLOD, disable all other options and only check Occlusion Data and Plugin.

In case of updating an existing DynDOLOD installation with a separate Occlusion.esp, also keep Occlusion.esp activated and make sure it loads last right after DynDOLOD.esp. The Occlusion data and Plugin checkboxes will be checked automatically. The occlusion data for the selected worldspaces will be updated.

In case of updating an existing DynDOLOD installation with or without a separate Occlusion.esp, check the Occlusion data and Plugin checkboxes and uncheck Object LOD, Tree LOD, Dynamic LOD and Terrain Underside. It should then generate an Occlusion.esp only, just like xLODGen would.

To not change or update an existing Occlusion.esp it should be deactivated so that it is not visible in the data folder and uncheck the Occlusion data checkbox. After generating LOD, activate the existing Occlusion.esp again. In this case it might need manual patching in case plugins make changes to worldspace or cell records.

Typically occlusion for a worldspace should be generated last after all patches and terrain and object LOD have been generated for it. In case the LOD patch for a load order is generated in different session, occlusion should be generated in a separate last step for all worldspaces after the combined DynDOLOD output has been installed and activated.

Optional Configuration

Quality - the more samples are used the more distant cells are potentially disabled. Generally use 2 for a quick update. Use 3 if time permits - it typically results in a few more areas that are disabled. Total time depends on selected mode (number of cells that need to be updated) and hardware. Quality 2 is reasonable quick with a large worldspace may be taking a minute or two. Quality 3 can easily be a couple magnitudes slower than quality 2. It may have to compare up to 256 (16 x 16) samples between two cells instead of 16 (4 x 4).

Plugin - check to generate a separate Occlusion.esp, which is equivalent to using xLODGen.

For the settings below, edit ..\DynDOLOD\Edit Scripts\DynDOLOD\DynDOLOD_[GAME MODE].ini:

OcclusionHeight - the algorithm uses the highest point of the heightmap or object LOD between two samples points. Since the player itself could be standing on the highest point, this can add a bit of additional height if required. There is no need to change the height unless holes can still be seen in the distance from a vantage point.

OcclusionRadius - the engine renders about a 100 cells into the distance. There is no need to show or calculate the visibility of cells beyond that limit.

OcclusionMode - helps to limit the amount of CELL records that need to be processed. CELL records without terrain height data are always skipped. -Flat means to skip cells with terrain height data that is perfectly flat - it typically means the cell is way outside the playable area. +Border means to only process cells if they are linked to a region that has the Border Region flag set - since the player is normally restricted to cells inside the border region. +TVDT will update cells that already have TVDT data and -TVDT will update cells that do not already have TVDT data. +Border is ignored for child worldspaces that use the selected worldspace for LOD.

By appending _[Worldspace name] to any of the settings, the default can be overwritten for a specific worldspace. DynDOLOD automatically filters out small worldspaces. Specific worldspaces can be enabled/disabled by setting Occlusion_[Worldspace name]=1/0. See the existing settings for defaults and examples how to set specific options for a worldspace.

The default setting -TVDT is used to ensure less work and less overwrites are being copied into the plugin for new land mods, in case they already include the occlusion data themselves.

Out of Memory while Generating Occlusion Data

Set OcclusionMaxThreadsObjectLOD=1 in ..\DynDOLOD\Edit Scripts\DynDOLOD\DynDOLOD_SSE.ini in case the parallel reading of large object LOD meshes consumes too much memory and/or takes a long time. When using xLODGen, the INI settings needs to be added to C:\Users\[USERNAME]\AppData\Local\Skyrim Special Edition\Plugins.sseviewsettings under the [SSE LOD Options] header.

If object LOD meshes are large because of lots full models, find or create dedicated and optimized LOD models - in particular when using full model trees for 3D tree LOD. See 3D Tree LOD Model.

If object LOD meshes are large because of grass LOD, consider lowering its density with the Density dropdown on the advanced mode settings.

Alternatively, generate object LOD meshes without grass LOD (and/or ultra tree LOD) to be used for generating occlusion only in a separate session.

Try re-generating or updating Occlusion.esp only for the affected worldspaces only in separate session(s) after LOD has been generated successfully as explained above under Generation. That includes alternatively using xLODGen again in extreme cases.