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:

  1. Click πŸ–ŒοΈ (paint) beside the Density slider
  2. Paint white where you want hair, black where you don't
  3. Click πŸ’Ύ to save the map
  4. Enable the "Use Density Map" checkbox
  5. 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:

PresetDescriptionBest For
LinearStraight taper from root to tipGeneric hair, default starting point
Ease InGradual thinning at first, then sharp at tipThick hair that holds width longer
Ease OutSharp thinning early, gradual toward tipFine hair, delicate tips
Ease In/OutS-curve taper β€” gradual start and endNatural 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

ButtonIconWhat 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:

  1. Enable the Region Map checkbox
  2. Click πŸ–ŒοΈ to enter paint mode
  3. Paint the left side of the head red
  4. Paint the right side of the head green
  5. Click πŸ’Ύ to save
  6. 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

ButtonIconWhat 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:

  1. Initializes width and taper profiles from the curve widgets
  2. Reads all parameters (density, shape, length, width, taper, region map)
  3. Generates strands by interpolating between guides
  4. Applies density maps, length maps, and region maps if enabled
  5. 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

ParameterPanelRangeDefaultMaps/ExprDescription
DensityDensity1 – 100,000100βœ… / βœ…Strands per unit area
MultiplierDensity0 – 1001.0β€” / β€”Global density scale factor
Use Density MapDensityOn/OffOffβ€”Enable painted density control
CV CountStrand Shape0 – 2000β€” / β€”Points per strand (0 = inherit)
RadiusStrand Shape0.001 – 2.00.15βœ… / βœ…Guide interpolation radius
VariationStrand Shape0 – 1.00.5βœ… / βœ…Random strand scatter
LengthLength0 – 2.01.0βœ… / βœ…Strand length multiplier
WidthWidth0.000001 – 0.50.01β€” / βœ… (inline)Root width (inline expression)
Taper AmountTaper0 – 1.01.0βœ… / βœ…Width taper strength
Taper StartTaper0 – 1.00.2βœ… / β€”Where taper begins on strand
Taper EndTaper0 – 1.00.95β€” / β€”Where taper finishes on strand
Taper CurveTaper0.1 – 5.01.0β€” / β€”Taper shape (0.5=ease in, 2=ease out)
Taper RampTaperCurveLinearβ€”Visual curve editor for taper profile
Root OffsetSurface Offset0 – 1.00.0β€” / β€”Lift roots above surface
Enable (Region)Region MapOn/OffOffβ€”Enable region-based parting
Parting StrengthRegion Map0 – 5.01.0β€” / β€”Parting separation force
Parting MaskRegion MapOn/OffOffβœ… / β€”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:

---

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!