Mod Loader/Reference/Fabric fields
A fabric pack is a folder with a mod.json and the images it uses. The Mod Loader adds each entry as a new fabric; it does not replace the fabric it uses as a starting point.
For most recolors, use Make fabrics in Mod Manager. The in-game editor can copy a fabric's material, keep or replace its image, and adjust tint, pattern size, and gloss. The Advanced editor exposes the shader properties listed below.
Pack manifest
This example includes the supported pack and fabric fields. Optional material properties can be left out.
{
"id": "yourname.fabricpack",
"name": "My Fabric Pack",
"author": "Your name",
"version": "1.0.0",
"icon": "pack-icon.png",
"fabricTypes": [{ "id": "Leather", "name": "Leather" }],
"fabricTags": [{ "id": "Leather", "name": "Leather" }],
"fabrics": [{
"id": "sage-weave",
"name": "Sage Weave",
"baseFabric": "Cotton Black",
"fabricType": "Linen",
"colors": ["Green"],
"texture": "sage-weave.png",
"material": {
"shader": "$defaultFabricShader",
"color": "#FFFFFFFF",
"mainTextureScale": [1, 1],
"mainTextureOffset": [0, 0],
"renderQueue": 2000,
"keywords": [],
"floats": { "_Smoothness": 0.28 },
"ints": {},
"colors": { "_SpecularColor": "#A8B8A7FF" },
"vectors": {},
"textures": {},
"textureScales": {},
"textureOffsets": {}
},
"cost": 18,
"unlockLevel": 0,
"tagWeights": [{ "tag": "Casual", "weight": 70 }],
"notes": "Optional internal note"
}]
}
Here baseFabric supplies the material and lets the pack omit the shader. The texture is optional when a base is set; without one, the base fabric's image is kept. To build a fabric from scratch, leave out baseFabric and provide the required material, type, colors, cost, and tag weights.
Pack fields
| Field | Meaning and rules |
|---|---|
id
|
Required pack namespace. Use 1–64 letters, digits, dots, underscores, or hyphens. Keep it stable after release; it forms part of saved fabric IDs. |
name
|
Name shown in Mod Manager. Defaults to the pack ID. |
author
|
Optional for older packs; 1–80 characters. Shown with the pack. |
version
|
Optional for older packs. Use a version such as 1.0.0 or 1.1.0-beta; increase it for an update while keeping IDs unchanged.
|
icon
|
Optional PNG or JPEG beside mod.json. Maximum 4 MB and 2048 × 2048 pixels.
|
fabrics
|
Array of fabrics. Each fabric ID must be unique within the pack. |
fabricTypes, fabricTags
|
Optional arrays of {"id":"Leather","name":"Leather"} entries. These add filter choices without editing game files. Runtime IDs are <modId>.<id>. Keep IDs stable; a fabric may refer to an ID from its own pack or another loaded pack.
|
Fabric fields
| Field | Meaning and rules |
|---|---|
id
|
Required stable key, local to the pack. Uses the same character rules as the pack ID. The loader uses it in the fabric name and save GUID; do not change it after release. |
name
|
Required non-empty display name. |
baseFabric
|
Optional internal ID of a native fabric or a custom fabric loaded earlier. Custom IDs use <modId>.<fabricId>. The base must have a material. Its shader, tint, detail textures, and other material settings are copied, while this entry's texture, name, type, color categories, and cost are retained.
|
fabricType
|
Main category. Use one of the built-in values below or a custom type ID. Required when baseFabric is omitted.
|
colors
|
Array of color categories below. Required without baseFabric.
|
texture
|
Relative path to a PNG or JPEG in the pack folder. Optional with baseFabric; omitting it keeps the base fabric's image.
|
material
|
Shader and rendering settings. shader is required without baseFabric; other properties may be omitted.
|
cost
|
Required integer shop price without baseFabric; range 0–2,149,633.
|
unlockLevel
|
Prestige level to unlock the fabric. Range 0–50; defaults to 0. |
tagWeights
|
Array of {"tag":"Casual","weight":70}. Use built-in or custom tag IDs. Required without baseFabric; duplicate tags are invalid. Weights must be finite numbers, and only positive weights count for HasTag.
|
notes
|
Optional internal note copied to the fabric asset. It is not the display name. |
The loader assigns an internal GUID. Native fabrics may use unlock levels from −1 to 51 and tag weights from −25 to 2525; those are native data ranges, not custom pack limits.
Built-in categories
Fabric type: Burlap, Cotton, Lace, Linen, Sequin, Silk, Velvet, Wool. Define another value in fabricTypes when your pack needs a category such as Leather.
Colors: Blue, Green, Pink, Purple, Red, Yellow, Orange, Black, White, Grey, Brown.
Tags: Casual, Cool, Cute, Daywear, Eclectic, Elaborate, Elegant, Eveningwear, Flowers, Formal, Glamour, Goth, Patterned, Playful, Professional, Risque, Romantic, Shimmering, Simple, Uncomfortable, Warm, Workwear. Add pack-specific choices through fabricTags.
Mods load in alphabetical folder order. Fabrics in a pack load in the order of the fabrics array, so a custom base must be defined by a pack that loads first. Each custom fabric automatically receives the Modded tag at weight 1; native fabrics keep their original tags. Fabric type does not choose a shader.
Material fields
| Field | Value |
|---|---|
shader
|
Exact name of a loaded shader, or $defaultFabricShader for the game's MannequinFabric shader. New materials start with that shader's defaults.
|
color
|
Overall tint as #RRGGBB, #RRGGBBAA, or an object with numeric r, g, b, and optional a.
|
mainTextureScale, mainTextureOffset
|
Two finite numbers, [x, y], for repeat and offset of the main image.
|
renderQueue
|
Integer from −1 to 5000. |
keywords
|
Array of shader keyword strings. A keyword only works when the shader implements it. |
floats
|
Map of shader property names to finite numbers. Supports Float and Range properties. |
ints
|
Map of property names to integers. Supports Int, Float, and Range properties. |
colors
|
Map of property names to hex colours or numeric colour objects. |
vectors
|
Map of property names to four finite numbers. |
textures
|
Map of texture property names to PNG or JPEG paths inside the pack. The fabric's texture field supplies the main texture.
|
textureScales, textureOffsets
|
Maps of texture property names to two finite numbers. |
The loader checks property types against the selected shader. It does not clamp values to Unity Range limits. The ints and vectors maps are supported even though the game's default fabric shader exposes neither type.
Numeric colours and HDR
Use a colour object when you need exact component values or HDR brightness. RGB components are required; alpha defaults to 1 when omitted. Values must be finite numbers and are passed to the shader without clamping or colour-space conversion. For example, this keeps the blue specular component at 2.118:
"material": {
"colors": {
"_Color": { "r": 0.037, "g": 0.14, "b": 0.645, "a": 1 },
"_SpecularColor": { "r": 0.0776, "g": 0.871, "b": 2.118 },
"_EmissionColor": "#000000"
}
}
The same object format works in material.color and in accessory materials. Hex strings still work, and both formats can be used in the same map. Only include properties exposed by the item's shader; copying every property from a material dump can include unused properties which the loader rejects.
Properties on the game's fabric shader
These names belong to MannequinFabric. Put number settings in material.floats, colors in material.colors, and image paths in material.textures. Start with baseFabric to keep the maps and finish of a fabric you like, then change the properties you need.
A range below is the slider range declared by the shader. JSON values are not clamped to it. In the in-game editor, a fixed-range slider brings typed values back into that range.
Tint and finish
| Property | Value | Use |
|---|---|---|
_Color
|
Hex color | Tints the fabric and its image. White (#FFFFFFFF) leaves the image's colors untinted. You can also set this with material.color.
|
_Smoothness
|
Number, 0 to 1 | Move toward 0 for a matte finish and toward 1 for a glossy one. |
_ReflectionStrength
|
Number, 0 to 1 | Controls how strongly the room reflects on the fabric. |
_SpecularColor
|
Hex color | Colors the bright highlights. For example, a pale gold gives the highlights a warmer color. |
_SpecularTint
|
Number, 0 to 1 | Controls the amount of tint in the highlights. |
_SpecularLightStrength
|
Number | Brightness of the light spots on the fabric. |
_SpecularLightStrengthMax
|
Number | Upper limit for the highlight strength. |
_ExtraSpecularTightness
|
Number | Controls how concentrated the extra highlights are. Compare it under the same lighting when changing it. |
_EmissionColor
|
Hex color | Emission color. Keep black (#000000FF) for an ordinary non-glowing fabric.
|
Texture maps and weave
| Property | Value | Use |
|---|---|---|
_Albedo
|
Image | The main print. Set it with the fabric's texture field.
|
_Detail
|
Image | A finer image layered into the fabric's surface detail. Copying a cotton material keeps its weave image. |
_Normal
|
Normal-map image | Makes the surface look raised or indented under light without changing the garment mesh. |
_NormalStrength
|
Number, 0 to 1 | Strength of the main normal map. Changing this needs a map in _Normal.
|
_DetailNormal
|
Normal-map image | Fine raised-looking detail, such as a cloth weave. |
_DetailNormalStrength
|
Number, 0 to 1 | Strength of the fine detail. Zero hides this normal-map effect. |
_AmbientOcclusion
|
Image | A map used to darken recessed parts of the surface. |
_OcclusionStrength
|
Number, 0 to 1 | Amount of darkening from the ambient-occlusion map. |
A normal map describes surface direction; a photograph of a weave is not a normal map. If you are only replacing the print, keep the normal and detail maps from your base fabric.
Sheen and lighting
| Property | Value | Use |
|---|---|---|
_WrapValue
|
Number, 0 to 1 | Controls how far light wraps around the curved surface. |
_FresPower
|
Number, 0.0001 to 16 | Controls how the edge sheen changes with the viewing angle. Rotate the mannequin to compare changes. |
_FresnelBrightness
|
Number | Brightness of the sheen seen at glancing angles. |
_IndirectStrength
|
Number, 0 to 1 | Strength of indirect lighting on the fabric. |
_BackFaceBrightness
|
Number | Brightness of the fabric's reverse side. |
_Anisotropic
|
Number | Directional sheen, where highlights change with the weave direction. Start by copying a fabric that already has the sheen you want. |
_AnisoAngle
|
Number | Turns the directional sheen. In the editor this is called Weave highlight angle. |
_ReceiveShadows
|
Number | Whether the material receives shadows. Copied game fabrics use 1. |
Other shader properties
The effects of _AlphaGloss, _BackfaceBias, _DiffuseReducesSpecular, and _AnisoDrift have not been verified. They are number properties and can be copied from a base fabric. Leave them out of your overrides when adjusting an ordinary finish.
_QueueOffset and _QueueControl are number properties used for rendering order. For an ordinary fabric, leave them copied and keep material.renderQueue at its default. The _texcoord, _texcoord2, unity_Lightmaps, unity_LightmapsInd, and unity_ShadowMasks texture slots are managed by the shader or Unity; you do not need to supply images for them.
Game materials use the keywords _ALPHAGLOSS_ON, _ANISOTROPIC_ON, and _DIFFUSEREDUCESSPECULAR_ON. Copy the base material's keywords unless you are changing one of those features. A keyword only works with a shader that implements it.
Check changes on a dress as well as the shop bolt. Some garment screens copy only part of the fabric material. A custom shader can have different property names; use the names declared by that shader.
Reference files and examples
BepInEx/config/DressmakerMods/fabric-reference.jsonis generated when the plugin starts. It contains native fabric IDs, material values, tags, and keywords. It is written before custom packs load, so it lists native fabrics only.- The Textile Field Guide ZIP has working material examples.
For a quick recolor, open Make fabrics, add a fabric, and choose a native fabric under Mimic material properties of. Leaving the texture empty uses its image. The editor's basic controls set tint, pattern size, and gloss; Advanced edits the same material values shown above.