Skip to content
Cl3mus33 edited this page Aug 20, 2026 · 2 revisions

PBR and Complex Material (CM) 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 vs. CM: what AutoSeasons does differently for each

  • PBR needs an explicit rule (a PBRNIFPatcher/*.json file) 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/_em environment-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/_em file using the normal naming convention (same as a _n normal 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.

How PBR detection works

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.

What AutoSeasons generates

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.

Slot fallback

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.

DefaultPBRLand

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 and vanilla parallax — not a PBR feature

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.

Summary

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.

Clone this wiki locally