---
title: "Stylized Painterly Brush Control"
canonical: "https://rmanwiki-27.pixar.com/space/REN27/662372354/Stylized%20Painterly%20Brush%20Control"
format: markdown
---
![02.png](media://83e1ac86-ca4f-4f42-b52e-6509c5a22221)


***PxrStylizedPainterlyBrushControl*** is an in-shader painterly brush pattern for RenderMan. It procedurally generates painterly brush stamps on-geo (UV / Screen / Triplanar projection), and exposes a color output (resultRGB) for downstream BxDF diffuse/color and a normal output (resultN) for bump/normal or vector-displacement workflows. 

Use it to drive stylized, layered painterly looks directly in the shading network while staying compatible with PxrSurface & PxrLama and other physically‑based shading, and to support interactive and offline denoising workflows.

## OVERVIEW HIGHLIGHTS

- New in-shader Painterly Brush
- On-geo UV / Triplanar / Screen projections
- Procedurally generates painterly brushes from a sample texture
- Color output for Diffuse into downstream BxDFs
- Normal output for painterly normals into downstream BxDFs or displacement
- Integrates with PBR and supports denoiser-friendly inputs


## PARAMETERS


**Result**  
Specify what goes to resultRGB output, useful to visualize when soloing this node. Also can plug normals into PxrSurface Bump when NPRcurvature selected.  
Use when: pick painterlyBrushFinal for production, or use diagnostic modes (I, uv, st, n, visualize, sourceMap, triplanarTestColors) during lookdev.  
Range: options mapper (Painterly Brush / Source Map / Triplanar Test Colors / I / UV / st / N / Visualize).


**Source Map**  


The .tex texture file to sample for brush color. If UV-mapped, choose UV projection.  


For color Painterly Brush: use diffuse color maps.  


For Painterly Normals: use normal maps for geometry if available. For flat surfaces where normal maps would be flat, or if don’t have normals maps for geometry, use example Painterly Normal textures shipped with RenderMan (RenderManProServer-27.X/lib/textures/StylizedLooks/PxrStylizedPainterlyBrushControl). These tileable normal gradient maps perturb the geometric normal on the geometry into random directions.

  
Use when: provide the color/normal map that seeds brush color, rotation (when using Source Map rotation), and variation sampling.


**Blur Texture Amount**  
Blur amount for Painterly Texture and Rotation Texture sampling (applies blur to texture() lookups).  
Use when: reduce high-frequency noise in the source/rotation textures or soften color picks for larger strokes.  
Range: 0.0 – 0.05

**Linearize**  
On for normal maps; Off for color/diffuse maps (linearize sRGB->linear when using texture as normal data).  
Use when: the Source Map stores normals encoded in sRGB or when you want the sampled texture converted to linear space for normal reconstruction.  
Range: boolean (on/off).

**Remap Normal Map**  
If using a normal map in Source Map, remap normals from [0..1] to [-1..1].  
Use when: your normal map is stored in standard [0,1] texture space and must be expanded to signed normals for vector math.  
Range: boolean.

**Painterly Normal Mix**  
Blend between the surface normal and the painterly-generated normal. 0 = original normals, 1 = painterly normal. Connect resultN into the BxDF bump input to use.  
Use when: mix painterly normal detail into shading without fully replacing object normals.  
Range: 0.0 – 1.0

## Projection Page

**Projection**  
If Painterly Texture is UV-mapped, use UV; otherwise use Screen or Triplanar. Controls how ss/tt are computed.  
Use when: choose projection that matches your workflow (uv for UV-mapped textures, screen for screen-space painterly placement, triplanar for objects without UVs).  
Range: options mapper (Screen / UV / Triplanar).

**Flip T**  
Flip T lookup on texture reads (useful to correct vertical orientation differences). Not shown for triplanar.  
Use when: your source texture appears vertically flipped.  
Range: boolean.

**Triplanar Flip XY YZ**  
On some geometry the XY and YZ triplanar axes need flipping — toggle to correct axis orientation.  
Use when: adjust triplanar projection orientation if you see stretched or swapped axes.  
Range: boolean.

**Triplanar XY / Triplanar XZ / Triplanar YZ**  
Enable/disable each triplanar plane. Turning off makes that plane black (excluded from the composite).  
Use when: visualize or remove specific triplanar projections.  
Range: boolean (per-axis).

**Frequency**  
Frequency / tiling of projection coordinates. For Screen/UV it scales the ss/tt; for Triplanar it scales P XYZ before mod.  
Use when: control the tiling/density of the painted pattern relative to the object or screen.  
Range: 0.0 – 100.0

## Brush Textures Page

**Brush1to4**  
RGBA .tex that packs four single-channel brush masks in its RGBA channels (brushes 1–4).  
Use when: supply your first brush atlas (library or custom).  
Range: texture asset path.

**Brush5to8**  
Second packed RGBA .tex containing brush masks for brushes 5–8.  
Use when: supply the second brush atlas for more brush variety.  
Range: texture asset path.

**Brush Tex Remap Min**  
Remap minimum (black) when remapping brush .tex values; raises black point to soften or remove faint mask edges.  
Use when: remove faint edge artifacts or soften/harden brush masks.  
Range: 0.0 – 1.0

**Brush Tex Remap Max**  
Remap maximum (white) for brush .tex values; controls mask contrast/threshold.  
Use when: adjust brush mask contrast for stronger or weaker strokes.  
Range: 0.0 – 1.0

## Brush Layers Page

**Initial Brush Size**  
The largest brush size (0–1). Octaves scale down from this base. Smaller values produce smaller starting brushes.  
Use when: set global stroke scale before octaves and density.  
Range: 0.1 – 1.0

**Octaves**  
Number of octave layers (each octave adds smaller-scale strokes). 0 = single-scale.  
Use when: create hierarchical stroke detail (broad strokes + finer work).  
Range: 0 – 10

**Octaves Scaling**  
Multiplication factor (lacunarity) applied to brush size for each octave. Values > 1 shrink frequency each octave.  
Use when: control how quickly stroke size/frequency changes across octaves.  
Range: 0.1 – 3.0

**Opacity Buildup**  
Value added to brush opacity for each octave above the first. Can be negative to make higher octaves more transparent.  
Use when: emphasize or de-emphasize finer octaves relative to base strokes.  
Range: -1.0 – 1.0

**Brush Width Buildup**  
Amount added/subtracted from Brush Width for each octave; higher octaves can become thinner.  
Use when: create tapered/thinner detail in higher octaves.  
Range: -1.0 – 1.0

**Density**  
Number of layers/passes of strokes per octave (pass coverage). More layers = denser paint.  
Use when: control how many stamps populate each octave for coverage and richness.  
Range: 1 – 10

**Brush Scale Random**  
Random per-stamp scale multiplier (0 disables random scaling). Adds organic per-stamp size variation.  
Use when: avoid mechanical uniformity and add hand-painted variation.  
Range: 0.0 – 1.8

**Brush Opacity**  
Base opacity applied to brush stamps (clamped/combined with octave buildup and variation).  
Use when: set overall transparency / paint buildup.  
Range: 0.0 – 3.0

**Brush Width**  
Stroke aspect / squeeze along S; values < 1 make strokes thinner.  
Use when: adjust stroke aspect to match brush shapes or stylization.  
Range: 0.01 – 1.0

## Rotation Page

**Rotation**  
How each brush is rotated. Options: Random (procedural), Degrees (fixed), Source Map (RGB→vector from Source Map), Custom Tex (.tex vector).  
Use when: orient strokes randomly or aligned to a vector field (normals/tangents/motion exported as textures).  
Range: options mapper (Random / Degrees / Source Map / Custom Tex)

**Rotation Texture**  
Texture .tex used for rotation when Rotation = Custom Tex (try normal maps or tangent maps).  
Use when: provide a texture-based vector field to orient strokes.  
Range: texture asset path

**Degrees**  
Fixed rotation degrees used when Rotation = Degrees. Use jitter to break uniform alignment.  
Use when: align all strokes to a specific global angle for stylized directionality.  
Range: 0 – 180 (widget shows 0–180)

**Rotation Jitter Weight**  
Adds random jitter to non-random rotations (not used for Random). Helps avoid perfectly aligned strokes.  
Use when: slightly randomize otherwise uniform rotation while keeping overall alignment.  
Range: 0.0 – 3.0

**Blur Rot Tex Amount**  
Blur amount applied when sampling the rotation texture (helps stabilize vector sampling).  
Use when: smooth noisy rotation textures to produce consistent stroke orientation.  
Range: 0.0 – 5.0

**Rotation Ref Vector**  
Reference vector used when computing angles between sampled vectors and a user reference (XYZ in normalized object space). Can be driven by lights/locators.  
Use when: bias stroke orientation to a particular direction (e.g., distant light rotation).  
Range: vector components (normalized typical range -1..1)

## Color and Comp Page

**Brush Color From**  
Source of stroke color: Center Brush (sample center of tile), Color (uniform swatch), or Brush Mask (use mask intensity).  
Use when: choose image-driven color, a single swatch, or grayscale mask-driven color.  
Range: options mapper (Center Brush / Color / Brush Mask)

**Brush Color**  
Uniform swatch used when Brush Color From = Color.  
Use when: paint with a single color across all strokes.  
Range: color swatch

**Background**  
How painterly results composite: Source Map (original texture), Color (flat BG), Paper (paper texture), N (surface normal), or Custom .tex.  
Use when: preview strokes on various canvases or composite over a paper texture for illustrative looks.  
Range: options mapper (Source Map / Color / Paper / N / Custom)

**BG Color**  
Background flat color used when Background = Color.  
Use when: composite strokes onto a solid backdrop for lookdev or stylized output.  
Range: color swatch

**Paper**  
Paper texture asset used when Background = Paper (acts as canvas).  
Use when: composite strokes over a textured canvas for hand-painted appearance.  
Range: texture asset path

**Custom .tex**  
Custom texture used when Background = Custom .tex (composite target).  
Use when: composite onto a specific texture / plate.  
Range: texture asset path

**Ignore Black**  
Ignores near-black samples from the Source Map to avoid creating black brushes pulled from outside texture borders.  
Use when: prevent contamination from texture borders or invalid sampled black areas.  
Range: boolean

**Black Threshold**  
Threshold below which a sampled color is considered black (used by Ignore Black).  
Use when: tune sensitivity for black-sample rejection.  
Range: 0.0 – 1.0

## Variation Page

**Variation Signal**  
Source for variation (OFF / Source Map / Custom). Controls brush placement / opacity / size when used with the Variation inputs.  
Use when: drive per-stamp variation from colors in the source map or from a custom map.  
Range: options mapper (OFF / Source Map / Custom)

**Color Picker**  
Pick the color used by the Variation Color sampling (visible when Variation Signal is not OFF).  
Use when: select target color to match for color-based variation/placement.  
Range: color swatch

**Color Range**  
Expands the color match range for brush placement (0 = exact match binary mask; higher values create gradual fade).  
Use when: include a soft range of similar colors for fading brush opacity across a palette region.  
Range: 0.0 – 1.8

**Custom Map**  
.tex texture used when Variation Signal = Custom. Can be grayscale (variation) or vector (RGB→vector for angle math).  
Use when: feed a pre-baked map for deterministic variation (denoised white shader, AO, curvatures, etc.).  
Range: texture asset path

**Variation Type**  
Whether the variation affects Brush Opacity (fade) or Brush Size (scale).  
Use when: pick how the variation signal modulates per-stamp appearance.  
Range: options mapper (Brush Opacity / Brush Size)

**Brush Size Scale**  
Scale applied to brush size when Variation Type = Brush Size. Controls the strength of size modulation.  
Use when: tune the magnitude of depth/color/mask-driven size changes.  
Range: 0.0 – 1.8

**Remap Min**  
Lower remap bound for variation data before clamping.  
Use when: shift the lower end of the variation mapping to bias how much area is affected.  
Range: 0.0 – 1.0

**Remap Max**  
Upper remap bound for variation data before clamping.  
Use when: control the maximum sensitivity of the variation mapping.  
Range: 0.0 – 1.0

**Invert**   
Inverts the variation signal (1 - value).  
Use when: flip effect polarity (e.g., paint near instead of far, or inverse color match).  
Range: boolean

**Notes**  
Read-only notes including required AOVs and setup guidance (lists many NPR/NPRpainterly AOVs used by the system).  
Use when: quick reference for required/rendered AOVs and integration notes.  
Range: read-only text

## OUTPUTS

**resultRGB** (color) — connect to PxrSurface diffuse/color input or PxrConstant for preview.  
**resultN** (normal) — connect to BxDF bump/normal input or PxrDisplace vector displacement. Use Painterly Normal Mix to blend with original N.  
**resultAOV** (int) — connect to **utilityPattern** input on PxrSurface or PxrLama. This just makes sure the shader is evaluated in the shading graph if no other connections are made. With only this connection, the shader will only write AOVs on not display any results directly in the render.

##   
QUICK USAGE TIPS

- This is a Pattern shader that samples clean source textures (albedo, normal maps, tangents) or user .tex maps
- Use Blur Texture Amount sparingly to stabilize color and normal sampling when your source texture is too high frequency for the chosen brush scale. Large blur values will soften the smapled color or normals and reduce texture detail.
- Use Triplanar for objects without UVs; enable only the axes you need.
- Use Rotation = Source Map / Custom Tex when you want strokes to follow a vector field (normals/tangents); add Rot Jitter Weight to avoid mechanical alignment.
- Use Variation (Source Map + Color Picker) to place strokes only on regions matching a color range, or use Custom Map for denoised/instrumented variation maps (AO, whiteshader, curvature).
- To preview or export painterly normals, plug resultN into PxrSurface bump or PxrDisplace as appropriate and tweak Painterly Normal Mix.

## Render Examples

![02.png](media://83e1ac86-ca4f-4f42-b52e-6509c5a22221)

![03.png](media://033893bc-daad-4728-9b44-2258f7fb6a8e)

![04.png](media://3df79e5f-0848-46a1-bed1-3be871336107)

![05.png](media://1ec18a2c-8c2a-4752-a7aa-46b5f3edbcf6)


![01-XPU-PxrStylizedPainterlyBrushControl-Painterly-Normals-OFF.png](media://7a89ef01-db22-404b-addd-01f1b560841d)

![02-XPU-PxrStylizedPainterlyBrushControl-Painterly-Normals-ON.png](media://2fb3f8a5-948e-4cc6-865a-d48f5bfbf255)


![XPU-WorldsDivide-Toon-Lines.png](media://0e05bc1d-e963-4730-b5e5-ff29051eb246)

![XPU-WorldsDivide-PainterlyNormals-Toon-Lines.png](media://2a148550-0a51-48a7-b8f5-b5aa6c9a8635)

![XPU-WorldsDivide-PainterlyNormalsRandomCirclesMap-Toon-Lines.png](media://0f156044-afc8-4a00-8c93-f1f387f4053d)