Shadow Optimization for SSE
The goal of this thread is to discover the best vanilla shadow settings for SSE.
[Display] bDisableShadowJumps=1 fSunShadowUpdateTime=1.0000 fSunStaticTimeUpdateScale=0.1000 fSunUpdateThreshold=0.5000
These settings control sun-shadow movement. SSE modified shadows so that they move constantly with the movement of the sun by default (bDisableShadowJumps=1), in which case fSunShadowUpdateTime and fSunUpdateThreshold are ignored. This can cause constant shadow flickering at places, so many users find it best to go back to the Oldrim method by setting bDisableShadowJumps=0 and utilizing the fSunShadowUpdateTime and fSunUpdateThreshold to modify how often the shadows update in relation to the sun. However, setting bDisableShadowJumps to 0 may cause blinking shadows, so it is recommended to leave it at its default of 1 if you experience blinking shadows.
- fSunShadowUpdateTime sets the speed of sun-shadow transitions in seconds when bDisableShadowJumps=0. It is recommended to be adjusted to minimize the transitions.
- fSunStaticTimeUpdateScale sets the amount of time in seconds that passes between updating the shadows with the sun when bDisableShadowJumps=1. There is no transition using this method.
- fSunUpdateThreshold sets the time between sun-shadow transitions when bDisableShadowJumps=0. A value of 0.05 is equal to 1 second, so a value of 1 equals 20 seconds. Increasing this also increases the distance the shadows will move during the transition. It is recommended to be adjusted to minimize the transitions.
[Display] bDisableShadowJumps=1 fSunShadowUpdateTime=0.25 fSunStaticTimeUpdateScale=0.1000 fSunUpdateThreshold=1.5
- fShadowDirectionalBiasScale sets the directional bias of the shadows applied to surfaces.Low values reduce peter-panning (detached shadows), but cause more shadow acne (AKA shadow striping). Please note that while fShadowBiasScale does exist in the INI files, it does not appear to work, and is presumed to be a leftover from Oldrim.
- bDrawLandShadows toggles the ability of land objects such as rocks and mountains to cast shadows.
- bTreesReceiveShadows toggles the ability of trees to cast shadows on themselves.
Interior Shadow Draw Distance
- fInteriorShadowDistance sets the distance that shadows are cast from the player while indoors. In Oldrim, and presumably also in SSE, increasing this greatly increased the likelihood of seeing blinking lights, so it is recommended to be left at its default value.
Exterior Shadow Draw Distance
- fShadowDistance sets the distance that shadows are cast from the player outdoors. Increasing this decreases the relative resolution of shadows. Increasing this has a small performance cost.
Reasoning for recommendation:
1 cell is 4096 units.
2 cells is 8192 units. 2 cells seems far enough.
Detailed Shadow Draw Distance
- fFirstSliceDistance sets the distance that full resolution shadows are cast from the player. You can sometimes visibly see the line where the detailed shadows (fFirstSliceDistance) stop and the lower resolution shadows (fShadowDistance) begins. I believe this value is used only in exteriors. Increasing this does not lower the relative resolution of shadows like fShadowDistance does. Increasing it has a small performance cost.
Reasoning for recommendation:
1 cell is 4096 units.
Hypotenuse of cell is 4096√2 ≈ 5,792.6188
1/2 of that is about 2896
- iNumSplits sets the number of shadow splits. Acceptable values appear to be 2 or 3. More experimentation with iNumSplits=3 is warranted. Setting this to 0 or lower crashes the game. A setting of 1 is buggy. 4 is buggy. It may prove in future that iNumSplits=3 is the superior value, as initial testing indicated that it vastly improved shadows. However, in-game testing reveals that it seems to cause issues in some areas, showing a shadow render line more often. Therefore, it is recommended to leave it at 2 unless this issue can be solved.
- iShadowMapResolution sets the resolution of shadows. This value controls virtually the entire performance impact of shadows.
Settings to Be Tested
The following shadow settings (or presumed shadow settings -- some might not do anything to shadows at all) are relatively unknown and need to be tested to determine exactly what they control and how they can be usefully modified:
[Display] bCreateShadowRenderTarget=0 bDirShadowMapFullViewPort=1 bDisableHighTreeShadow=1 fExponentialShadowMapScale=10.0000 fLoadingMenuShadowBias=30.6400 fLoadingMenuShadowFallOff=0.0000 fMaxFocusShadowMapDistance=450.0000 fMaxHeightShadowCastingTrees=5000.0000 fShadowClampValue=0.3000 fShadowSparkleIntensity=0.2500 iEnableShadowCastingFlag=2 iLoadingMenuShadowLightFlags=1
- fShadowSparkleIntensity propably modifies the intensity of snow sparkles in shadowed areas.
[Display] ffocusShadowMapDoubleEveryXUnit=450.0000 iNumFocusShadow=4
The following shadow settings are believed to be unused or broken:
[Display] bActorSelfShadowing=0 bShadowsOnGrass=1 fShadowBiasScale=1.0000
- bActorSelfShadowing is leftover from previous games and did not work in Oldrim.
- bShadowsOnGrass toggled the ability of shadows to be cast upon grass in Oldrim, but disabling it appears to break grass entirely in SSE.
- fShadowBiasScale set the shadow bias in Oldrim, but appears to have been replaced by fShadowDirectionalBiasScale in SSE.
- iShadowMaskQuarter actually works in SSE. However, changing it only produces bugs. Here is an example of iShadowMaskQuarter=2 so that you get an idea of what it is doing. Basically, by halving the value, it removes a quarter of the shadow mask. In order to have all 4 quarters of the shadow mask, you need to set it to 4. Setting it higher or lower produces game-breaking bugs.
[Display] bDisableShadowJumps=1 fFirstSliceDistance=2896 fShadowDirectionalBiasScale=0.47 fSunShadowUpdateTime=0.25 fSunStaticTimeUpdateScale=0.1000 fSunUpdateThreshold=1.5
[Display] bDrawLandShadows=1 bTreesReceiveShadows=1 fInteriorShadowDistance=3000 fShadowDistance=8192 iNumSplits=2 iShadowMapResolution=2048
Edited by DoubleYou, 01 November 2020 - 06:04 PM.