1. What it does
On a single skin, clothing item, or CustomUnityAsset, Custom Shader Loader Alt lets you run several different custom shaders at the same time. Each shader slot drives only the materials you assign to it.
2. Quick start
3. Key features
4. Writing a shader property JSON
The properties file is a flat JSON array. Each entry is one UI element, processed top to bottom. Every entry has name (the shader property), displayName (the UI label), type, and an optional tooltip.
Control types (every type also accepts an optional tooltip):
Tip: name the JSON the same as your .assetbundle and drop it beside the bundle. It loads automatically when you pick the bundle.
Note: all types above work on Slot 0. On extra shader slots, position and time are not shown, and color_rgba, button and label have limited support for their default value, styling, or action.
Credits and acknowledgements
On a single skin, clothing item, or CustomUnityAsset, Custom Shader Loader Alt lets you run several different custom shaders at the same time. Each shader slot drives only the materials you assign to it.
2. Quick start
- Add the plugin to a Person, a clothing item, or a CUA atom.
- Create and select a shader slot. Slot 0 is ready by default; use "+ Add Shader Slot" for more, then pick the active slot.
- Load the slot's shader and properties. Load Shader Bundle, Select Shader, then Load Shader Properties for its JSON (a same-named JSON auto-loads).
- Pick the target. Choose the skin, a clothing item, or the CUA whose materials you want to shade.
- Assign each material slot. On every material, use the dropdown to pick which shader slot drives it. Repeat steps 2 to 5 to mix more shaders.
3. Key features
- Multi-shader slots. Run different shaders on different materials at the same time.
- Works everywhere. Person skin, clothing (DAZSkinWrap), and CustomUnityAsset, with a dedicated mode for each.
- JSON-driven UI. Tabs, section headers, and 15+ control types built straight from a plain JSON file (see section 4).
- Per-material assignment. A dropdown on every material picks which slot it belongs to.
- Presets. Save and load a slot's full property set, with a thumbnail.
- Tooltips. Hover help on every control, with a global Show Tooltips toggle.
- VaM-ready. Supports StructuredBuffer skinning (no T-pose) and VaM SH / IBL lighting when the shader template implements them.
4. Writing a shader property JSON
The properties file is a flat JSON array. Each entry is one UI element, processed top to bottom. Every entry has name (the shader property), displayName (the UI label), type, and an optional tooltip.
JSON:
[
{ "name": "", "displayName": "Base", "type": "tab", "tabWidth": 110 },
{ "name": "", "displayName": "Surface", "type": "label",
"defaultColor": "#0d1117", "textColor": "#58a6ff", "height": 42, "fontSize": 26 },
{ "name": "note", "displayName": "Notes", "type": "info",
"infoText": "Multi-line read-only help shown in the panel.", "height": 80 },
{ "name": "_Color", "displayName": "Tint", "type": "color", "defaultColor": "white",
"tooltip": "Any control can carry a tooltip. Shown on hover." },
{ "name": "_RimColor", "displayName": "Rim (RGBA)", "type": "color_rgba", "defaultColor": "#80c0ffcc" },
{ "name": "_Glossiness", "displayName": "Smoothness", "type": "float", "defaultValue": 0.5, "minValue": 0, "maxValue": 1,
"tooltip": "Higher = sharper highlights" },
{ "name": "_Metallic", "displayName": "Metallic", "type": "range", "defaultValue": 0, "minValue": 0, "maxValue": 1,
"tooltip": "0 = dielectric, 1 = metal" },
{ "name": "_MainTex", "displayName": "Albedo", "type": "texture", "defaultUrl": "", "wrapMode": "Repeat",
"tooltip": "Base color texture" },
{ "name": "_Cube", "displayName": "Reflection", "type": "cubemap", "defaultAssetName": "" },
{ "name": "", "type": "separator", "thickness": 4 },
{ "name": "_Tiling", "displayName": "UV Tiling", "type": "vector",
"defaultVector": { "x": 1, "y": 1, "z": 0 },
"minVector": { "x": 0, "y": 0, "z": 0 },
"maxVector": { "x": 8, "y": 8, "z": 1 } },
{ "name": "_DetailST", "displayName": "Detail ST", "type": "vector4",
"defaultVector4": { "x": 1, "y": 1, "z": 0, "w": 0 },
"minVector4": { "x": 0, "y": 0, "z": 0, "w": 0 },
"maxVector4": { "x": 8, "y": 8, "z": 1, "w": 1 } },
{ "name": "", "displayName": "Effects", "type": "tab", "tabWidth": 110 },
{ "name": "", "displayName": "Toggles and enums", "type": "label",
"defaultColor": "#0d1117", "textColor": "#f0883e", "height": 42, "fontSize": 26 },
{ "name": "_UseEmission", "displayName": "Emission", "type": "toggle",
"defaultValueBool": false, "keyword": "_EMISSION_ON",
"tooltip": "Toggles the _EMISSION_ON shader keyword" },
{ "name": "_CullMode", "displayName": "Cull", "type": "tristate",
"defaultValue": 0, "stateCount": 3, "stateNames": { "0": "Both", "1": "Front", "2": "Back" },
"tooltip": "0 both sides, 1 cull front, 2 cull back" },
{ "name": "_Angle", "displayName": "Rotation", "type": "angle", "defaultValue": 45, "minValue": 0, "maxValue": 360 },
{ "name": "_Steps", "displayName": "Steps", "type": "int", "defaultValue": 2, "minValue": 0, "maxValue": 10, "stepValue": 1 },
{ "name": "_Distance", "displayName": "Distance", "type": "float_input", "defaultValue": 12.5, "minValue": 0, "maxValue": 1000 },
{ "name": "", "displayName": "Animation and tracking", "type": "label",
"defaultColor": "#0d1117", "textColor": "#3fb950", "height": 42, "fontSize": 26 },
{ "name": "_CustomTime", "displayName": "Time anim", "type": "time" },
{ "name": "_TargetPos", "displayName": "Bone tracker", "type": "position" },
{ "name": "doReset", "displayName": "", "type": "button",
"text": "Reset All", "buttonColor": "#aa3333", "action": "ResetProperties" },
{ "name": "legacy", "displayName": "", "type": "column" }
]
| Type | Purpose | Key fields |
tab | New category tab | tabWidth |
label | Section header | defaultColor (bg), textColor, height, fontSize |
info | Multi-line read-only text | infoText, height |
separator | Horizontal divider | thickness |
float / range | Slider | defaultValue, minValue, maxValue |
int | Stepped integer spinner | + stepValue |
float_input | Precise value box (no slider) | defaultValue, min/maxValue |
angle | 0 to 360 degree dial | defaultValue, min/maxValue |
tristate | Cycling N-state button | stateCount, stateNames |
color | HSV picker (no alpha) | defaultColor (white or #hex) |
color_rgba | HSV picker + alpha slider | defaultColor (#RRGGBBAA) or defaultAlpha |
texture | Texture browser | defaultUrl, wrapMode (Repeat/Mirror/Clamp) |
cubemap | Cubemap from the bundle | defaultAssetName |
vector / vector4 | 3- / 4-component sliders | defaultVector{x,y,z(,w)} plus min/maxVector |
toggle | Bool, optional shader keyword | defaultValueBool, keyword |
button | Stateless action button | text, buttonColor, action |
position | Live bone position/rotation tracker | (none) |
time | Auto time animation (writes _CustomTime) | (none) |
column | Deprecated. Kept for old JSON, now a no-op. | (none) |
Note: all types above work on Slot 0. On extra shader slots, position and time are not shown, and color_rgba, button and label have limited support for their default value, styling, or action.
Credits and acknowledgements