MATERIAL WORKFLOWS
PBR workflows
Map layouts, packing, surface response, UVs, parallax, and detail.
PACKAGE VERSION 1.1.0On this page
Surface response workflowSeparate and packed mapsBuild a packed PBR mapLinked PBR UVsAmbient occlusionHeight and parallaxGrunge heightDetail mapsRuntime and compilation behaviorVertex-painted PBRCrowPSX PBR materials support normal mapping, metallic response, smoothness or roughness, ambient occlusion, height-based parallax, specular highlights, reflections, and optional detail maps. These controls are available on CrowPSX/Surface/PBR and CrowPSX/Nature/PBR. The vertex-painted PBR shader provides the same core map choices independently for each painted layer.
Surface response workflow#
Choose Smoothness or Roughness in Surface Response Workflow.
- Smoothness describes how polished the surface is. White is smooth and black is rough.
- Roughness describes how microscopically uneven the surface is. White is rough and black is smooth.
The response value works without a texture and multiplies the selected map when one is assigned. Packed maps store the selected response in alpha; changing the workflow changes how that alpha channel is interpreted.
Separate and packed maps#
PBR Map Workflow offers two layouts:
- Separate Maps uses independent Metallic, Ambient Occlusion, Height, and Smoothness or Roughness textures. Choose it when the maps need different resolutions, import settings, or UV transforms.
- Packed Map combines the grayscale PBR data in one linear texture. Choose it to reduce texture sampling and keep the maps synchronized.
Normal maps remain separate in both workflows and must be imported as Unity Normal Map textures. Normal Strength and Detail Normal Strength accept -4 to 4; negative values invert the map's tangent-space relief. -1 gives the equal-and-opposite relief of 1, while 0 disables that map's influence. The recommended working range is -2 to 2.
The packed channel layout is:
| Channel | Data |
|---|---|
| R | Metallic |
| G | Ambient Occlusion |
| B | Height |
| A | Smoothness or Roughness, according to the material workflow |
Packed PBR textures are data textures. Disable sRGB sampling when importing a packed map manually. The built-in packing tool configures this automatically.
Build a packed PBR map#
When PBR Map Workflow is set to Separate Maps, the inspector places a themed Build Packed PBR Map card directly below the workflow description. The card previews the output channels before any asset is created:
- Assign the separate Metallic, Ambient Occlusion, Height, and Smoothness or Roughness maps you want to pack.
- Select the correct Surface Response Workflow. Regular PBR response maps use red; painted layers can select red or alpha for their separate response map.
- Press Review Packed Map Creation →.
- Review the save, assignment, and workflow-switch summary.
- Press Create & Switch to Packed, or choose Not Now to cancel.
CrowPSX creates a linear PNG beside the Base Texture when it is a project asset, or beside the material when no project texture is assigned. It assigns the new texture and changes PBR Map Workflow to Packed Map. Separate-map references remain intact, so switching back does not discard the setup. If detail maps are enabled on a regular Surface or Nature PBR material, the tool also creates and assigns the matching Detail Packed PBR map.
The output resolution follows the largest assigned source map, up to 4096 pixels per dimension. The packed map inherits the Metallic map's UV transform; enable linked UVs first when all source maps should use the same transform.
Linked PBR UVs#
Enable Link PBR UVs when the core PBR maps should follow the surface-color texture's tiling, offset, rotation, and scrolling. The surface-color UV controls become the shared transform and individual core-map transforms are hidden.
Disable the option when a map needs its own transform. Detail maps always keep independent UV controls.
Ambient occlusion#
Ambient Occlusion uses the red channel of a separate AO map or the green channel of a packed map. Ambient Occlusion Strength blends between no occlusion and the texture value.
AO affects indirect diffuse light and reflections. It does not replace realtime shadows and does not darken direct light from the main or additional lights.
Height and parallax#
Height maps produce view-dependent surface relief by offsetting texture coordinates; they do not move mesh vertices or change the object's silhouette.
- Separate maps read height from red.
- Packed maps read height from blue.
- White represents raised detail and black represents recessed detail.
- Parallax Height controls the depth of the effect. Its full authoring range is
0–1, while0.1is the recommended maximum for ordinary materials. Start near zero and increase gradually. - Height Floor sets the minimum level of the height map.
0uses the complete map unchanged. Raising the floor lifts recessed areas toward the peaks and compresses the relief range upward;1produces a flat height field at the highest level. - Parallax Steps is an integer from 1 to 64. Higher values reduce visible stepping at grazing angles but require more height-map samples. Values above
32are marked amber because their cost is usually best reserved for close-up materials. Values below4are intentionally available for very low-cost or strongly stylized materials and can show obvious stepping.
Parallax is most convincing on surfaces viewed at moderate angles with a consistent tangent basis. CrowPSX bounds and fades displacement at extreme grazing angles to keep high values stable, but very large height values, mirrored tangents, or mismatched map UVs can still stretch the texture. It cannot create true overhangs or silhouette displacement.
Parallax Steps is a total sample budget at grazing angles, not a fixed per-pixel cost. The ray march spends it on a linear search that brackets the surface, then a bisection pass that locates the hit inside that bracket. The linear pass takes about half and saturates at 16, since past that point extra linear samples only guard against stepping over a thin feature; bisection takes what is left, up to four. Each halving narrows the result twice as far for one sample, which the linear pass would need double its budget to match.
The split comes out of the budget rather than being added to it, so the setting is never more expensive than the number implies:
| Parallax Steps | Linear | Bisection | Total samples |
|---|---|---|---|
| 1–3 | 1–3 | 0 | 1–3 |
| 4 | 3 | 1 | 4 |
| 8 | 4 | 4 | 8 |
| 12 | 6 | 4 | 10 |
| 32 | 16 | 4 | 20 |
| 64 | 16 | 4 | 20 |
Two further effects scale the real cost down from there. A pixel whose total displacement works out below half a pixel skips the march entirely, which covers most distant geometry. Everything else scales both budgets by how far from head-on it is viewed, since a surface seen straight on has almost no displacement to resolve.
High Steps values therefore cost far less than the number suggests, and resolve more precisely than the same count spent purely on linear samples. Budgets of 3 or below spend everything on the linear pass.
Grunge height#
On PBR shaders, the Grunge layer can optionally influence height as well as surface color and response. Positive Height Influence embosses the grunge pattern; negative values carve it into the surface. This is independent of the base Height map, follows the Grunge mask and blend weight, and only affects parallax when both Grunge Height and the material's parallax are active.
Grunge Height is the one Grunge response that is evaluated inside the parallax ray march rather than once per pixel, because a height field has to be resampled at every marched step to produce relief. Its cost therefore scales with Parallax Steps, multiplied again by the Grunge Projection Type: three texture fetches per step under Triplanar, two under Biplanar, one under UV or Planar. Two settings dominate beyond that. Vertical Streaking at zero skips its noise entirely, so leaving it at zero when you do not want streaks is free performance. The projection type matters more than it looks: Triplanar evaluates 3D noise, which costs twice as much per octave as the 2D noise the UV and Planar paths use.
The march probes a reduced-detail version of the grunge (the low-frequency octaves, rescaled to the same range and mean as the full set so the field is smoother rather than shallower) while shading still reads it at full detail. The relief is therefore resolved against a slightly smoother field than the one you see, which costs roughly half as much per step and is not visible at ordinary Height Influence values.
If Grunge Height is still too expensive: drop the projection to Planar, set Vertical Streaking to zero, lower Parallax Steps, or drive height from the base Height map and leave Grunge on color and response only, which avoids the cost entirely.
Extended artistic sliders show amber markers at their recommended limits and turn amber after crossing them. Values beyond those markers are valid and intentionally available for exaggerated materials, but they are more likely to expose artifacts or produce non-neutral lighting. Normal-strength controls use a signed recommended range of -2 to 2. Physically normalized controls such as Metallic, Smoothness/Roughness, Ambient Occlusion, opacity, and blend weights remain limited to 0–1.
Detail maps#
Detail maps add close-range microstructure independently of the core PBR maps. Detail Normal remains separate. Metallic and surface response can use separate detail maps or the detail packed map, where red stores Metallic and alpha stores Smoothness or Roughness.
Use detail maps only where the extra samples are useful, such as fine scratches, pores, worn shine, or micro-normal noise.
Runtime and compilation behavior#
PBR Map Workflow, Surface Response Workflow, detail-map use, grunge, and emission are material controls rather than separate CrowPSX shader-feature variants. Changing these controls does not create a new combination of CrowPSX PBR programs. Unity still provides its normal Built-in Render Pipeline variants for lighting, shadows, fog, instancing, and lightmapping.
Disabled systems avoid their expensive work. A Parallax Height of 0 skips parallax traversal, Ambient Occlusion Strength of 0 skips separate AO reads, zero direct or indirect intensity skips the corresponding lighting work, and zero specular or reflection strength skips its BRDF or reflection-probe contribution. In packed mode, one RGBA sample supplies Metallic, Ambient Occlusion, and Smoothness/Roughness for the visible surface or painted layer. Height uses the same packed asset during parallax traversal.
Vertex-painted PBR evaluates only layers that contribute visible weight at the current pixel or vertex. Solid Base, Red, Green, or Blue regions therefore avoid reading the other three layers; transition regions evaluate the layers participating in the blend. Zero-weight layers also cannot activate the shared parallax loop. Packed maps remain the preferred layout when several painted layers overlap or parallax is enabled.
Vertex-painted PBR#
CrowPSX/Surface/Vertex Painting/PBR gives Base, Red, Green, and Blue their own:
- Separate or Packed Map workflow
- Smoothness or Roughness workflow
- Linked or independent PBR UVs
- Albedo, normal strength, metallic, AO, height/parallax, and surface-response values
This allows one material to mix workflows; for example, Base and Red can use packed maps while Green uses separate maps. Parallax Height and Height Floor are set independently per layer, while Parallax Steps is shared by all four layers.
Separate Maps is the heaviest vertex-painted PBR setup because every active layer can sample albedo, normal, metallic, response, AO, and height independently. Prefer packed maps for runtime-heavy painted materials and use low parallax step counts unless grazing-angle quality requires more.
Each painted layer displays its own Pack Base/Red/Green/Blue Layer card immediately below that layer's workflow control. Its review and confirmation buttons create, assign, and switch only that layer to Packed Map.