LuluFurAlpha Fur Shader — User Guide
Huge thanks to regguise for the provided tutorial, and to the community for the continuous support. It’s because of this help that I was able to make this work a reality.
Showcase
Beautiful preview model: Mio by dnaddr.
hub.virtamate.com
The showcase is just one example. By swapping out the mask textures and tweaking the parameters, you can create a huge variety of fur effects. I'll leave the exploration up to you. Have fun and good luck! ~
This shader can ONLY be used with my plugins: CustomShaderLoaderAlt or the Custom Shader Loader & Sim Proxy Combo. > Why? Because this shader requires their specific compatibility support for Texture Tiling modes.
hub.virtamate.com
hub.virtamate.com

Alright, if you're still interested, here is the detailed breakdown of the parameters below. Feel free to leave a comment or start a discussion. Good luck!
Table of Contents
1. Overview
LuluFurAlpha is a real-time fur shader based on the Shell Technique, designed specifically for the VaM platform.
Key features:
2. How It Works
The shader uses the Shell Fur technique: multiple "shells" are generated by offsetting vertices outward along their normals. Each shell samples a noise texture; pixels where the noise value is too low are clipped away, creating gaps between strands. The closer a layer is to the tip, the more pixels are clipped, causing strands to naturally taper thinner.
_FurStepBias controls layer distribution: 1 = uniform; greater than 1 = dense root, sparse tips; less than 1 = the opposite.
3. Quick Start
Minimal Setup (basic fur only):
Recommended texture resolutions:
4. Parameter Reference
── 4.1 System Parameters ──
── 4.2 Fur Textures ──
Noise Textures
Coverage Mask
Length Map
Flow Map
── 4.3 Fur Shape ──
── 4.4 Lighting Parameters ──
── 4.5 Anisotropic Specular ──
Simulates the characteristic strand-like highlights of fur/hair using the Kajiya-Kay model with two stacked highlight layers.
── 4.6 Appearance ──
Rim Light
Emission
5. Texture Authoring Tips
Fur Noise Textures
Coverage Mask
Length Map
Flow Map
6. FAQ
Q: Fur doesn't appear or looks wrong in VaM?
A: Make sure _UseStructuredBufferInput is ON. VaM uses a GPU skinning buffer; disabling this causes incorrect vertex positions.
Q: Fur looks too flat / lacks volume?
A: Increase _FurLength, or decrease _FurDensity (makes individual strands more visible). Also check that the noise texture has sufficient contrast.
Q: Fur roots are too dark?
A: Raise _FurShade (e.g. 0.6–0.7), or raise _FurOcclusionPower (e.g. 0.3).
Q: Changing Coverage Mask / Length Map Tiling or Offset has no effect?
A: In the VaM JSON interface, modify the X/Y (Tiling) and Z/W (Offset) values of _FurMask_ST / _FurLengthMap_ST.
Q: Strand tips look too sharp / abrupt?
A: Increase _FurAlphaCurve (1 → 2–3) for a softer alpha fade at the tips.
Q: Anisotropic highlights look like metallic stripes?
A: Increase _AnisoJitter (0.3 → 0.5–0.7), or lower _AnisoExp1/2 to spread the highlight band wider.
Q: Previewing fur in Unity Editor shows unskinned mesh?
A: Disable _UseStructuredBufferInput. The shader then uses standard vertex input for preview.
Demo Video
Huge thanks to regguise for the provided tutorial, and to the community for the continuous support. It’s because of this help that I was able to make this work a reality.
Showcase
Beautiful preview model: Mio by dnaddr.
Mio - Paid Looks -
Thanks to the excellent plugin authors and clothing authors for their works: https://hub.virtamate.com/resources/postmagic.161/
The showcase is just one example. By swapping out the mask textures and tweaking the parameters, you can create a huge variety of fur effects. I'll leave the exploration up to you. Have fun and good luck! ~
Important Requirement:
This shader can ONLY be used with my plugins: CustomShaderLoaderAlt or the Custom Shader Loader & Sim Proxy Combo. > Why? Because this shader requires their specific compatibility support for Texture Tiling modes.Custom Shder Loader And Cloth Sim Proxy Combine - Plugins + Scripts -
-- Content: - Integrated Custom Shader Loader with Cloth Sim Proxy, and resolved the compatibility issues. -- Description: -An edit to the original Custom Shder Loader by @regguise and Cloth Sim Proxy by @Stopper。 -Ensures that Custom...
CustomShaderLoaderAlt - Plugins + Scripts -
CustomShaderLoaderAlt Improvements over Regguise/CustomShaderLoader v1.72 ✦ How To Use Please load the CustomShaderLoaderAlt.cslist file to activate the plugin. For detailed examples, please check out the demo video at the end of this post. ✦...
Known Issues:
- Anisotropic Highlights: Backlighting can be blocked by the body mesh, which affects the anisotropic highlight effect.
- Cast Shadows: Shadows cast by the fur might render incorrectly if the fur density is set too sparse.
Alright, if you're still interested, here is the detailed breakdown of the parameters below. Feel free to leave a comment or start a discussion. Good luck!
Table of Contents
- Overview
- How It Works
- Quick Start
- Parameter Reference (System / Fur Textures / Fur Shape / Lighting / Anisotropic Specular / Appearance)
- Texture Authoring Tips
- FAQ
1. Overview
LuluFurAlpha is a real-time fur shader based on the Shell Technique, designed specifically for the VaM platform.
Key features:
- 12 fur shell layers + 1 skin base layer (25 rendering Passes total)
- VaM GPU Skinning support (StructuredBuffer path)
- IBL ambient lighting (integrated with VaM's lighting system)
- Kajiya-Kay dual-layer anisotropic specular (mimics fiber-like reflections)
- Flow Map for per-pixel fur growth direction
- Coverage Mask + Length Map for fine-grained fur distribution control
- Emission and rim light support
2. How It Works
The shader uses the Shell Fur technique: multiple "shells" are generated by offsetting vertices outward along their normals. Each shell samples a noise texture; pixels where the noise value is too low are clipped away, creating gaps between strands. The closer a layer is to the tip, the more pixels are clipped, causing strands to naturally taper thinner.
- Skin base layer: Rendered opaque, writes to the depth buffer, blocks objects behind it
- Fur layers 1–12: Semi-transparent, stacked outward, alpha clipping forms the strand silhouette
- Shadow layer: Projects a shadow based on the outermost shell silhouette
_FurStepBias controls layer distribution: 1 = uniform; greater than 1 = dense root, sparse tips; less than 1 = the opposite.
3. Quick Start
Minimal Setup (basic fur only):
- Set the material Shader to VaM/Custom/LuluFurAlpha
- Assign Main Texture (skin / base fur color)
- Assign Alpha Texture (skin silhouette mask; black = transparent)
- Assign Fur Noise 1 (fur noise texture; fine white noise or fiber texture recommended)
- Adjust Fur Length (0.005–0.02 works well for short fur)
- Adjust Fur Density (1.5–2.5 for typical density)
Recommended texture resolutions:
- Noise Textures 1/2: 512×512 – 1024×1024 (no high-frequency detail needed; can be reused)
- Coverage Mask: 1024×1024 (align with skin UV)
- Length Map: 512×512 – 1024×1024 (grayscale sufficient)
- Flow Map: 512×512 (RG channels encode direction)
4. Parameter Reference
── 4.1 System Parameters ──
- _UseStructuredBufferInput (default: On)
Must be ON in VaM. Uses VaM GPU skinning buffer. Turn OFF only for Unity Editor preview. - _FurIBLEnable (default: On)
Enable Marmoset IBL ambient lighting. OFF falls back to Unity standard SH.
── 4.2 Fur Textures ──
Noise Textures
- _FurTex: Fur noise texture 1. R channel drives fur alpha; G channel used for anisotropic jitter.
- _FurTex1Scale (0.1–20, default 4.0): UV tiling for noise 1. Higher = finer/denser strands.
- _FurTex2: Fur noise texture 2. Blended 50/50 with texture 1 to break up tiling repetition.
- _FurTex2Scale (0.1–20, default 4.0): UV tiling for noise 2.
Coverage Mask
- _FurMask: Coverage mask (R channel). White = fur present, Black = no fur.
- _FurMask_ST (XY=Tiling, ZW=Offset, default 1,1,0,0): UV transform for the coverage mask.
Length Map
- _FurLengthMap: Length control map (R channel). White = long, Black = short.
- _FurLengthMap_ST (XY=Tiling, ZW=Offset, default 1,1,0,0): UV transform for the length map.
- _FurLengthScale (0–10): Length map influence strength. Higher = black areas become much shorter.
Flow Map
- _FlowMap: Fur growth direction map (RG channels; neutral gray = no lean).
- _FlowMapScale (0.1–40): UV tiling for the flow map.
- _FlowStrength (0–2): Flow map influence. 0 = use only CombDir; 2 = fully map-driven.
── 4.3 Fur Shape ──
- _FurLength (0–0.1, default 0.005): Maximum fur extrusion length (world units). Short fur: 0.003–0.008; long fur: 0.02–0.05.
- _FurDensity (0–4, default 2.0): Fur density. Higher = thinner/sparser strands.
- _FurLengthScale (0–10, default 5.0): Length map influence strength.
- _FurAlphaCurve (0–8, default 1.0): Strand tip taper. 0 = flat; 1 = linear taper; greater than 1 = sharper tips.
- _FurStepBias (0.1–3, default 1.0): Layer spacing. 1 = uniform; greater than 1 = dense root.
- _FurTiming (0–1, default 1.0): Global fur opacity multiplier. 0 = invisible, 1 = fully visible.
- _FurCombDir (XY): Global comb direction (tangent space). X = along tangent, Y = along bitangent.
── 4.4 Lighting Parameters ──
- _FurOcclusionPower (0.001–1, default 0.1): Root self-occlusion depth. Smaller = darker roots; larger = less contrast between layers.
- _FurShade (0–1, default 0.5): Root brightness floor. Prevents roots from going completely black.
- _LightFilter (-0.5–0.5, default 0): Diffuse light wrap. Positive = shadow side receives more light; negative = harder boundary.
- _AttenPower (0.1–5, default 1.0): Shadow hardness. Greater than 1 = harder/darker.
- _ShadowIntensity (0–2, default 1.0): Shadow intensity. 0 = no shadows; 2 = ambient also shadowed.
── 4.5 Anisotropic Specular ──
Simulates the characteristic strand-like highlights of fur/hair using the Kajiya-Kay model with two stacked highlight layers.
- _AnisoUseBitangent (default: On): On = horizontal highlights (bitangent); Off = vertical highlights (tangent).
- _AnisoIntensity (0–5, default 0): Overall specular intensity. 0 = disabled.
- _AnisoColor1: Layer 1 highlight color (typically the primary reflection color).
- _AnisoColor2: Layer 2 highlight color (can be tinted to simulate secondary reflection).
- _AnisoShift1 (-1–1, default -0.1): Layer 1 tangent shift.
- _AnisoShift2 (-1–1, default 0.1): Layer 2 tangent shift (opposite sign to layer 1 creates two separated bands).
- _AnisoExp1 (1–128, default 32): Layer 1 sharpness exponent. Higher = tighter highlight.
- _AnisoExp2 (1–128, default 64): Layer 2 sharpness exponent.
- _AnisoJitter (0–1, default 0.3): Direction jitter. Breaks the highlight band into individual fiber glints.
── 4.6 Appearance ──
Rim Light
- _RimColor: Rim light color.
- _RimIntensity (0–5, default 0): Rim light intensity. 0 = disabled.
- _RimWidth (0.1–8, default 2.0): Rim light sharpness. Higher = narrower edge line.
Emission
- _MKGlowColor (A channel = intensity): Emission color. A=0 means no emission.
- _EmissionMask (Texture, R channel): Emission mask. White = full emission, black = no emission.
5. Texture Authoring Tips
Fur Noise Textures
- Recommended tools: Substance Designer (cellular/Gaussian noise layers), Photoshop Fiber filter
- R channel: white areas = strand presence; value = density weight
- G channel: used for anisotropic jitter (can differ from R)
- Textures must be seamlessly tileable to avoid visible seams
- Aim for moderate contrast (avoid extreme all-white or all-black dominance)
Coverage Mask
- Grayscale (only R channel is sampled)
- White = full fur density; dark gray = sparse transition; black = no fur
- Use soft edges at skin boundaries (5–10 px feather) for natural transitions
Length Map
- Grayscale (R channel); White = long, Black = short (note: opposite of what you might expect)
- Use cases: fur whorls (short center, long edges), natural growth patterns (long back, short belly)
Flow Map
- RG channels: neutral gray = no direction lean; R = left/right lean, G = forward/backward lean
- Create using Blender, Substance Painter, or a dedicated Flow Map Painter tool
6. FAQ
Q: Fur doesn't appear or looks wrong in VaM?
A: Make sure _UseStructuredBufferInput is ON. VaM uses a GPU skinning buffer; disabling this causes incorrect vertex positions.
Q: Fur looks too flat / lacks volume?
A: Increase _FurLength, or decrease _FurDensity (makes individual strands more visible). Also check that the noise texture has sufficient contrast.
Q: Fur roots are too dark?
A: Raise _FurShade (e.g. 0.6–0.7), or raise _FurOcclusionPower (e.g. 0.3).
Q: Changing Coverage Mask / Length Map Tiling or Offset has no effect?
A: In the VaM JSON interface, modify the X/Y (Tiling) and Z/W (Offset) values of _FurMask_ST / _FurLengthMap_ST.
Q: Strand tips look too sharp / abrupt?
A: Increase _FurAlphaCurve (1 → 2–3) for a softer alpha fade at the tips.
Q: Anisotropic highlights look like metallic stripes?
A: Increase _AnisoJitter (0.3 → 0.5–0.7), or lower _AnisoExp1/2 to spread the highlight band wider.
Q: Previewing fur in Unity Editor shows unskinned mesh?
A: Disable _UseStructuredBufferInput. The shader then uses standard vertex input for preview.
Demo Video