User Guide
Published by Urdrift. Public version target: 1.0.0, Unreal Engine 5.8.
Online manual: urdrift.com/docs/vintagedither/.
Documentation version: 1.0.0 · Last updated: 21 October 2026.
Prepared for the first public release, 1.0.0. This edition remains under final review.
First-release scope: Unreal Engine 5.8, Windows 64-bit, DirectX 12 and desktop deferred rendering in the editor and Play In Editor. Compatibility is limited to the declared release configurations. The compatibility and validation notes below explain the practical limits of that scope.
1. Welcome
VintageDither is a scene-styling tool for Unreal Engine. It combines patterned colour reduction, pixelation, selective object treatments and optional finishing effects in a single artist-facing volume.
Use your existing scene, lighting and materials. The effect processes the rendered image rather than requiring a replacement material on every object. Light, fog and clouds can contribute to the image that is stylized, while object masking has separate depth-pass requirements.
The product consists of a Blueprint volume, post-process materials and native runtime/editor modules. No AI service is used to render the effect or generate its scene-adaptive palettes.
There is currently no comprehensive step-by-step tutorial. VintageDither is designed for hands-on exploration, and the best way to learn it is to start experimenting in your own scene. Begin with a preset, change one setting at a time and use the tooltips to understand its effect. Save looks you like as your own presets, so you can return to them as you explore. The quick start below and the feature reference in this guide are here to help along the way.
2. Installation and first use
The first public release targets Unreal Engine 5.8 only. Development tests have been performed on Windows with DirectX 12. Final release-package acceptance tests are still pending. This is not a promise of compatibility with every renderer, platform or engine version. Use the final Fab compatibility listing when selecting a release build.
For a project-local installation, place the supplied VintageDither folder in YourProject/Plugins so that YourProject/Plugins/VintageDither/VintageDither.uplugin exists. Enable VintageDither in Edit > Plugins and restart Unreal when requested. The product is published by Urdrift. Its internal native module names remain DitherFrameHold and DitherFrameHoldEditor; those names do not identify a second required plugin.
In the Content Browser, enable Show Plugin Content in Settings. Locate VintageDither Content and add VintageDitherVolume to the level. Its asset reference is /VintageDither/VintageDitherVolume.VintageDitherVolume. Materials and patterns are in the same plugin content mount. The optional VintageDitherSample level is separate project content, not a required effect dependency.
Select the volume. Enable Effect controls the dithering treatment. The generated post-process component is normally unbound, allowing the volume to affect the full scene. Check its Enabled, Unbound and Blend Weight settings if the effect is absent. Start with a single VintageDither volume to keep configuration clear.
For a first look, enable Replace Scene Colors in Main dithering, choose a palette and select a pattern. Try Pixelation Size 1 and a small Dither Cell Size. For a visibly blocky image, increase Pixelation Size and use whole-pixel snapping. Pixelation changes sampling coordinates, not the renderer resolution or a guaranteed GPU cost.
The native plugin and content must both be installed. Blueprint assets alone do not provide the complete system. Development-only Python/MCP tools used to build the product are not part of the normal artist workflow.
3. Understanding the image chain
The selectable VintageDither chain is:
Scene and lighting -> native Film controls -> optional DOF before dithering -> dithering and its outlines/fades/vignette -> optional DOF after dithering -> chromatic aberration -> CRT treatment -> CRT RGB offset -> CRT blur -> completed-frame hold.
Only one VintageDither DOF pass is used. DOF Before Dithering chooses its location. RGB offset runs before CRT blur. Frame hold acts on the completed output.
Other Unreal post-process settings, cameras and third-party view extensions can affect the final image. This diagram describes VintageDither’s own pass ordering, not an override of every other renderer feature.
4. Effect and complete-look presets
Enable Effect controls the main dither pass. Use Mask Profiles enables the three routed mask profiles in addition to Main dithering. Finishing features have their own enable controls; check them separately when comparing the unprocessed scene.
The Presets menu under Effect operates on the whole volume. Custom keeps current values. Saved Defaults restores the Blueprint class defaults. The saved preset named Default is a separate JSON preset. In the supplied RC2 candidate, the class controls and supplied Default have been checked for agreement: Main Color Count 256, Depth of Field off, Stop Motion enabled at 10 fps. A project-local override of Default can make the two differ later. To save a new complete look, enter a unique name and click Save new. To replace the selected user preset, click Update.
A complete preset stores the volume controls, including edited palette colours, pattern references and noise settings. It does not capture the level’s lights, cameras, materials, transforms of unrelated actors or an entire project state.
Rename changes a project-local saved preset name. An untouched bundled preset cannot be renamed directly: use Save new first. Archive hides a preset without deleting its JSON; Restore makes it available again. Updating or archiving a bundled preset creates a project-local override and leaves the plugin’s original file unchanged. Renaming a project override may make the bundled preset’s original name visible again. Copy JSON exports current controls to the clipboard. Import JSON validates the clipboard and stores a new named preset without applying it automatically.
Bundled complete-look presets are read from Plugins/VintageDither/Config/VintageDither/Presets. User presets and overrides are JSON files in the project’s Config/VintageDither/Presets directory. Project-local entries take priority over bundled entries with the same name, including archived overrides. File names are unique identifiers; the readable preset name is inside each file. Back up this directory with your project. Referenced pattern textures must also exist in the receiving project. This authoring interface is an editor feature, not a supplied runtime preset browser.
5. Pixelation and pattern size
Pixelation Size controls the blocks used to sample the scene image. A value of 1 keeps native image sampling; larger values produce larger image blocks. Snap to Whole Pixels rounds the block size for a more deliberate grid.
Dither Cell Size controls the spacing/size of pattern cells when Screen Space is enabled. It is independent of Pixelation Size. The units selector supports Free, Whole Pixels and Pixelation Multiples. In Pixelation Multiples mode, 1 means one selected image block, 2 means two blocks, and so on.
Pattern Texture Scale controls the scale of the entire pattern texture in dither cells. Larger values spread the tile over more cells; smaller values repeat it more frequently. Snap Texture Scale rounds this factor.
Example: Pixelation Size 4 and Dither Cell Size 2 in Pixelation Multiples mode gives dither cells based on 8 screen pixels. Pattern Texture Scale then controls how the pattern texture occupies those cells.
Whole-number relationships are a useful starting point for crisp grids. Fractional values remain useful for animation, softer transitions and art direction; they are not automatically incorrect.
With Screen Space off, the profile uses World Cell Size instead. World projection is based on reconstructed scene depth. Transparent and volumetric content does not necessarily supply its own corresponding surface depth.
6. Main dithering and palette mapping
The same core controls are available in Main dithering and each mask profile. Pattern selects a pattern texture; its picker is restricted to the intended Patterns directory. Rotation changes the pattern orientation. Opacity blends profile mapping with the sampled scene. At zero, global pixelation, outlines, fades, vignette and later effects may still remain.
Palette Preset changes that profile’s colours. Color Count supports 2-256 entries and shows the corresponding number of colour swatches together. Swatches can be edited after selecting a preset.
Tone Ramp maps image luminance through the palette’s ordered entries. The ordering of colours matters. Nearest RGB chooses candidates based on colour distance and uses the dither threshold to distribute them.
For palettes with up to 16 colours, the nearest-colour path searches the active entries directly. Larger palettes use a cached lookup that identifies two candidate colours. This keeps the shader from searching 256 entries for every pixel, but is an approximation near colour boundaries.
Replace Scene Colors is important. When enabled, the profile uses palette colours as its target output. When disabled, the scene is multiplied by the palette treatment, preserving continuous scene-colour variation. For a visibly limited-palette look, begin with this option enabled.
Contrast, Exposure, Gamma and Range Offset change the image values used for mapping. Higher contrast separates tones more strongly; lower contrast compresses them. Exposure shifts brightness in stops. Gamma changes midtone response. Range Offset moves the mapping range.
Dither Strength blends the threshold treatment from a fixed threshold toward the selected pattern. At zero, colour quantization can still be active; this is not a master bypass. Blend Width controls the transition across palette-tone intervals. Lower Blend Width makes harder boundaries; higher values spread transitions. These blend controls are limited to 0-1.
Color Count is a per-profile palette size, not a guarantee that the entire final frame contains exactly that number of colours. Several mask profiles, mixing with the scene, additional layers, native processing and later blur can create more colours.
7. Fixed and scene-adaptive palettes
The themed palette library also includes Pocket Green (4 colours), RGBI Meadow (4), RGBI Neon (4), Tiny Fantasy (16), Home Computer (16) and Cartridge Classics (16). These names describe visual inspiration rather than exact hardware emulation. The naming update retains their colour values. Older saved looks can retain previous palette labels and their stored swatches.
Four Urdrift palette choices are Neon Circuit (4 colours), Chalk Garden (6), Ink Workshop (5) and Amber Archive (4). They replace the older Cyberpunk, Pastel, Risograph and Sepia library entries with newly composed colours. These are creative palettes, not hardware emulations or physical print simulations.
Choosing one applies its colours to that profile. Existing saved profile colours and complete-look preset files are not automatically recoloured by this library update. You can edit swatches after choosing a palette. Older saved labels may remain on existing looks; choose a new palette explicitly to adopt it.
The supplied palette list includes monochrome, greyscale and retro-inspired colour choices. The RGB 128 palette uses 4 red x 8 green x 4 blue levels. RGB 256 uses 8 red x 8 green x 4 blue levels. These are fixed RGB cubes, not palettes sampled from your scene or exact hardware emulations.
Scene Adaptive supports 8, 16, 24, 25, 32, 48, 64, 128 and 256 entries, with the supplied matching editor controls. These choices are different from fixed RGB cubes. They derive their colours from the current editor camera before the VintageDither custom effect passes.
To generate a palette, frame the shot in the level viewport, select a Scene Adaptive mode under the chosen profile’s Palette Preset and click Generate next to the menu. Generation is available in the editor outside Play mode. The new colours are stored in the profile, Color Count is set to the chosen size, Nearest RGB is selected, and Replace Scene Colors is enabled.
During capture, VintageDither temporarily bypasses its custom passes and completed-frame hold. Native Film and exposure settings remain. Camera letterboxing is excluded. The normal chain and hold state are restored afterwards; an image of the camera view is not saved.
The generated palette stays locked. It does not follow camera motion, changing lights or animation automatically. Edit individual swatches freely. Click Generate again only when you want a new analysis; regeneration replaces the generated profile’s active swatches.
Mask profiles sample the same full camera image. They do not analyze only the pixels inside their object mask. Each profile can nevertheless store a different generated palette.
For a closer match to the sampled image, start with profile Contrast 1, Gamma 1, Exposure 0 and Range Offset 0. Generation deliberately leaves these grading controls unchanged. Strong grading can move the input away from the image that supplied the palette.
The implementation uses weighted colour reduction with refinement in Oklab, sampling at most 65,536 image positions. A finite histogram is used. If the source contains fewer distinct colour groups than the requested count, colour entries may repeat. This is not Photoshop’s palette algorithm, and identical results are not claimed.
7a. Retro Looks
Retro Looks contains 26 named looks. Choose a target profile, select a look and click Apply Look. Fourteen use fixed Inspired palettes; twelve use Scene Adaptive. In an adaptive look, Apply Look captures the current camera immediately and keeps the generated colours editable afterwards. These are artistic interpretations, not guaranteed historical game palettes or hardware emulation.
Apply Pixelation starts unchecked. Off preserves the existing global Pixelation Size. On estimates an integer size from viewport height divided by the look’s reference height, rounded to the nearest integer and clamped to 1-32. For example, 1080/200 gives 5. This is a global setting even when the target is a mask profile. It does not enforce an exact virtual resolution, pixel aspect, display aspect or hardware attribute cells.
The available look methods are None, Bayer 2x2, Bayer 4x4, Bayer 8x8 and Blue Noise 2048. Original planning references to Floyd-Steinberg were replaced with Blue Noise 2048; Atkinson references were replaced with Bayer 4x4. The product does not provide either error-diffusion algorithm.
8. Patterns, noise and motion
Pattern Texture uses the chosen pattern asset. Blue Noise 2048 and White Noise 2048 use larger threshold textures. Procedural White Noise produces a stable hashed threshold per cell without a repeating image tile.
Noise Seed changes the arrangement. It does not increase noise strength. Animate Noise changes the field over time, with Noise Frame Rate controlling the update rate. Between updates the field is held. Leave Animate Noise off for a static distribution.
Large noise textures reduce the visibility of a small repeating tile; they still have a finite period. Procedural noise is not an error-diffusion algorithm. The supplied blue-noise-style texture is an original high-pass rank distribution, not a claimed canonical void-and-cluster or spatiotemporal blue-noise implementation.
Dither motion has separate Pattern Seed and Pattern Time Speed controls for the existing pattern behaviour. It is independent of the newer noise animation. The optional Extra Layer adds another pattern/colour treatment within a profile. Raising Extra Bias covers more cells; lowering it covers fewer. Pattern Seed affects the legacy random threshold, while the newer noise modes use their own Noise Seed.
Floyd-Steinberg and Atkinson are not implemented and should not be expected from the pattern menu.
9. Object masks
Enable Use Mask Profiles on the volume. On a supported mesh component, enable VintageDither Mask and choose VintageDither Mask Number. These are artist-facing names for Unreal’s Custom Depth pass and its mask value.
Under Mask routing, set Mask Profile 1, 2 and 3 to the values used by the objects. Configure their corresponding Mask dithering sections independently. Main dithering supplies the treatment for the remaining image.
For the supported mesh workflow, Custom Depth must also pass the effect’s scene-depth visibility check. Occluded geometry is not automatically assigned a visible mask through foreground geometry. Masking is not a smoke-density or volume-density segmentation system.
The project needs Custom Depth with the stencil-capable mode enabled: Project Settings -> Rendering -> Postprocessing -> Custom Depth-Stencil Pass -> Enabled with Stencil. Unreal’s underlying setting uses the word Stencil even though the tool’s interface calls the feature Mask.
If a mesh uses several components, configure the component that actually renders the surface. Some translucent materials require extra material-side Custom Depth support. A visible mesh is not automatically guaranteed to participate in this pass.
Heterogeneous Volumes do not support this object-mask workflow. Their visible contribution may still receive the main dither treatment. Fog, atmosphere and clouds likewise do not acquire independent object masks simply because their image is being processed.
9a. Mask Manager
Select a VintageDither volume and open Mask Manager in its Details panel. Outside Play, select supported mesh actors in the viewport and use Assign viewport selection under a profile. Routing is enabled when the assignment succeeds. The manager lists matching object/components, assignments changed externally and unsupported volumes. Selected unmasked objects appear under Main.
Click rows to select actors; Ctrl/Shift supports multiple rows. Focus moves the editor camera. Change look or Move / restore selected operates on selected component rows. Unmask restores Custom Depth settings recorded before this volume assigned them; it need not disable a pre-existing external mask. If values were changed externally, Forget drops tracking while preserving the external values. External Custom Depth values are protected unless Allow replacing existing external Custom Depth values is explicitly enabled.
Mask colours and Solo are temporary previews. Global finishing is temporarily bypassed during preview. End preview restores normal settings; closing the panel, saving or entering Play also ends preview. Profile names can be changed without changing mask numbers.
10. Pre-effects and composition
Enable Tonemapping exposes Film controls before dithering. Method selects the supplied Film behaviour; Slope, Toe, Shoulder, Black Clip and White Clip shape the tonal response when the relevant custom controls are enabled. These are tonal controls, not a replacement for scene exposure management.
Outlines use depth and normal differences to emphasize edges. Opacity controls their strength, Width sets their image footprint, and the Depth/Normal Thresholds determine which boundaries qualify. Very small thresholds can create excessive detail or noise.
Dither fade changes the treatment over scene depth using Start, End, Strength and a Fade Color. Its dither option changes whether the transition itself uses the threshold treatment.
Dither vignette provides Color, Radius, Softness and Strength controls, plus an optional dithered transition. It is part of the styled image and differs from unrelated native camera vignette settings.
11. Depth of field
Enable Depth of Field activates VintageDither’s own depth-based pass. It starts disabled on new volumes.
With DOF Before Dithering enabled, the scene is blurred before the pattern is applied, keeping dither marks sharper in defocused areas. With it disabled, the dithered image is blurred, softening the marks as well.
Focus Distance sets the target scene depth in Unreal units. Focus Range is the depth difference over which the blur radius rises to Max Radius; it is not an explicitly sharp band. A small value reaches full blur sooner, while a larger value increases blur more gradually. The implementation bypasses blur when the computed radius is below 0.5 pixels. Max Radius limits the blur footprint. Sample Count is rounded and clamped to 8-64 taps in addition to the centre sample; higher values increase cost. Depth Reject helps limit mixing across depth boundaries, but cannot eliminate every edge artifact.
The pass uses scene depth rather than a dedicated depth for every point in a cloud or smoke volume. Avoid accidentally combining it with another strong camera DOF pass unless that combination is intentional.
The current documented build does not expose an integrated Accumulation Depth of Field mode. A separately installed plugin is not automatically part of VintageDither.
12. Chromatic aberration and CRT
Chromatic Aberration has its own enable switch, Strength, Separation in pixels and Start Offset. Use small values for a gentle separation or larger values for a more graphic result.
The CRT section is optional. It groups General, Scanlines, Phosphor and Finishing controls. CRT Strength blends the treatment. Scanlines controls horizontal spacing, strength and, in Designer mode, lit Thickness, Softness and Gap Darkness. Legacy Beam Min/Max Width apply only with Use Designer Controls off. Phosphor controls its separate display-like pattern and spacing. Pattern Type changes the phosphor arrangement.
Line Spacing and Phosphor Spacing can use Pixels or Pixelation Multiples. In the latter mode, 1 uses one chosen Pixelation Size block, 2 uses two, and so on. CRT Pixel quantize aligns structure evaluation to rounded whole image blocks and, in Designer mode, snaps effective spacing and intermediate lit widths. It does not quantize the later RGB Offset and Blur stages. Numeric fields are not rewritten by this switch.
Halation and Diffusion change the spatial search used to select nearby existing image samples; Halation is not an additive glow. RGB Offset and Blur are separate finishing stages with independent enable switches. RGB Offset is rounded to whole screen pixels (0-32), while Blur has a continuous radius clamped to 0-32.
Gap Darkness is independent for scanlines and phosphor. Zero adds no darkening; one darkens available gaps fully at full CRT and pattern strength. A Thickness of one leaves no gaps. When quantized, start with spacing of at least two image blocks to leave alternating light and dark cells. In legacy mode, phosphor gaps come from the phosphor pattern, not scanline beam width.
Brightness Compensation estimates the average light loss from gaps in Designer mode. Its gain is capped at 8x and can produce HDR values; it does not guarantee an unchanged final histogram. RGB Offset separates channels before the final CRT blur. Blur can introduce intermediate colours and soften both the image and channel separation.
These controls offer a CRT-inspired artistic treatment. They do not claim a full physical display simulation, an exact historical monitor model or CRT-Royale parity. Curvature is not included.
13. Stop-motion frame hold
Enable Stop Motion holds the completed displayed frame at the chosen Display FPS. Try 4 fps for a strong stepped rhythm, 10 fps for a stop-motion feel, or 15 fps for a smoother held-frame treatment.
This is display-frame holding, not a reduction of the whole engine’s simulation rate. Objects and other systems may continue updating between displayed frames. It does not automatically turn camera movement or all animation curves into stepped keyframes, and should not be treated as a general performance optimization.
Clock selects the timing source. Auto uses the implementation’s scene/editor timing selection; Scene Time is useful when a deliberately scene-driven clock is needed. Verify the intended result in the exact playback or rendering workflow used for delivery.
The documented tests include editor rendering and temporal upscaling. Broad Sequencer, Movie Render Queue, Movie Render Graph, stereo and XR guarantees are not established by this guide.
14. Practical looks
For a crisp retro image, use Replace Scene Colors, a small palette, a structured pattern and whole-pixel relationships. Keep DOF off or place it before dithering if pattern sharpness matters.
For a look closer to the original scene, frame the shot and generate a Scene Adaptive palette. Start with neutral profile grading, then adjust the palette or contrast intentionally.
For an animated graphic treatment, try Procedural White Noise with Animate Noise enabled. Choose a deliberate Noise Frame Rate, then separately add frame hold if the completed image should update less often.
For an arcade-inspired result, build the palette/pixelation look first. Add scanlines and phosphor at low strength, then apply modest RGB offset and blur. Saving the clean and CRT-finished versions as separate complete presets makes comparison easier.
15. Troubleshooting and performance
If Generate is grey, select a supported Scene Adaptive size (8, 16, 24, 25, 32, 48, 64, 128 or 256) and leave Play mode. RGB 128/256 are fixed palettes and do not enable Generate. Make sure the matching Blueprint and native plugin versions are installed; a newer editor module can appear alongside an older volume asset.
If clouds or bright fog look smooth, check Replace Scene Colors, profile contrast and the local tonal range. A region may pass through dithering while showing little visible threshold variation. Later blur can also soften the pattern.
If colours differ from the source, distinguish a fixed RGB palette from a scene-adaptive one. Check profile grading and later processing, and regenerate only after the scene’s intended exposure is established.
If a mask does nothing, check project Custom Depth settings, the rendered component’s mask flag/value, mask routing and whether the surface type supports the pass. Smoke and clouds need a different masking approach.
If pixel grids shimmer, try whole-pixel size relationships and compare a static camera with moving playback. TSR was helpful in the development scene, but results depend on resolution, motion and renderer settings; it is not a universal fix.
Native volumetric fog, cloud reconstruction and lower-resolution smoke passes can show their own pixelation without VintageDither. Investigate those separately. Increasing their resolution increases GPU cost and is not a setting that VintageDither automatically changes for you.
The dither pass samples the rendered scene. Outlines, larger blur radii, additional blur passes and DOF sampling add cost. Large palettes use cached lookup textures; editing them rebuilds that cache. Adaptive analysis runs when Generate is clicked, not continuously during normal rendering.
Test representative camera motion and image resolution on the hardware used for delivery. No fixed frame-rate or GPU-time promise is made by this guide.
15.1 Measured rendering cost
These development measurements are reference points for planning your own scene, not guaranteed GPU budgets. They are not results from the final clean release package or a standalone/Shipping build.
Test system
- Measurement date: 20 October 2026.
- Engine and plugin: Unreal Engine 5.8.2, development plugin 1.13 in the release project.
- GPU: NVIDIA RTX 4080, driver 576.52.
- CPU: AMD Ryzen 9 9950X3D.
- Renderer and session: DirectX 12, Editor/Play In Editor.
The same scene and camera were used at verified output sizes of 1920×1080 and 2560×1440, with TSR, primary and secondary screen percentages set to 100, and dynamic resolution disabled. The renderer’s internal view rectangle was not independently instrumented. Main dithering used 128 colours.
There were two rounds per resolution, with the effect order reversed in the second round and bypass baselines before and after each round. Across 36 captures, 8,640 frames were analysed after discarding the first 120 of each 360-frame capture.
The table reports additional time in Unreal’s GPU/Postprocessing group, in milliseconds.
For each round, the effect median is compared with the mean of its two bypass-baseline medians; the two round deltas are then averaged. These are cumulative configurations, not independent costs to add together.
| Configuration | Extra ms at 1080p | Extra ms at 1440p |
|---|---|---|
| Core dithering | 0.094 | 0.158 |
| Core dithering + masks | 0.102 | 0.171 |
| Core dithering + CRT structure/RGB offset | 0.155 | 0.262 |
| Core dithering + CRT including blur | 0.230 | 0.391 |
| Core dithering + DOF | 0.210 | 0.361 |
| Combined effects, including frame hold | 0.356 | 0.609 |
The tested CRT configuration used strength 1 and RGB offset 2, with blur 2 in the blur case. DOF ran after dithering with 24 samples and maximum radius 8; focus distance was 0 and focus range 500. Frame hold used 10 fps in the combined case.
Film pre-effects and chromatic aberration were disabled in this comparison. Different palettes, mask coverage, scene content, output resolution and effect settings can change the result.
Frame hold copies the completed image after the post-process chain. Its full copying cost is not isolated by this table, including the combined row.
Whole-frame GPU timings varied too much to draw a reliable conclusion about that small extra cost. Two rounds do not establish statistical confidence bounds. Do not convert these numbers into an advertised FPS guarantee or extrapolate a 4K result: no valid 4K measurement was obtained.
15.2 Frame hold and stability checks
In a moving-camera PIE test at 320×180, image-sequence analysis measured approximately 4.09, 9.80 and 15.05 image updates per scene-second for the 4, 10 and 15 fps settings. All three met the test’s tolerance of two image transitions over the recorded interval. With frame hold bypassed, all 119 adjacent-image comparisons changed. This verifies holding relative to scene time, not physical monitor presentation or wall-clock pacing.
After resizing the same Play window to 2560×1360, PNG recording sampled only 2.89 images per scene-second. That was too slow to verify a 10 fps hold; the resized cadence result is inconclusive. Separate viewport-resize and map-switch smoke tests completed, but do not establish exact cadence during resize.
Four Play/Stop cycles and two map round-trips were monitored for memory stability. The render-target pool remained unchanged; the final two local GPU-memory readings were identical. Process memory fluctuated without continuous growth in this short series. Reference cleanup and garbage collection occurred between two measurement points. These are whole-editor observations, not isolated plugin memory requirements or a long-session leak guarantee.
15.3 Functional verification coverage
The release-candidate test records include 61 preset/palette checks, all 26 Retro Looks on Main dithering, 13 representative mask/pixelation cases, 14 Mask Manager UI/Undo checks, eight preset round-trip checks and eight mask-persistence checks after saving and reopening a test map. These are distinct test groups, not an exhaustive count of every parameter combination. They do not establish every Retro Look on every mask target, full editor-restart persistence or support for all render paths.
RC2 additionally passed 24 package/preset checks with freshly built native editor modules loaded in an independent IntegrationTest project. These covered the nine bundled presets, default controls, project-local Save/Update/Rename/Archive/Restore behaviour, invalid import rejection, unchanged plugin-file checksums and temporary-file cleanup. Python/MCP were enabled for that automated test. The sample migration was also checked by comparing all 1,213 exported control values, three mesh-mask assignments and their restoration records, saving the map and reopening it. No differences remained and the saved scene referenced the new plugin assets. These checks establish saved-value consistency; they do not replace visual acceptance. Final installation and visual acceptance still apply to the actual delivery package. The figures in this section must be reviewed again if packaging changes rendering code or produces unexplained image or timing differences; they do not by themselves certify the final release.
16. About the project
VintageDither is published by Urdrift. It began as a tool for a designer’s own artwork. Its feature set grew through sustained creative direction, visual experimentation and implementation with the help of AI tools.
Its influences include existing plugins and tools, traditional dithering techniques, retro graphics and other approaches to digital image-making. It is offered as an accessible creative tool shaped around a particular artist’s working needs, with room for others to develop their own visual language.
17. Release information
Please send all bug reports and feature requests to [email protected]. For bug reports, include your Unreal Engine and VintageDither versions, a short description, steps to reproduce the issue and relevant screenshots or log excerpts where possible.
Public release target: 1.0.0. Documentation edition: 1.0.0. Publisher: Urdrift. Support: [email protected]. Match the documentation edition and supported engine version to your installed product.
The separate VintageDitherSample project contains a three-cube visual example. Open the VintageDitherSample_Release level to inspect three different object-mask treatments alongside the Main profile. The scene opens with its edited VintagePreset_004 look; adding a new volume uses Default. Select the volume to explore its Details panel, or select a cube and press F to frame it. This is a compact editor example; it does not provide an interactive guided tour. Confirm the listing’s included-files section before purchase; unrelated artwork scenes and third-party assets are not implied. Contact Urdrift at [email protected] for support, including your engine version and reproduction steps.
18. Compatibility and scope
The first public release targets Unreal Engine 5.8 only. Other engine versions are outside this release’s support scope; future Unreal versions are not automatically included. The final package must still pass clean-install, build and rendering acceptance tests in 5.8. This engine-version scope is separate from compatibility with older VintageDither presets and volume assets, which remains part of release testing.
Preset schema 1 and 2 are accepted by the inspected code. Legacy scanline-count data has a conversion path to pixel spacing; presets without the newer Designer flag use the legacy CRT shape. These code paths still need visual migration/round-trip tests before backward compatibility is promised. New high-colour presets can be rejected by older volume classes that lack the required colour fields. Rejection must preserve the existing look.
Begin with one active unbound VintageDither volume. Frame hold currently selects enabled unbound post-process components; it is not proven to reproduce every camera/local-volume blend rule. Deferred DX12 editor use is the current development reference. Forward, mobile, XR, multiple views, other RHIs, MRQ and packaged runtime require their own evidence before being advertised.
The nine saved complete-look presets selected for the release candidate are Default and VintagePreset_001-008. The 26 Retro Looks and per-profile palette choices are separate libraries. The RC1 candidate was verified with the named Default selected and DOF off. The approved Default also enables frame hold at 10 fps. The RC2 plugin-content candidate has passed new-volume/default and preset checks. Confirm the same startup behaviour in the final delivery environment before publication. The older root Blueprint and the RC1 candidate must not be treated as interchangeable.
The separate sample is a three-cube visual scene for exploring the controls in the editor. No interactive sample guide or guided Play feature is included. No Accumulation DOF integration is supplied by the core build. Python, MCP and AI services are not required to use the normal volume controls.
Review references
The references describe engine behaviour; they do not establish that this product has passed the pending release tests.