Primitive Tab
The Primitive tab is where you generate dense hair strands from your sparse guides. This is where guides (50β500 curves) become realistic hair (10,000β100,000+ strands). Every parameter in this tab supports texture painting and/or FollicleScript expressions for per-area control.
What is Primitive Generation?
Primitive generation fills in thousands of strands between your guides through interpolation. Each strand follows nearby guides, creating dense, realistic hair.
Think of it as: Guides are the skeleton, Primitive fills in the muscle and skin.
Texture Controls: Most parameters in the Primitive tab have four control buttons beside them: ποΈ Paint (paint a texture map directly on the mesh), πΎ Save (save the map to disk), π Load (load a previously saved map), and Ζ (open the expression editor). These let you control any parameter spatially across the surface.
Density Panel
The Density panel controls how many strands are generated and where they are placed.
Density
Base number of strands per unit area on the mesh surface.
- Range: 1.0 β 100,000.0
- Default: 100.0
What it does: Sets the overall strand count. Higher values = more strands = denser, more realistic hair. The actual number of strands generated is proportional to the mesh surface area multiplied by this value.
When to adjust:
- Preview / testing: 100β1,000
- Medium quality: 5,000β20,000
- Production: 20,000β50,000
- Hero close-up shots: 50,000β100,000+
Texture support: Yes β paint a density map to control strand density per-area. White = full density, black = no hair, gray = partial density.
Expression support: Yes β for example, v * 2.0 gives more density at top (v=1.0), less at bottom (v=0.0).
Performance tip: Start with low density (1,000β5,000) while styling. Only increase for final renders. Density is the single biggest factor in viewport speed.
Multiplier
Global scale factor that multiplies the base density value.
- Range: 0.0 β 100.0
- Default: 1.0
What it does: A quick way to scale strand count up or down without changing the base Density. Useful for fast toggling between preview and production quality.
How it works:
- 0.5 = half density (faster preview)
- 1.0 = normal density
- 2.0 = double density (more coverage)
Example: Base Density 10,000 Γ Multiplier 0.5 = 5,000 total strands.
Use Density Map
Enable texture-based spatial density control.
- Default: Off
What it does: When enabled, a painted or loaded grayscale texture controls where strands are generated:
- White = full density
- Black = no hair
- Gray = proportionally reduced density
When to use:
- Hairlines (natural fade from full hair to bare skin)
- Thinning areas and bald spots
- Patterns, stripes, or stylized designs
- Restricting hair to specific regions of a mesh
Workflow:
- Click ποΈ (paint) beside the Density slider
- Paint white where you want hair, black where you don't
- Click πΎ to save the map
- Enable the "Use Density Map" checkbox
- Click "Generate Hair"
Auto-enable: When you save a density map, FollicleFX automatically enables the "Use Density Map" checkbox for you.
Strand Shape Panel
The Strand Shape panel controls how strands are generated and interpolated from guides.
CV Count
Control vertices (points) per generated strand.
- Range: 0 β 200
- Default: 0
What it does:
- 0 = inherit point count from guides (recommended). If your guides have 8 control points, strands will also have 8 points.
- Higher values = more points per strand = smoother curves but slower to render and process.
When to adjust:
- Usually leave at 0 (inherits from guides, which is the safest default)
- Increase to 12β16 if strands look jagged or angular, especially with low guide control point counts
- Use higher values (32β64) for very long, flowing hair that needs smooth curves
Performance: More CVs = proportionally more memory and slower rendering. The cost is per-strand, so with 50,000 strands the difference between 8 and 32 CVs is significant.
Radius
Interpolation radius β how far each strand looks for nearby guides to blend from.
- Range: 0.001 β 2.0
- Default: 0.15
What it does: Controls the "influence zone" around each guide. Strands within this radius of a guide will be influenced by it. When a strand is between multiple guides, it blends their shapes based on distance.
When to adjust:
- Large radius (0.2β0.5): Smooth, blended transitions between guides. Good for flowing, uniform hair.
- Medium radius (0.1β0.2): Natural variation. Good default for most hair types.
- Small radius (0.01β0.1): Sharp transitions, strands follow their nearest guide very closely. Good for distinct clumps or separated sections.
Visual effect: Think of each guide as a "magnet" β Radius controls how far the magnetic field extends. Larger = more blending, smaller = more distinct guide influence.
Texture support: Yes
Expression support: Yes
Variation
Random variation in strand interpolation.
- Range: 0.0 β 1.0
- Default: 0.5
What it does: Adds randomness to how strands follow guides. At 0.0, strands perfectly follow their nearest guide pattern. Higher values introduce organic scatter that breaks up uniformity.
When to use:
- 0.0: Perfect interpolation (stylized, technical, doll-like hair)
- 0.3β0.5: Natural variation (realistic hair)
- 0.6β0.8: High variation (casual, windblown hair)
- 0.9β1.0: Maximum variation (wild, messy hair)
Texture support: Yes β paint areas with more or less variation
Expression support: Yes
Length Panel
The Length panel controls how long the generated strands are, relative to the guide length.
Length
Strand length multiplier β scales the length of all strands relative to their guide curves.
- Range: 0.0 β 2.0
- Default: 1.0
What it does:
- 1.0 = strands are the same length as guides (100%)
- 0.5 = strands are half the guide length (50%)
- 2.0 = strands are double the guide length (200%)
Texture support: Yes β paint a length map to control length per-area. White = full length, black = zero length (shaved), gray = partial length. This is the primary way to create custom haircuts, fades, and length transitions.
Expression support: Yes
Example expressions:
rand3(0.8, 1.2, index)
Each strand randomly 80β120% of guide length β subtle natural variation.
lerp(0.8, 1.0, v)
Shorter at bottom (v=0), full length at top (v=1) β UV-based gradient.
Length map painting: Click ποΈ beside the Length slider to paint a length map directly on the mesh:
- White = full length
- Black = zero length (shaved/cut)
- Gray = proportional length
Note: Length variation is now controlled entirely through texture painting and expressions. The old random Length Variation slider has been removed in favor of these more precise methods.
Width Panel
The Width panel controls strand thickness using a simplified, expression-first workflow.
Width
Strand width in world-space units. Supports inline expressions β you can type an expression directly into the slider field.
- Range: 0.000001 β 0.5
- Default: 0.01
What it does: Sets the root width of each strand. The tip width is automatically calculated as 20% of the root width, giving a natural taper by default. The Taper panel (below) provides additional control over how width transitions from root to tip.
Typical values:
- Very fine hair: 0.0003β0.0005
- Normal human hair: 0.0005β0.001
- Thick/coarse hair: 0.001β0.003
- Fur: 0.003β0.01
- Stylized thick strands: 0.01β0.05
Inline Expression Support
The Width field accepts FollicleScript expressions typed directly into the slider. This is the recommended way to add width variation β it replaces the old Width Variation, Min/Max Width, and Width Seed sliders with a single, more powerful control.
Example expressions:
rand(0.005, 0.015)
Each strand gets a random width between 0.005 and 0.015 β natural per-strand variation.
lerp(0.001, 0.0003, v)
Thicker at bottom (v=0), thinner at top (v=1) β UV-based gradient.
0.0005 * (1.0 + rand(index) * 0.5)
Base width of 0.0005 with up to 50% random variation per strand.
Simplified from previous versions: The old Tip Width, Width Variation, Min/Max Width, and Width Seed sliders have been removed. Width is now a single value (or expression) that sets the root width. Tip width is auto-calculated from root width, and the Taper panel controls the transition shape. Use inline expressions for per-strand variation.
Taper Panel
The Taper panel controls how strand width transitions from root (thick) to tip (thin). This is critical for realistic hair β real hair strands taper naturally along their length.
Amount
How much taper (thinning) is applied along each strand.
- Range: 0.0 β 1.0
- Default: 1.0
What it does:
- 0.0 = no taper β constant thickness from root to tip (blunt cut look)
- 0.5 = partial taper β some thinning toward tips
- 1.0 = full taper β strands thin fully from root width down to tip width
When to adjust:
- Natural hair: 0.7β1.0
- Blunt cut / bob: 0.0β0.3
- Damaged/split ends: 0.4β0.6
Texture support: Yes β paint areas with more or less taper
Expression support: Yes
Start
Where along the strand the taper begins.
- Range: 0.0 β 1.0
- Default: 0.2
What it does:
- 0.0 = taper starts immediately at the root
- 0.2 = taper starts 20% along the strand (default β maintains full thickness near scalp, then gradually thins)
- 0.8 = taper only starts near the tip
Visual effect: Natural hair maintains its thickness for most of its length, then tapers near the end. A Start value of 0.2 mimics this behavior β the strand stays thick for the first 20%, then begins thinning.
Texture support: Yes
End
Where along the strand the taper finishes.
- Range: 0.0 β 1.0
- Default: 0.95
What it does: Controls where the taper effect reaches its minimum thickness. At 0.95 (default), the strand reaches its thinnest point at 95% of its length, maintaining that thin width for the remaining 5%.
Curve
Shape of the taper transition curve.
- Range: 0.1 β 5.0
- Default: 1.0
What it does:
- 0.5 = ease in β gradual start, then sharp drop near the end
- 1.0 = linear β constant rate of thinning
- 2.0 = ease out β sharp thinning at start, gradual near the end
- 3.0+ = extreme ease out β very sharp initial thinning
Taper Ramp
A visual curve editor for fine-tuning the exact taper profile along the strand length.
What it does: Provides a graphical curve where the X-axis represents the strand position (0 = root, 1 = tip) and the Y-axis represents the relative width (1 = full width, 0 = minimum). You can click to add points and drag to shape the curve.
Interpolation modes:
- Linear: Straight lines between control points
- CatmullRom: Smooth flowing curves through control points
- Bezier: Bezier curves with tangent-based control
Presets:
| Preset | Description | Best For |
|---|---|---|
| Linear | Straight taper from root to tip | Generic hair, default starting point |
| Ease In | Gradual thinning at first, then sharp at tip | Thick hair that holds width longer |
| Ease Out | Sharp thinning early, gradual toward tip | Fine hair, delicate tips |
| Ease In/Out | S-curve taper β gradual start and end | Natural hair, smooth transitions |
Tip: The Taper Ramp gives you artistic control over the width profile that the numeric sliders (Start, End, Curve) cannot achieve. Use it for custom hair types β for example, a profile that's thick at root, thins in the middle, then flares slightly at the tip (split ends effect).
Surface Offset Panel
Root Offset
Vertical offset applied to strand roots above the mesh surface.
- Range: 0.0 β 1.0
- Default: 0.0
What it does: Lifts strand roots slightly above the mesh surface to prevent clipping. Without an offset, strands may visually "grow through" the mesh, especially at steep angles or with thick strands.
When to adjust:
- 0.0: No offset β strands start exactly on the surface (fine for thin hair)
- 0.001β0.005: Slight lift β prevents clipping in most cases
- 0.01+: Larger lift β use for thick fur or strands with very wide root widths
Visual effect: Prevents the "hair growing through skull" problem. Increase this if you see strands poking through the mesh.
Region Map Panel
The Region Map creates hair partings and prevents strands from crossing region boundaries. This is the primary tool for creating center partings, side partings, and any hairstyle where hair falls in distinct directional groups.
Enable
Toggle region-based strand generation on/off.
- Default: Off
What it does: When enabled, strands only interpolate from guides in the same region. This creates natural partings where hair separates cleanly.
How it works:
- Paint RED = Region 0 (e.g., left side of head)
- Paint GREEN = Region 1 (e.g., right side of head)
- Strands in the red area only follow red-region guides
- Strands in the green area only follow green-region guides
- Where red meets green, a natural parting line forms
Region Map Buttons
| Button | Icon | What it does |
|---|---|---|
| Paint | ποΈ | Enter texture paint mode to paint the region map (RED = region 0, GREEN = region 1) |
| Save | πΎ | Save the region map to disk |
| Load | π | Load a previously saved region map |
Workflow for a center parting:
- Enable the Region Map checkbox
- Click ποΈ to enter paint mode
- Paint the left side of the head red
- Paint the right side of the head green
- Click πΎ to save
- Generate hair β a clean center parting appears!
Parting Strength
How strongly strands are pushed away from the parting line.
- Range: 0.0 β 5.0
- Default: 1.0
What it does: Controls the separation force at region boundaries. Higher values create a wider, more visible parting gap.
When to adjust:
- 0.0: No separation β strands can cross the boundary (regions still affect interpolation)
- 0.5: Subtle natural parting
- 1.0: Clear, natural parting (default)
- 2.0β5.0: Wide, exaggerated parting
Auto-setup: When you increase Parting Strength from 0, FollicleFX automatically enables the Region Map if it's off, and creates a default left/right split region map if none exists.
Parting Mask
An optional painted mask that controls where the parting effect applies.
- Default: Off
What it does: When enabled, uses a grayscale texture to control parting strength per-area:
- White = parting active (strands separate)
- Black = no parting (strands blend normally across regions)
- Gray = partial parting effect
When to use: When you want parting only in specific areas. For example, a parting that starts at the front of the head but fades out at the back β paint white at the front and black at the back.
Parting Mask Buttons
| Button | Icon | What it does |
|---|---|---|
| Paint | ποΈ | Paint the parting mask (white = parting, black = no parting) |
| Save | πΎ | Save the parting mask to disk |
| Load | π | Load a previously saved parting mask |
Generate Hair Button
The green "Generate Hair" button at the bottom triggers strand generation with all current parameter settings.
What it does:
- Initializes width and taper profiles from the curve widgets
- Reads all parameters (density, shape, length, width, taper, region map)
- Generates strands by interpolating between guides
- Applies density maps, length maps, and region maps if enabled
- Creates the strand curves object in Blender
Tip: After initial generation, parameter changes auto-trigger regeneration. You don't need to click Generate again every time you adjust a slider β the strands update live.
FollicleScript Expression Examples
The Primitive tab heavily supports FollicleScript expressions for procedural control. Here are ready-to-use examples for each parameter.
Density Expressions
v * 2.0
More density at top of head (v=1.0), less at nape (v=0.0).
rand3(0.8, 1.2, index)
Each area gets 80β120% of base density β subtle natural variation.
v > 0.5 ? 1.0 : 0.3
Full density on top half, 30% density on bottom half.
Length Expressions
rand3(0.8, 1.0, index)
Each strand randomly 80β100% of guide length β subtle natural variation.
lerp(0.7, 1.0, v)
Shorter at bottom (v=0), longer at top (v=1).
u < 0.5 ? 0.8 : 1.0
Left side 80% length, right side full length β asymmetric cut.
Width Expressions
rand(0.005, 0.015)
Each strand gets a random width between 0.005 and 0.015.
lerp(0.001, 0.0003, v)
Thicker at bottom, thinner at top.
0.0005 * (1.0 + rand(index) * 0.5)
Base width 0.0005 with up to 50% per-strand random variation.
For a full reference of FollicleScript variables, functions, and syntax, see the FollicleScript Expressions page.
Practical Examples
Example 1: Basic Hair
Density: 10,000
Multiplier: 1.0
CV Count: 0 (inherit)
Radius: 0.15
Variation: 0.5
Length: 1.0
Width: 0.0005
Taper Amount: 1.0
Taper Start: 0.2
Taper End: 0.95
Result: Natural-looking basic hair with realistic taper.
Example 2: Dense Production Hair
Density: 50,000
Multiplier: 1.0
Radius: 0.12
Variation: 0.4
Length: 1.0
Width: rand(0.0003, 0.0006)
Taper Amount: 0.9
Taper Start: 0.2
Taper End: 0.95
Taper Curve: 1.0
Result: High-quality dense hair with per-strand width variation β ready for close-ups.
Example 3: Thin / Fine Hair
Density: 15,000
Radius: 0.18
Variation: 0.6
Width: rand(0.0002, 0.0004)
Taper Amount: 1.0
Taper Start: 0.15
Taper End: 0.9
Result: Fine, delicate hair with visible scalp show-through.
Example 4: Thick / Coarse Hair
Density: 8,000
Radius: 0.1
Variation: 0.3
Width: rand(0.0008, 0.002)
Taper Amount: 0.7
Taper Start: 0.3
Taper End: 0.95
Result: Thick, coarse hair with less taper and strong definition.
Example 5: Fur
Density: 30,000
Radius: 0.08
Variation: 0.7
Length: 0.8
Width: rand(0.001, 0.003)
Taper Amount: 0.8
Root Offset: 0.005
Result: Dense fur with thick strands and slight surface offset.
Example 6: Hair with Center Parting
Density: 20,000
Radius: 0.15
Variation: 0.5
Width: 0.0005
Region Map: Enabled
β Paint RED on left, GREEN on right
Parting Strength: 1.0
Result: Natural hair with a clean center parting where strands never cross the dividing line.
Parameter Reference Table
| Parameter | Panel | Range | Default | Maps/Expr | Description |
|---|---|---|---|---|---|
| Density | Density | 1 β 100,000 | 100 | β / β | Strands per unit area |
| Multiplier | Density | 0 β 100 | 1.0 | β / β | Global density scale factor |
| Use Density Map | Density | On/Off | Off | β | Enable painted density control |
| CV Count | Strand Shape | 0 β 200 | 0 | β / β | Points per strand (0 = inherit) |
| Radius | Strand Shape | 0.001 β 2.0 | 0.15 | β / β | Guide interpolation radius |
| Variation | Strand Shape | 0 β 1.0 | 0.5 | β / β | Random strand scatter |
| Length | Length | 0 β 2.0 | 1.0 | β / β | Strand length multiplier |
| Width | Width | 0.000001 β 0.5 | 0.01 | β / β (inline) | Root width (inline expression) |
| Taper Amount | Taper | 0 β 1.0 | 1.0 | β / β | Width taper strength |
| Taper Start | Taper | 0 β 1.0 | 0.2 | β / β | Where taper begins on strand |
| Taper End | Taper | 0 β 1.0 | 0.95 | β / β | Where taper finishes on strand |
| Taper Curve | Taper | 0.1 β 5.0 | 1.0 | β / β | Taper shape (0.5=ease in, 2=ease out) |
| Taper Ramp | Taper | Curve | Linear | β | Visual curve editor for taper profile |
| Root Offset | Surface Offset | 0 β 1.0 | 0.0 | β / β | Lift roots above surface |
| Enable (Region) | Region Map | On/Off | Off | β | Enable region-based parting |
| Parting Strength | Region Map | 0 β 5.0 | 1.0 | β / β | Parting separation force |
| Parting Mask | Region Map | On/Off | Off | β / β | Control where parting applies |
Maps = supports painted texture maps (ποΈπΎπ). Expr = supports FollicleScript expressions (Ζ). Inline = expression typed directly into the slider field.
Tips and Best Practices
Start Low, Go High: Begin with low density (1,000β5,000) for fast iteration. Only increase for final renders. Use the Multiplier for quick toggling.
Density Maps are Essential: Use density maps for hairlines, thinning areas, and patterns. Uniform density across the entire mesh almost never looks correct.
Width Expressions Over Sliders: Use inline width expressions like rand(0.005, 0.008) for natural per-strand variation. This replaces the old workflow of adjusting multiple width sliders.
Natural Taper Defaults: The default taper settings (Start: 0.2, End: 0.95, Curve: 1.0) produce a natural taper profile. Adjust only if you need a specific look.
Variation is Key: Add variation to width, length, and interpolation. Perfectly uniform hair looks CG. Even 0.3 variation makes a significant difference.
Region Maps for Partings: Always use region maps to create hair partings. Trying to sculpt a parting with guides alone is much harder and produces worse results.
Save Your Maps: Always click πΎ after painting a map. Maps are packed into the .blend file, but saving to disk gives you a backup and lets you reuse maps across projects.
Root Offset for Thick Hair: If you see strands poking through the mesh, increase Root Offset slightly (0.001β0.005). This is especially important for fur and thick stylized strands.
Common Mistakes
Too Much Density Too Early: Starting with 100,000 strands and waiting 30 seconds per update. Start at 1,000β5,000. Only increase when you're happy with the look.
Ignoring Width: Using the default width for all hair types. Fine hair needs very thin strands (0.0003), coarse hair needs thick strands (0.001+). Width dramatically affects the final look.
No Variation: All strands exactly the same width and length. Real hair varies! Use expressions like rand() for per-strand randomness.
Wrong Taper: Setting taper to 0.0 for natural hair. Real hair always tapers toward the tip. Use Amount: 0.8β1.0 for realistic results.
Forgetting Density Maps: Using uniform density on a full-head mesh. Real hairlines fade gradually β paint a density map to create natural transitions.
Too Large Radius: Setting interpolation radius to 0.5+ makes hair too smooth and uniform, losing the character of individual guide shapes. Use 0.1β0.2 for most hair.
Not Using Expressions: Manually adjusting every parameter when expressions could automate it. A single expression like rand(0.005, 0.01) replaces five old sliders.
Ignoring Parting Mask: Creating a full-head region map but wanting the parting only at the front. Use the Parting Mask to fade out the parting effect where it's not needed.
Next Steps
Once you've generated strands, move to the Modifiers Tab to style your hair with clumping, frizz, coils, braids, and more.
Related Topics:
- Modifiers Tab β Style your hair with the modifier stack
- Clumping Modifier β Group strands into natural clumps
- FollicleScript Expressions β Master the expression language
- Texture Masks β Learn the texture painting workflow in depth
---
The Primitive stage is where your hair comes to life. Take time to get density, width, and taper right β these fundamentals affect everything that comes after. Use expressions and painted maps for per-area control, and always start with low density for fast iteration!