
ValheimVisuals
Valheim Visuals: a set of graphics settings I like, made into a mod — water tessellation, reflections, normal maps and AO turned up within the game's own declared ranges.ValheimVisuals
A set of graphics settings I like, made into a mod.
Valheim's own shaders support more than the game uses: its water supports tessellation and refraction but is set to 4 of a possible 32 and 0.01, building normal maps are applied at intensity 1.0, and snow and rain are lit as flat sprites. This mod tunes those existing effects. Optional bicubic upscaling and the opt-in screen-space lighting use small bundled shaders; the game's world and material shaders are not replaced.
What it changes
| Vanilla | Default here | |
|---|---|---|
| Shadow distance | 150 m | 300 m |
| Shadow resolution | High | Very High, cascades weighted towards the player |
| Anisotropic filtering | level unset | 16× |
| Ambient occlusion | G-buffer only, 10 samples | Medium with downsampling, from depth so grass and leaves are occluded too; intensity 0.1 |
| Screen space reflections | off | off (switch available: High resolution, 128 ray steps, intensity ×2) |
| Depth of field | game's switch only | blur size, focus, aperture and quality controls |
| Reflection probe cubemaps | ~128 px | 512 px |
| Water tessellation | 4 of 32 | 16 |
| Water refraction | 0.01 | 0.05 |
| Water metallic | 0 | 0.8 |
| Water detail distance | 120 m | 350 m, the game's far sea moved to the same distance |
| Normal map intensity | ×1 | ×1.4 on every material that has one |
| Particle lighting by facing | 0 | 0.5: snow and rain catch firelight |
| Grass radius | 140 m | 200 m |
On by default: contact shadows, GTAO ambient occlusion and caustics (the waves' light on the shallow sea bottom, section Caustics); optional, off by default: screen-space indirect light — effects the game does not have, drawn by the mod's own shaders (see below). A new water surface is a separate mod, ValheimWater; this one stands its water settings down while ValheimWater draws the sea.
Colour grading, exposure, fog and world loading distance are left as the game ships them. LOD overrides are optional and off by default. Nothing that affects gameplay is touched (torch shadows, which the stealth system reads, stay as they are).
Requirements and install
- BepInEx for Valheim. Configuration Manager is optional but recommended.
- Install with a mod manager, or put
ValheimVisuals.dllintoBepInEx/plugins. Client-side: the server neither needs nor notices it.
Settings
Every value applies live. The config is grouped by module (Shadows, Surfaces, PostFx, DoF, Vegetation,
Reflections, Materials, Water, Particles, Rendering), each with an Enabled switch; a switch turned off hands the value
back to the game rather than writing a remembered one. General.Enabled switches the whole mod off; the Compare key
(Right Arrow by default) restores everything the mod changed for this session only, for a before-and-after comparison.
Additional controls
All of these overrides start disabled or set to Vanilla, so upgrading does not change the existing look.
| Setting | What it does |
|---|---|
PostFx.UseTaaSpread, TaaSpread |
TAA jitter diameter, 0.1–1.0 pixels. Requires Antialiasing = Taa. Lower is sharper but may shimmer more. |
PostFx.Vignette |
Vanilla, explicit Off, or On, with intensity, smoothness and roundness controls. |
PostFx.DisableSsr |
Explicitly disables screen-space reflections, including those in the original profile. Takes precedence over SsrEnabled. |
Reflections.DisableEnvironmentReflections |
Suppresses reflection probes and the sky reflection fallback; pauses the game's periodic probe refreshes. Direct-light highlights remain. |
Rendering.UseRenderScale, RenderScale |
Custom 25–100% internal 3D resolution, with UI at screen resolution. Follows window resolution changes. 75% means 75% of each dimension, not 75% of pixel count. |
Rendering.Filter |
Vanilla, Bilinear, Pixelated, or Bicubic (Catmull–Rom). Works with either the game's scale or the custom percentage; only affects rendering below native resolution. |
Rendering.UseLodBias, LodBias |
Overrides the game's global LOD bias, 0.25–5. Higher values retain detailed models farther away. |
Rendering.UseTreeLod, TreeLodMultiplier |
Multiplies LOD distances for loaded TreeBase trees, 0.25–4, in addition to global bias. Does not alter rocks, buildings, world loading distance or distant vegetation managed by other mods. |
Screen-space lighting (opt-in)
Three passes of the mod's own on the game's deferred camera, each with its own Enabled (off by default). Every
opaque shader of the game writes the G-buffer they read — grass and leaves included — so they apply to everything
solid on screen. Screen space means they only know what is on screen: what is off screen or hidden behind something
does not cast, occlude or bounce.
| Section | What it does | Settings |
|---|---|---|
ContactShadows |
Short sun shadows the shadow map is too coarse for: stones on the ground, plank edges, the foot of a post, grass at its roots. Written into the game's own sun shadows, so only direct sunlight is darkened. Needs the game's shadows on. | Length 0.35 m, Distance 80 m, Strength 0.8, Thickness 0.1 m |
Gtao |
Ambient occlusion that darkens only the sky light and reflections, not the sun or torches: room corners, eaves, roots, the foot of a wall. Thin things (grass, posts) hide only what lies within Thickness behind them, so there are no dark halos. Replaces the post-processing occlusion: PostFx.AmbientOcclusion and the game's SSAO setting are overridden off while it is on, and come back when it is off. |
Radius 1.5 m, Strength 1, Thickness 0.5 m, Quality 2 |
IndirectLight |
One bounce of light between surfaces: sunlit sand lighting the shaded side of a wall, firelight off walls onto the floor, colour from grass on the trunks beside it. The game otherwise lights everything with direct light plus one flat sky colour. | Intensity 1, Radius 4 m, Thickness 0.5 m, Quality 2 |
Thickness is how deep a surface on screen is assumed to be: the depth buffer has nothing behind what it shows.
GTAO and the indirect light need an HDR camera (Valheim's is) and draw nothing otherwise. With the post-processing
module off (PostFx.Enabled = false) the mod cannot switch the game's own SSAO off, and both occlusions would apply.
SsrEnabled = false retains its original meaning: stop enabling/tuning SSR. Use DisableSsr = true to force it off.
Likewise, Reflections.Enabled = false hands control back to the game; it does not disable the game's reflections.
To suppress both reflection sources, enable both explicit disable switches while keeping their modules enabled.
Custom shaders from other mods can implement additional reflections outside these controls.
The game's built-in scaling path only supports resolutions below native. Values above 100% would require a separate supersampling implementation. Bicubic adds GPU work compared with bilinear; its effect is reconstruction quality, not new image detail. Windows/Proton and native Linux shader bundles are embedded in the DLL. If the shader cannot load on a platform, filtering falls back to bilinear with a log warning.
Performance
The extra effects cost GPU time. On a Ryzen 5 5600X and RTX 4070 SUPER at 2560×1440, screen-space reflections were
the largest cost (about 4 ms) and ambient occlusion the next. SSR is off by default: water never shows it and most of
Valheim's surfaces are too rough to, so PostFx.SsrEnabled is there for anyone who wants it anyway. The
AO default (Medium, downsampled) is the cheaper setting measured, and PostFx.AmbientOcclusion = false is the next
thing to turn off for headroom. At 1280×720 contact shadows measured 0.045 ms, GTAO 0.11 ms and the indirect light
0.14 ms per pass (each drawn many times, the difference divided: the game reports no GPU timings; the repeated part is
the trace or gather, not the copies, blurs and final composite); four times the pixels at 1440p costs roughly four
times as much. Measured on
one machine, so results elsewhere will vary.
Compatibility
Works alongside texture replacement mods (normal-map intensity is re-applied to materials they create later). Do not combine it with a mod that replaces the water shader outright.
The water settings also stand down while ValheimWater draws the sea (it replaces the shader they tune).
Leave the LOD overrides off when another mod manages the same LOD groups. WeatherOverhaul ownership is respected: the environment reflection switch also yields while WeatherOverhaul declares ownership of reflection probes. SSR remains a separate post-processing control.
If another mod replaces the camera's post-processing profile, ValheimVisuals yields instead of repeatedly replacing that profile. Changing a PostFx setting or toggling the module off/on permits it to acquire the new profile. Mods that continuously write the same effect parameters can still conflict; configure each shared effect in one mod.
Building and checking
dotnet build -c Release uses the checked-in shader bundles. Rebuild them with tools/Build-Shaders.ps1
(Unity 6000.0.75f1 with Windows and Linux build support). No downloaded Unity packages are needed for this shader project.
The Unity project's ShaderChecks.Run checks the built bundle, the screen-space passes included, on a synthetic frame.
dotnet run --project tests/Checks/Checks.csproj checks value ownership and scale boundaries.
Build tests/Runtime/Runtime.csproj, then run tools/Test-Runtime.ps1 for menu-only integration checks in an installed
game. The runner refuses to interrupt an existing game, uses a separate save directory, restores the installed DLL
and config, and leaves results under tests/results. It does not load a world or character.
tools/Run-Stand.ps1 loads a world (backed up first, saves blocked and compared afterwards) and photographs the
screen-space lighting around a stone wall on a sunlit shore (-Extra '-stand-screen-cost' adds its cost); results go to
Documents/ValheimVisualsStand.
More
The FAQ covers what to switch off when something looks wrong, the depth-of-field controls, and texture packs.
Problems and feedback
Write to me on Discord: https://discord.com/users/683075123816824940. Attach BepInEx/LogOutput.log from the game folder, or from the profile folder with a mod manager (r2modman: Settings → Browse profile folder), and say what you did when it happened. A screenshot with the Right Arrow comparison (the game's own values
against the mod's) helps with anything visual.