Masters
Every parameter, and what it is for.
M_FortCharacter | gradient diffuse, rim, skin, distance response |
M_FortWeapon | weapons and hard-surface props. Smoothstep diffuse, no rim, no skin |
M_FortBase | anything else. The shared responses and nothing else |
Textures
| Parameter | What |
|---|---|
BaseColor | albedo. Its alpha is the emissive mask |
Normal | tangent space |
CRM | Cavity, Roughness, Metallic |
SpecPanorama | equirectangular HDR. Every reflection in the scene |
Atlas | the gradient atlas. One per character if you want |
Three textures plus one shared atlas, which is the budget a character gets.
There is no specular channel - the level is the inverse of roughness. There is no ambient occlusion channel either: cavity is micro shadowing, the crease between two plates, and it multiplies colour and specular rather than acting as occlusion. That way the same texture serves a lit master in the same project without a baked occlusion doubling with the renderer's own.
Features
| Switch | Default | What |
|---|---|---|
bUseCRMTexture | off | read the pack. Off, the three channels come from scalars, which is what a prop with no pack should do |
bSpecularFresnel | on | grazing boost on the reflection. A captured panorama has no painted hot spots and reads flat without it |
bEmissive | off | emissive from the albedo alpha |
bSkin | on | blend the redder skin falloff where the vertex mask says |
bUnderglow | on | the wax term |
bFriendFoeRim | on | the rim light |
bEnemy | off | which rim row this instance reads |
bUseDiffuse | on | off drops the whole diffuse response and its gradient tap |
bUseSpecular | on | off drops the panorama tap and its sampler |
bDebug | off | replaces the shaded result with one intermediate |
bEmissive is off by default because a texture with no alpha samples as 1. Turn it on over an albedo without alpha and the whole surface emits.
Surface
| Parameter | Default | What |
|---|---|---|
Tint | white | multiplies BaseColor. A per-character or per-team colour belongs here, not in the rim |
Cavity | 1 | used when bUseCRMTexture is off. 1 is none |
Roughness | 0.5 | same |
Metallic | 0 | same |
EmissiveIntensity | 1 | scales the alpha mask |
Specular
| Parameter | Default | What |
|---|---|---|
SpecularScalar | 0.12 | overall reflection strength. The panorama is HDR, so this is small |
MaxMip | 8 | the mip a roughness of 1 reads. Roughly where the panorama is a few pixels across |
FresnelBoost | 2 | how hard the grazing boost pushes |
One tap, at a mip chosen from roughness. There are no analytic highlights anywhere in this model, which is why a rough surface costs exactly what a shiny one does.
Rim character only
| Parameter | Default | What |
|---|---|---|
RimIntensity | 1.5 | how bright |
RimUpBias | 0.35 | how much the rim prefers up-facing surfaces |
RimHeightBias | 0.25 | how much it prefers the upper body |
bEnemy | off | which of the two rim rows this instance reads |
Two rim palettes, picked per instance. The names come from the obvious use - ally and enemy - but nothing in the material cares what the distinction means. Faction, hostile and neutral NPCs, a status effect, an interactable versus scenery, or one palette and a second you never enable.
Grazing angle alone puts an even outline all the way round, which competes with the silhouette instead of describing it. The two biases are what make it read as lighting rather than as an overlay: up-facing surfaces catch more because that is what a light from above would do, and the upper body catches more because that is where the eye goes.
Height is measured against the object's own bounds, so it lands the same on a crouching character as a standing one.
Skin character only
| Parameter | Default | What |
|---|---|---|
SkinAmount | 0 | scales the red vertex channel |
UnderglowPower | 2.5 | how tightly the wax term hugs the silhouette |
UnderglowIntensity | 1 | how bright |
SkinAmount starts at 0. An unpainted mesh arrives with white vertex colours, so any other default means every character is fully skin-shaded until someone paints one.
Skin gets a redder falloff row and an underglow with a specular-like grazing response - it comes off the surface, not through it. The underglow strengthens where the direct light is weakest, which is the only place there is anything left to see.
Weapon weapon only
| Parameter | Default | What |
|---|---|---|
ShadowEdge | 0.35 | where the dark side ends |
LightEdge | 0.65 | where the lit side begins |
ShadowColor | dark blue-grey | |
LightColor | white |
Two colours and a soft edge, no gradient. A weapon is mostly shiny metal, so the specular carries it and the extra control a gradient gives has nothing to act on.
Debug
bDebug replaces the shaded result with one intermediate, chosen by DebugMode. The terms that decide whether a character is readable are exactly the ones with no signature in the final image: a rim weighted to the wrong half of the body and a rim weighted correctly both just look like a rim until you put them side by side.
1 diffuse gradient | 5 rim mask | 9 roughness |
2 specular | 6 skin mask | 10 metallic |
3 world normal | 7 underglow | |
4 cavity | 8 distance brighten |