Repository navigation
PBR Support
Community Shaders' two advanced material modes — full PBR and the older Complex Material (CM, the metalness/environment-mask workflow that predates full PBR) — are both handled by the same downstream tool: PGPatcher. It's PGPatcher, not AutoSeasons, that actually converts a mesh to use either one. AutoSeasons' job is to make sure its own seasonal duplicates are already set up correctly by the time PGPatcher runs, so they get converted right alongside everything else in your load order.
The practical takeaway for most users: just run PGPatcher after AutoSeasons (and after AutoBlend too, if you use it), pointed at your full merged load order — which includes AutoSeasons' own generated output. PGPatcher's own output then goes at the bottom of your load order, after everything else. You don't need to do anything AutoSeasons-specific beyond that; the sections below are for anyone who wants to understand what's actually happening under the hood.
-
PBR needs an explicit rule (a
PBRNIFPatcher/*.jsonfile) telling PGPatcher which texture to convert and how. AutoSeasons authors these rules for its own seasonal PBR duplicates — see below. -
CM needs no rule at all — PGPatcher detects it purely by file presence: if a
_m/_emenvironment-mask texture sits next to a diffuse texture, PGPatcher converts that mesh to CM automatically. AutoSeasons doesn't need to do anything special here either: as long as a mod ships a seasonal_m/_emfile using the normal naming convention (same as a_nnormal map — see Naming Conventions), it's already in place by the time PGPatcher's own downstream pass looks for it, and gets picked up the same way the base (non-seasonal) texture does.
So: PBR requires AutoSeasons (or another mod) to author a rule; CM just requires the right file to exist on disk. Both are handled correctly by AutoSeasons' seasonal duplicates without the end user needing to configure anything.
For each record, AutoSeasons checks whether a matching PBR rule already exists anywhere in the
merged load order (scanning every mod's own PBRNIFPatcher/*.json, not just its own generated
output) for the texture it's about to use. If your seasonal variant already has PBR art and a rule
for it — whether from your own mod or another PBR texture pack — AutoSeasons reuses that
information rather than guessing.
When a seasonal duplicate needs its own PBR rule (i.e. no existing mod already provides one for that exact texture name), AutoSeasons authors a new PBRNIFPatcher json file for it — cloning non-slot attributes (roughness scale, subsurface, multilayer, etc.) from a matching existing rule for the base (non-seasonal) texture where one is found, so a seasonal variant doesn't lose its base texture's PBR tuning.
One json file per texture, not one merged file. This is deliberate: it keeps each generated rule easy to find, inspect, or hand-edit for a specific texture, and avoids one mod's rule file growing to depend on exactly what AutoSeasons happened to generate for every other texture in the same run.
A PBR rule's normal map (slot2) and RMAOS/roughness-metalness-AO-subsurface map (slot6) are
normally read directly from the matching rule. If a rule omits one of these (this does happen —
some PBR texture packs' own rule files are incomplete for certain variants) but a file following
the conventional naming (..._n.dds for normal, ..._rmaos.dds for RMAOS) genuinely exists on
disk next to the diffuse texture, AutoSeasons fills the slot from that file instead of leaving it
empty. This only ever fills in what a rule leaves blank — it never overrides a slot a rule
explicitly specifies.
Community Shaders reads a TextureSet with the exact EditorID DefaultPBRLand as its fallback PBR
terrain material for landscape that has no LandscapeTexture assigned at all. This is a completely
separate convention from TerrainHelper's LandscapeDefault record (see below) — one is Community
Shaders' own PBR fallback, the other is a legacy vanilla-parallax mechanism.
AutoSeasons checks whether any mod in the load order already provides a DefaultPBRLand
TextureSet record. If one already exists, AutoSeasons leaves it alone entirely — several PBR
landscape texture packs ship their own, and AutoSeasons must never override or duplicate one.
Only if none exists does AutoSeasons create it itself, using the PBR-converted version of whatever
texture your load order's LandscapeDefault record considers vanilla-default (usually the game's
own default dirt texture) — and clones a matching PBRTextureSets json for it too, so Community
Shaders reads its real roughness/subsurface settings instead of falling back to defaults.
TerrainHelper exists to unlock old-format vanilla
parallax on the LandscapeDefault record — a legacy mechanism with nothing to do with PBR terrain
at all. AutoSeasons only pulls TerrainHelper.esp in as a plugin master when it's actually patching
a vanilla landscape texture's own parallax/height slot. A PBR landscape texture's native
displacement map never triggers this — so a PBR-only modlist never ends up depending on
TerrainHelper.esp unnecessarily.
AutoSeasons never converts a mesh to PBR or CM itself, and never writes a .nif file — it only
writes the plugin's texture-set references, and (for PBR) the rule files that tell PGPatcher which
meshes to convert and how. The actual conversion always happens in your PGPatcher run, which should
come after AutoSeasons (and after AutoBlend, if you use it) in your workflow, pointed at your full
merged load order including AutoSeasons' own output.