This system gives individually-placed props their own color variation without breaking GPU instancing — no MaterialPropertyBlocks, no per-object materials. Instead, each instance's color choices are matched against a shared master palette texture and packed into a single per-instance value the VCCore shader reads at render time. It's made up of three pieces: the DPT_ZoneVariation component you place on instances, the DPT_PaletteMatcher utility that does the color-to-index lookup, and the DPT_PaletteGenerator editor tool that builds the master palette texture itself.
Add DPT_ZoneVariation to any instance of a VCCore-shaded prop to give it independent color variation. It exposes four zone color fields (Zone 0–3) plus a single object-wide Emissive intensity slider.
The component automatically finds the renderers it controls (including children), and re-applies whenever you edit values in the Inspector (OnValidate) or the object is enabled. In Play Mode, if Update Every Frame is off, it applies its values once on Start and then disables itself — it isn't ticking every frame doing nothing.
_ZonesPalette property. If none do, it logs a warning at runtime (once) and the component has no visible effect — the values it packs have nowhere to be read from.
When the component is removed or destroyed in the Editor (not in Play Mode), it resets the instance's packed value back to zero so the renderer doesn't keep showing a stale variation after the component is gone.
DPT_PaletteMatcher.FindNearestIndex takes a target color and a palette texture, and returns the index of the closest matching color in that palette. Distance is measured using Rec.601 luma-weighted channel differences (0.299 / 0.587 / 0.114 for R/G/B) rather than flat Euclidean distance, so the match favors perceptual closeness — the same weighting the rest of the VCCore pipeline uses for luminance.
Palette pixel data is cached per-texture after the first lookup, so repeated matches against the same palette (e.g. matching all four zone colors on one instance) don't re-read the texture each time. If a palette texture isn't marked Read/Write Enabled in its import settings, the matcher falls back to a GPU blit + readback to get pixel data instead of failing outright.
DPT_PaletteMatcher.ClearCache() (or pass the specific texture) so subsequent matches read the updated palette instead of the stale cached one.
Open the generator via Tools → DPTTools → Tools → Generate Palette. It builds a 64-color master palette as a full-gamut lattice across R/G/B — not a gradient path through color space — so the resulting palette actually spans the color cube rather than one line through it.
The preview strip and the "Resulting levels per channel" readout update live as you adjust the weight sliders, so you can see exactly how many shades each channel is getting before baking.
Each instance's four zone indices and emissive intensity are packed into a single 32-bit value written to the GPU Resident Drawer's per-instance user value (RSUV) — this is what makes the whole system instancing-compatible with no MaterialPropertyBlocks.
| Bits | Field | Contents |
|---|---|---|
0–5 |
Zone 0 Index | 6-bit index (0–63) into the 64-color master palette. |
6–11 |
Zone 1 Index | 6-bit palette index. |
12–17 |
Zone 2 Index | 6-bit palette index. |
18–23 |
Zone 3 Index | 6-bit palette index. |
24–31 |
Emissive | 8-bit intensity (0–255), with the lowest bit always forced on. |
The VCCore shader features customizable blend strengths that dictate how instance variations interact with the underlying surface canvas (such as baked vertex colors and ambient occlusion).
_Tint_Blend): Managed via the Shader Variation Controls in the material inspector. At 0, standard shader variations act as a multiplier (tinting the original vertex colors and preserving baked shadows). At 1, it fully replaces the vertex color canvas with a flat white base for complete recoloring._Zone_Blend): Managed inside the Zones Palette & Controls foldout. Controls whether zone variations tint over the original baked vertex shadows (0) or completely overwrite them with a clean white canvas for flat palette swatching (1).Unscripted objects or instances left at default values bypass these blends automatically, preserving original asset data cleanly.
_ZonesPalette property — assign a VCCore material to fix it.ApplyVariation) after swapping palettes, and call DPT_PaletteMatcher.ClearCache() if you replaced the texture asset in place rather than creating a new one.For all technical assistance, bug reports, asset configuration help, and general support, please reach out via email using the Contact Form. This is the primary and most reliable way to get help with any problems you encounter with the packages.
You can also use this form to inquire about custom freelance technical art services. If your project requires external 3D models to be integrated into the DPT ecosystem—including bespoke vertex-data packing, procedural wood grain mapping, GPU wind systems, or game-ready LOD budgeting—get in touch to discuss your specific needs and availability.