If it is wrong
Symptom to cause, in order of likelihood.
It looks wrong
| Symptom | Cause |
|---|---|
| Everything is flat grey | SpecPanorama is still the 4×4 placeholder, so the reflection is a uniform tint. Assign a real panorama |
| Everything is blown out white | SpecularScalar against an HDR panorama. It defaults to 0.12; go lower before going higher |
| Every surface is a mirror whatever the roughness | the panorama has no mip chain. Set mip generation to anything but NoMipmaps - roughness picks a mip, and the material compiles and renders fine without one, so nothing tells you |
| Everyone is pink | SkinAmount above 0 on a mesh with no vertex paint. Unpainted geometry arrives white, so the mask reads 1 everywhere. Paint red, or leave SkinAmount at 0 |
| Metal everywhere | CRM blue is metallic. A pack with occlusion there needs Metallic at 0 and bUseCRMTexture off, or a repack |
| The whole surface glows | bEmissive is on over an albedo with no alpha channel, which samples as 1 |
| Reflections are too sharp at high roughness | MaxMip is below the panorama's real mip count |
| A visible seam down one side of every reflection | the panorama's X address mode is not Wrap |
| The diffuse has no terminator | the DiffuseFalloff row has no knee in it, or the sun is pointing at the camera. Gradients |
The rim
| Symptom | Cause |
|---|---|
| No rim at all | bFriendFoeRim off, or RimIntensity at 0 |
| Enemies are blue | bEnemy is a static switch, so ally and enemy are two instances. Setting it at runtime does nothing |
| The rim washes the whole body | the rim row's black plateau is too short. Push the first colour stop later |
| The rim is a sub-pixel line | the opposite - the plateau runs too late. Pull it earlier |
| Debug mode 5 shows red over the whole body | correct. Mode 5 is the raw mask before the gradient shapes it |
| The rim reads as a sticker, not as light | RimUpBias and RimHeightBias at 0. They are what make it describe the silhouette instead of outlining it |
Gradients
| Symptom | Cause |
|---|---|
| Edits do nothing | the instance's Atlas points at a different atlas than the one you are editing |
| A row reads as the wrong colour entirely | Atlas is pointing at the Gradient asset instead of its baked T_ texture, or the row scalars do not match your atlas's order |
| A row looks like two rows blended | a Row scalar has a fractional value. They must be whole numbers |
| The rim cannot separate from a white wall | the atlas format is LDR, so the rim clamps at 1.0. Set it to HDR |
Lighting
| Symptom | Cause |
|---|---|
| Rotating the sun changes nothing | expected. Nothing reads a light actor. Fort → Sync Sun From Directional Light |
| The light comes from the wrong side | SunDirection points toward the light, so it is the negated forward vector. Sync Sun handles this |
| Characters ignore the level's lighting entirely | also expected, and the point. Areas are dialled with Indirect, not with lights |
| Characters look pasted onto a dark room | nothing wrote Indirect for that area. It is the one knob that ties a character to where they are standing, and it starts at 1 everywhere |
| A character is a chrome cutout in a dark corner | SpecDarkenExponent is at 1. Raise it |
Build
| Symptom | Cause |
|---|---|
Sampler type is Linear Color, should be Masks | a texture whose compression does not match the sampler type on its parameter. Usually a CRM pack that is not TC_Masks |
| An include cannot be found | the runtime module registers /MobFort at PostConfigInit. If the plugin failed to compile there is no mapping and the error is an undeclared identifier, not a missing file |
| Verify reports a permutation with no shader map | on a cold derived data cache, run it again. If it persists, that permutation is failing to compile - open the master and switch it on by hand to see the error |
| The Fort menu is missing | Editor Preferences → Plugins → Mob Fort Editor → Show Toolbar Menu |
| A hand edit to a master vanished | Rebuild Materials empties and re-authors each graph. Edit author_fort.py or the .ush, not the graph |