3D Modeling & Art Pipeline¶
This guide covers the art and rendering workflow for Virtual Pinball recreations, from playfield scanning through final VPX integration. These techniques represent the collective knowledge of the VPW community's best artists and modelers, refined across dozens of table builds over several years.
Playfield Scanning and Preparation¶
The foundation of any high-quality recreation is an accurate playfield image. Whether scanning a real machine or stitching photographs, the techniques below determine the quality ceiling for every subsequent step.
Scanning Workflow¶
Playfield scans should be saved as TIFF at 600 DPI for maximum reproduction quality. PNG at 300 DPI is acceptable but TIFF preserves more data. A typical high-quality scan like Breakshot's measured 12194x27629 pixels at 600 PPI, yielding actual dimensions of 20.32" x 46.04". (clarkkent9917, niwak, Breakshot)
For Space Station, apophis79 scanned the playfield at 600 DPI in sections, and bord1947 stitched them together, yielding final dimensions of 20.25" x 42.0" with a playfield thickness of 0.53". The stitched scan serves as the reference for all artwork and geometry. (apophis79, bord1947, Space Station)
Scan Quality Checklist
- Save as TIFF at 600 DPI for archival quality
- Verify scan dimensions against known physical measurements
- Upload raw individual scans alongside the stitch for potential re-stitching
- Remove lumps of dirt and hairs, but leave natural wear for realism
- Check that circular features (bumper holes) appear actually circular in the final image
Playfield Dimensions¶
Getting dimensions right is critical because circles must be circular and all primitives depend on correct proportions.
WPC standard playfields measure 20.25" x 46", NOT 20.5" x 46" as commonly listed in the "Dimension Manager" reference. bord1947 confirmed this by measuring a real Shadow playfield -- most WPC playfields are approximately 51.45cm wide. Clark Kent's scans confirmed the 20.25" width with a 2.2716 aspect ratio. This measurement error propagated through many VPX tables causing subtle alignment issues. (bord1947, iaakki, BOP)
For Bally's Black Rose, ebislit physically measured the playfield at 20.25" x 46". The previous VPX playfield image was vertically squashed with incorrect proportions of 20.50" x 46". After correcting dimensions, the playfield image was cut to 2160 x 4907 px and the editor set to 952 x 2162 VPUs. (endi78, ebislit, sixtoe, Black Rose)
The commonly cited GNR playfield size of 25" x 51.75" turned out to be incorrect. Through cross-referencing scan ratios, photo analysis, part library fitting, and physical measurement by eMBee (583 x 1166mm = 22.95" x 45.90"), the correct size was determined to be essentially 23" x 46" -- matching WMS Superpin dimensions, not a custom DE widebody. Bumper holes being circular in scans validated the correct aspect ratio. (niwak, bord1947, embee1979, Guns N Roses)
Always Verify Dimensions
Internet sources and dimension managers frequently have incorrect playfield sizes. When possible, physically measure the playfield or verify that circular features (pop bumper holes) are actually circular in your scan. Even small errors compound across every primitive placement.
Photo Stitching¶
When a flatbed scan is not available, photo stitching from high-resolution photographs can produce excellent results.
For Police Force, benji084 used a 3x3 mesh warp in After Effects/Photoshop to align each photo tile to a playfield protector overlay. The process starts with a 3x3 grid, then refines with 4x4 intermediate points. Hot spots from glare are the biggest challenge -- they can be patched with shots from different focal lengths or angles. Using the playfield protector image as an alignment reference ensures exact aspect ratio matching. (benji084, ebislit, Police Force)
For Street Fighter 2, ebislit took a 3x4 photo grid and stitched together in Photoshop. This approach gets better results before clear coating, which adds reflectiveness. The stitched result used pinball.center's playfield layout as a base layer at matching resolution. (ebislit, onevox, Street Fighter 2)
Camera-based playfield capture introduces radial distortion, lens aberration, and flattening effects. To correct barrel distortion: photograph a printed grid/checker pattern perpendicular to the camera, use Photoshop's lens distortion filter to straighten grid lines, then apply the same correction to all images from that setup. PTGui software produces extremely accurate stitches from scanner sections. (niwak, ebislit, bord1947, Guns N Roses)
Stitching Best Practices
- Use PTGui for the best automated stitching results
- Verify alignment by drawing a transparent box around the playfield edge and checking reference points
- If the stitch is slightly wonky, re-stitch from raw scans rather than perspective-correcting the already-stitched image
- A well-stitched scan may change playfield dimensions, requiring re-alignment of all objects
Color Correction¶
Scanners produce flat, desaturated colors while cell phone cameras auto-boost saturation. Neither is accurate alone. The best approach is to compare scans against multiple reference photos under different lighting, check videos for reference while accounting for camera lighting effects, and consider using Pantone color swatches printed at the bottom of some playfields for calibration. (sixtoe, o0skitso0o, astronasty, brad1x, Medieval Madness)
For Stargate's color correction: get photos of the real playfield under pure white light as a color reference, mesh scan detail with reference color, paint with high saturation then apply desaturation, noise, and slight blur to feather edges, and add wood grain texture using a Multiply layer at roughly 50% opacity with motion-blurred noise. (mechaenron, apophis79, Stargate)
Playfield Image Resolution¶
Playfield images at exactly 4000px width/height work best. 4096px (power of two) causes mipmapping issues where VPX downscales the image, resulting in blurriness. 6000px was also tested but showed diminishing returns for the extra file size. The 4K sweet spot avoids the mipmapping threshold while providing sufficient detail. (iaakki, sixtoe, BOP)
Testing on Bad Cats showed that 8K playfield images caused out-of-memory errors. 4K worked but required disabling playfield reflections, FXAA, AO, and screen space reflections. Resolution can be pushed to 5K on 4GB VRAM by disabling all visual extras. For final release, always test on cabinet hardware, not just desktop. (benji084, brad1x, iaakki, Bad Cats)
The recommended approach is a 4000px "low-res" default that works on all hardware, with a higher-res version included unassigned in the image manager along with instructions for users to swap via the playfield image dropdown. At 4K resolution, pixels are imperceptible from typical viewing distance. (benji084, brad1x, Indiana Jones)
Playfield Redrawing¶
Full Redraw Workflow¶
For Black Rose, ebislit scanned a used physical playfield and stitched the images, then endi78 (a professional graphic designer/illustrator) redrew damaged areas in Photoshop -- parchments, wood grain, compass, skulls, text, and halftone patterns. Font identification websites with isolated letter samples helped find matching fonts. Imperfections from the scan like marks and scratches proved useful for positioning primitives on the new playfield. Both clean and "imperfect" versions were maintained for realism. (endi78, ebislit, sheltemke, Black Rose)
Vector Redraw Workflow¶
Brad1X's vector process uses Adobe Illustrator for vector work (iPad with Apple Pencil for character outlines, desktop for shapes and text). The Illustrator file is set up at exact playfield dimensions. This approach produces infinitely scalable artwork that can be used for any resolution target. (brad1x, cyberpez, sixtoe, Police Force)
Aged vs Showroom Graphics¶
Bad Cats was initially released with aged/grunge textures including scratches, dirt, and grime layers in Photoshop. The problem was that grunge effects washed out under the newer GI lighting method (light from below). For the v3.0 toolkit release, the team switched to a "showroom" clean version -- everything "pops" with clean graphics. The aged look worked better with old top-lit GI but fought against physically-based below-lit GI. Both versions were maintained as separate Photoshop layers for a potential future toggle. (benji084, brad1x, iaakki, Bad Cats)
For Street Fighter 2, the community debated worn versus brand new aesthetics. The worn look is more lifelike and tells a story -- instruction cards were made sepia/faded yellow like sun-worn paper instead of using dirt markings. Scratches on clear plastics were reduced after feedback about "too much damage," but dirty rubbers and metal wear were kept for authenticity. The consensus: prefer a worn look representing real arcade play over pristine showroom condition, but balance is needed. The machine should look used but loved, not destroyed. (gedankekojote97, cainarg, passion4pins, Street Fighter 2)
Insert Modeling and Rendering¶
Inserts are one of the most impactful visual elements in a VPX table. The VPW community has developed several approaches ranging from simple 2D techniques to complex 3D multi-primitive stacks.
The Flupper Insert Method (VPW Standard)¶
VPW's standard insert system uses two primitives per insert: an "off" tray on top with the unlit texture, and an "on" tray beneath with the lit texture. The off primitive's transmission and BlendDisableLighting allow light from the on primitive to shine through. This creates realistic depth when viewed from angles, especially in VR. Each insert also has a small VPX light/bulb placed between the trays (around z=-3) at very low intensity (0.2-0.4) to provide subtle haze and ball reflection. Later iterations used 3 or even 5 elements per insert for additional realism. (iaakki, benji084, Indiana Jones)
The specific material setup matters enormously:
- Off tray: material with 0.99 opacity, depth bias 100
- On tray: separated by 0.001 on the Z-axis from the off tray
- Two trays separated by 0.001 on Z-axis
- BlendDisableLighting ranges from 0 (fully dark) to 1 (fully lit) and beyond
(flupper1, benji084, iaakki, sixtoe, Star Wars DE)
Insert Opacity Is Critical
Material opacity on the insert top tray is extremely sensitive: tiny changes between 0.990-0.999 create HUGE visual differences in how well the bottom tray shows through. Default should be .9999 (many nines). The range 0.995-0.999 determines depth perception and color saturation. Lower values (0.995) show the tray better with more depth; higher values (.999) are more transparent but less defined. (iaakki, benji084, Spider-Man)
Flupper's insert trays sit at Z=0 because the axis/anchor point is at the top of the tray model, with walls extending downward below zero. This makes the top walls flush with the bottom of the playfield. In the VPX editor you only see outlines; actual rendering is only visible in F5/F6 play mode. (benji084, Spider-Man)
Insert primitives can also be sourced from existing tables. Copy the insert objects from tables like Batman DE or Game of Thrones, adjust size as needed, and use the VPW Example Table as a resource for standard insert shapes. Each insert has 2 parts: on and off primitives. When primitives get corrupted, copy fresh ones from working tables. (oqqsan, Die Hard Trilogy)
Skitso Method for Painted Inserts¶
For painted inserts where the plastic lens is not visible from above, use the "Skitso method": the light shape matches the hole in the playfield, and a decal simulates the paint blocking the light. Results are very realistic. A tutorial is available in the Fish Tales WIP thread on vpinball.com forums. This method works best for inserts where the plastic insert lenses are not seen (e.g., SINK SHIP letters on Black Rose). For clear inserts where the lens is visible, use 3D primitive inserts instead. (o0skitso0o, endi78, sixtoe, Black Rose)
Skitso-style inserts require playfield reflections to be enabled in VPX settings. Without reflections, inserts will appear dark and unlit. This applies to all tables using this method (Medieval Madness, Theatre of Magic, Monster Bash, Hook, Creature from the Black Lagoon, etc.). This cannot be fixed -- it is a VPX limitation. Add this to release notes so users know to enable PF reflections. (o0skitso0o, T2)
When to Use Each Method
Use the Skitso method for painted/opaque inserts and 3D primitives for clear inserts. The improvement of 3D over Skitso for painted inserts is minimal relative to the effort required. For aging the look, use lower contrast on insert primitive textures. (iaakki, o0skitso0o, Black Rose)
Insert Lighting with DisableLighting¶
Insert illumination via BlendDisableLighting (BDL) works by setting the primitive material dark for the off state, then increasing the BDL value for the lit state. Fading is implemented via a custom FadeDisableLighting sub using primitive.UserValue to track the target state (0=fading down, 1=fading up, -1=done). FadeSpeedUp and FadeSpeedDown constants control the rate, called from a game timer at roughly 10ms intervals for each insert. This avoids needing separate VPX light objects for each insert, preventing light-bleed artifacts on non-flat surfaces. (iaakki, benji084, Bad Cats)
DL (DisableLighting / BlendDisableLighting) controls object brightness with a range of 0-1 in the editor (0 = darkest/normal, 1 = maximum). Via the script debugger, values like primname.blenddisablelighting = 200 can make objects very bright (used for Flupper inserts and domes). (iaakki, tomate80, Diner)
For pre-rendered/baked textures, DL is critical. With DL at 0, VP's built-in lighting flattens highlights, making textures look out of sync with the playfield. Setting DL to 0.3-0.5 for pre-rendered prims brings highlight values closer to what was rendered. Set DL to 0.5+ for rendered textures unless planned for at rendering time; DL at 1 prevents VP lamps from glowing up meshes. (bord1947, iaakki, sixtoe, Indiana Jones)
Setting BDL to negative values (e.g., -0.1 or -0.2) on OFF primitives darkens them below the default ambient level, making GI-off states more realistic. This cannot be used on primitives involved in flasher texture swapping because the negative DL would also darken the flasher-lit appearance. Use selectively: safe for objects that only participate in GI fading, not flasher reflection fading. (iaakki, sixtoe, Indiana Jones)
Insert Text and Overlays¶
Insert texts and graphics can be cut out of the playfield image and placed on a separate flasher layer. This makes texts/graphics appear sharp and crisp at all zoom levels instead of being limited by playfield image resolution. The same technique was used successfully on Lethal Weapon 3. (sheltemke, Black Rose)
For curved text overlays (e.g., BOP star pattern inserts), Illustrator is the preferred tool as curved text is much easier there. Insert ON textures need careful material settings -- the OFF image may look fine while the ON image shows artifacts like "crinkle" around edges, requiring separate passes to fix. (benji084, iaakki, clarkkent9917, BOP)
Insert text flasher images need edges that are 4+ pixels broader than the playfield insert holes to prevent visible gaps between the insert and surrounding playfield. The gap becomes wider when transitioning to 1:1 aspect ratio playfield images. Adjust the text flasher image edges rather than modifying the playfield holes, since playfield shading is baked. (iaakki, brad1x, Indiana Jones)
When inserting text appears too thin/slim on flashers, increasing opacity beyond 100% on a single flasher creates artifacts rather than thickening the text. The workaround is to duplicate the flasher and overlay the copy, doubling the visual density. An alternative from iaakki: use a VPX ramp object for insert text overlay instead of flashers, which produces the most opaque result. (sheltemke, apophis79, iaakki, Earthshaker)
For playfield insert masks, two approaches exist: cut around existing text from the scan using lasso/brush tools (which preserves original character), or recreate text from scratch using matched fonts (which produces sharper results). Recreated text is generally preferred because scan text edges are never sharp enough. Adding a noise layer to recreated text prevents it looking too "clean." (redbone615, apophis79, benji084, tomate80, Earthshaker)
Insert Color Values¶
For red insert "ON" textures, avoid pure RGB(255,0,0). Use something like RGB(255,32,0) so that when DisableLighting increases, the texture gets orange highlights rather than washing out. Red light always bleeds through more than other colors and needs lower intensity. Blue is the opposite -- it requires higher intensity. VPX lamp colors should never be FF0000; add some green and blue (e.g., FF0505). (flupper1, sixtoe, T2)
Insert decal text should not appear blindingly white when lit. The white in the decal should match the white level of the surrounding playfield render. "Detuning" or color correction of the text overlay layer may be needed to bring whites in line with playfield whites under the same lighting conditions. (g5k4124, o0skitso0o, T2)
Insert Depth Fix for VR¶
Insert cups that are too deep cause visible "holes" when viewed from angles in VR. The fix is to reduce cup depth to roughly 0.08-0.1 inches (matching real insert plastic depth, not the full playfield wood depth). Additionally, adding an inverted camera ray in the insert wood alpha improves edge appearance. This is a Blender-side fix that requires a rebake. (tomate80, niwak, benji084, Godzilla SEGA)
Insert Alignment Handles¶
Blood Machines introduced a clever alignment technique: insert OFF primitives have a tic-tac-toe shaped "handle" geometry below them, and ON primitives have a box shape that fits over it. These handles are never visible during gameplay but make it much easier to select and precisely align insert primitives in the VPX editor. The ON prim handle exactly overlaps the OFF prim handle, ensuring perfect registration. (apophis79, scampa123, Blood Machines)
Cutting Playfield Holes for Inserts¶
When cutting playfield holes for 3D inserts, edges must NOT have anti-aliasing or you get jaggies in VPX with the flasher method. If you select the negative space from an anti-aliased layer and make a mask from it, it produces jagged edges. Insert cutouts must have hard/aliased edges. (astronasty, apophis79, Road Show)
The insert cutouts on the OFF playfield image must match the ON image exactly, or white/bright edge artifacts appear. One fix is to contract the transparent areas on the playfield image and have the alpha-blended edges hidden under the insert primitive placed on top. (apophis79, iaakki, oqqsan, Taxi)
Blender Toolkit (VLM) Lightmapping¶
The VPX Lightmapper (VLM) Toolkit revolutionized VPW table lighting by enabling physically-based light baking in Blender that integrates directly with VPX tables. This section covers the complete workflow from setup through final export.
Toolkit Setup and Workflow¶
The VLM toolkit workflow involves these core steps:
- Import the VPX table into Blender using the toolkit addon
- Set up lighting collections: GI, flashers, inserts, room lighting
- Assign materials to bakemap objects
- Run batch render for lightmaps at test resolution first
- Import VLM materials from a reference table
- Hook up insert/GI/flasher lightmaps in the VPX script
(tomate80, niwak, sixtoe, Iron Man)
For Bad Cats v3.0, key gotchas included: flasher lights need intensity > 0 and state "Off" in the editor, inserts may render incorrectly if the Blender playfield material setup is wrong (renders "as if" on insert cups), and BM_playfield must be set to "active" material for room brightness to work. (benji084, apophis79, fluffhead35, Bad Cats)
First Bake Checklist
- Delete everything visible in VPX and prep the file
- Run a 1K batch first as test (roughly 1 hour)
- RGB LED inserts must be baked full white for tinting afterward in VPX (10.7.2 feature)
- Inserts need to be "split" in Blender (separated into on/off)
- Primitive names can't be too long -- combined with lightmap suffixes they get truncated
- All objects that interact with the ball should remain invisible and collidable; visual-only objects come from Blender (tomate80, niwak, Game of Thrones)
Bake Collection Structure¶
VLM requires two mandatory parent collections: VLM.Bake (defines what gets baked) and VLM.Lights (defines lighting conditions). Within bake collections, opaque non-movable parts go in a single group collection (e.g., "Parts"). Transparent parts like clear ramps need separate layer collections with depth bias decreasing from 0 layer by layer, plus a layer separator mesh between transparent parts and what is behind them using the toolkit's premade material. Inserts that bake to the playfield need a "Bake To" property pointing to a playfield duplicate (Playfield.BT) in a Setup collection. (niwak, Iron Man)
Collections can be set as group (all parts merged into single bake output) or split (each part exported separately). Use group for GI lights, pop-up toy bodies, and any element that moves as one unit. Use split for movable items that animate independently (switch wires, targets, gates, spinners), flashers, and inserts. (niwak, tomate80, sixtoe, Iron Man)
Naming Conventions and Length Limits¶
VPX has a maximum element name length of 31 characters. The VLM toolkit trims names that exceed this limit, which can cause name collisions where different elements end up with identical names. Long Blender collection names get concatenated with light names during export (e.g., "IronMonger_LM_flashers_flasherl..." gets truncated). The fix is to use short collection and object names in Blender: "IM" instead of "IronMonger", "flight" instead of "flasherlight". Names starting with underscore "_" crash VPX. (flux5009, Iron Man)
VLM lightmap names follow the pattern: LM_<light collection>_<light name>_<part collection>_<part name>. This means individual names must be kept to roughly 6 characters max. For example, "Bumper1Light" becomes "BL1" and "Playfield_Upper" becomes "PFUp". (apophis79, sixtoe, Haunted House)
Insert Light Naming¶
VLM insert lights follow a specific naming convention. Each VPX light has 4 components: l (light), p (primitive), poff (off primitive), h (bloom). Numbers must be consistent across all components (e.g., l8, p8, p8off, l8h). The insert primitive name itself does not matter since it gets baked into the playfield, but the lightmap collection name and VPX link are critical. (niwak, sixtoe, tomate80, Iron Man)
Different light types use different prefixes: lamps use L prefix, flashers use F prefix (the toolkit adds 100 to the number, so F10 becomes light 110). The choice depends on how the ROM drives the light: solenoid-driven = flasher, lamp callback = lamp. GI lights are typically on a single string and baked as a group. For lit room rendering, use a dummy light with 0 power (e.g., l150). (niwak, sixtoe, Iron Man)
Movables Setup¶
Correct movable setup in Blender toolkit varies by object type:
- Flippers: Point straight up in Blender, apply rotation, copy start/end angles from VPX. Left flipper uses negative angles. Do NOT check "Use Obj Pos" for flippers.
- Gates, spinners, trap doors: Check both "Use as pivot" and "Use Obj Pos".
- Objects rotating on X or Y axis (not just Z): Must enable "Use Obj Pos" in the toolkit export settings.
(apophis79, flux5009, benji084, Haunted House; sixtoe, wylte, Scared Stiff)
The toolkit generates a MovableHelper sub called by the frame timer that synchronizes all lightmap primitives with their parent object's transform. When animating movable objects, always use the _BL array (superset of BM + LM prims), not just _BM. The _BM array only contains the base dark room primitive. (bhitney, Game of Thrones)
Static Rendering for Movables
Bakemaps only animate in live editor but not gameplay if the Static Rendering checkbox is checked. Static Rendering must be unchecked for movables bakemaps and lightmaps. Also must be set active in materials. This is a common mistake that breaks animation. (mcarter78, metated, Countdown)
Object Visibility: Hide and Indirect Only¶
Two visibility modes exist for VLM baking:
- Hide: The object is baked (receives correct lighting) but does not affect surroundings (no shadows cast on other objects). Used for moving elements like flipper bats and pop-up toys (Iron Monger, X-Men Nightcrawler).
- Indirect Only: The object influences scene lighting (reflections, shadows) but is not exported to VPX. Used for front glass, reference geometry, and objects that should affect baking but not appear as VPX primitives.
(niwak, Iron Man)
Pop-Up Toy Baking¶
For pop-up toys that rise from the playfield (like Iron Man's Iron Monger), split into two collections: top (lid/cap at playfield level) and bottom (body in raised position). The cap is baked at playfield level with all its lightmaps. The body is positioned at upper height with the "hide" checkbox enabled so it does not shadow the cap or playfield. If the lid is transparent, add a layer separator below it and declare it as the bake mask. The lid and any decals should be joined (Ctrl+J) into a single object before marking as "hide", otherwise the decal renders incorrectly. (niwak, sixtoe, tomate80, Iron Man)
Layer Separators for Transparent Parts¶
Layer separators are planes placed between transparent parts and what is behind them to enable alpha transparency rendering. The separator uses a premade toolkit material. Critical detail: normals must face the correct direction -- blue face toward the transparent part (pointing away from the camera/viewer), red face outward. Incorrect normals cause transparency to fail (parts render as opaque black). Each transparent collection must have its "bake mask" property set to the corresponding layer separator. Overlapping transparent objects must be split into separate non-overlapping layers (typically 2-3 layers needed). (niwak, flux5009, tomate80, Iron Man)
Modifier Handling: NoExp Convention¶
The VLM toolkit automatically applies Blender modifiers during export unless the modifier name contains "NoExp". Typical setup: a Solidify modifier (applied for export) combined with a Bevel modifier with "NoExp" in the name (rendered and baked but not exported to the VPX mesh). This keeps the exported mesh simpler while the bake benefits from the visual refinement. (niwak, Iron Man)
Batch Rendering Pipeline¶
The toolkit batch rendering pipeline follows a progression:
- 1K test batch (roughly 1 hour) to validate the setup
- 2K intermediate batches (roughly 2.5 hours) for iteration
- Final 4K batch (13+ hours depending on complexity)
Each batch is a back-and-forth between VPX and Blender. The toolkit auto-updates the VPX script on import but can break custom modifications. Always share VLM_Script_Helper.vbs with each batch. A 4K batch with split lighting takes 10-15 hours depending on number of lights and available RAM. If it fails partway through, multiple attempts can take days. Best to have a dedicated second computer for baking. (tomate80, niwak, sixtoe, Game of Thrones; oqqsan, flux5009, SpongeBob)
For high quality renders, use a noise threshold of 0.01 and 1024 samples. If renders look grainy or noisy, check that denoising is enabled and the noise threshold is not set too high. (benji084, apophis79, SpongeBob)
Apply Transformations Before Baking
When baked objects appear rotated or misaligned in VPX after toolkit import, the fix is to "Apply All Transformations" (Ctrl+A) to the object in Blender before baking. This resets the axis relationship without changing the object's visual position. Quick iteration technique: create a temporary collection outside VLM.Bake, move everything except test objects out, run a fast batch on just the problematic pieces. (apophis79, tomate80, Earthshaker; mechaenron, Stargate)
Script Helper and Auto-Update¶
The VLM toolkit generates a VLM_Script_Helper.vbs file during export that contains the lamp/lightmap hookup code. Lines with ' VLM comment at the end are auto-updated by the toolkit on subsequent exports, avoiding manual script tweaking. Forgetting to update the script helper after a rebake is a common cause of broken lightmaps. (tomate80, Iron Man)
When the toolkit auto-updates script, do NOT rename Lampz callbacks or prim names -- they will be overwritten. Remove VLM comments from lines you modify to prevent overwriting. (skillman604, flux5009, tomate80, Game of Thrones)
Texture Pre-Loading (VLM Warmup)¶
Toolkit exports "VLM_Warmup" primitives that preload textures to prevent frame drops at game start. These are automatically created (one per nestmap) and placed in the VLM.Visuals layer. The hide subroutine must be called from table1_init using the provided vpmTimer call. Without warmup, heavy frame drops occur in the first moments of gameplay as textures load on demand. (apophis79, tomate80, Game of Thrones)
Nestmap Packing and Resolution¶
How Nestmaps Work¶
The toolkit creates as many nestmap textures as needed (Iron Man used 14 at 4K). Each object is rendered separately at its configured resolution, then packed into nestmap images (max 8K per nestmap). Increasing one object's resolution does not enlarge other objects -- it just generates more nestmaps. (niwak, sixtoe, tomate80, Iron Man)
Set nestmap size to 8192 (not 256) to avoid hitting nestmap limits. A "Room" light collection with "Solid" bake mode is required to generate bakemaps. (apophis79, cyberpez, tomate80, Haunted House)
Playfield Resolution in Nestmaps¶
The effective playfield width in nestmaps often falls below 2160px (4K monitor width), causing visible quality loss. The playfield render height is independently configurable from camera renders. AI upscaling (chaiNNer with models like realesrgan-x4plus-anime, UltraMix_Restore) can improve nestmap quality post-render with no FPS impact. VPX auto-downsizes textures if they exceed GPU memory limits. WebP format limits sides to 16384px max. The playfield PF height can be set independently (e.g., 4296px for Bad Cats). Consensus: try 3000+ pixel wide playfield renders on final bakes. (redbone615, benji084, apophis79, tomate80, Earthshaker)
Nestmap Brightness¶
If a playfield appears too dark, a quick fix is to brighten the nestmap0 texture by clipping black levels by roughly 25 and slightly boosting brightness and saturation. VPX does not handle pure #000000 (black) values well in textures, especially for reflections. Raising the black floor avoids rendering artifacts and improves reflection quality. (supergibson, Space Station)
Memory Errors¶
The error "expected 'Image' type found 'Image' instead" during the nestmap process means the system is out of memory. Solutions: restart the computer, close all other applications, reduce render resolution, and try again. 8K nestmaps can cause performance and export issues on systems with limited RAM. (apophis79, Warlok)
GI (General Illumination) Lighting¶
GI Lighting Philosophy¶
Two competing lighting philosophies exist in VPW:
- Skitso's "dark ambient" approach: The table is illuminated solely by its own lights as if in a dim arcade, with careful transmit control so upper plastics/toys stay dark for 3D depth. Uses multiple GI lamps per bulb (3-4) for natural indirect lighting and soft shadows.
- Brighter environmental approach: Uses
shinyenvironmentfor proper metal reflections, which flattens the GI lighting but works better in bright rooms and VR.
Neither is wrong -- LUT selection and environment image significantly affect the final result. Tables should provide options (LUT changer, cabinet mode) to accommodate different setups. (o0skitso0o, sixtoe, benji084, Congo)
Three-Level Lighting Philosophy¶
Flupper's three-level system for pinball rendering:
- Low: All lights off, only environment map and area light highlights. RGB values 0-64, except metal reflections. Mimics a switched-off game in a bar.
- Medium: Inserts and GI on. Keep RGB below roughly 175 to leave headroom for flashers. Shadows should still exist, playfield not washed out.
- High: Flashers firing. Maximize glare, overblown colors, reflections without losing all detail. This only works if the medium level is not too bright.
Environment brightness should be tuned so the "medium" view is not too bright. (flupper1, Guns N Roses)
GI ON/OFF Implementation¶
For tables with baked lighting textures, GI on/off states require separate baked textures that swap via script. Create GION and GIOFF texture sets for each primitive group (playfield, cabinet, plastics, metals). Primitives are grouped in VPX collections for batch swapping. The playfield uses a flasher overlay technique for smooth fading rather than hard on/off swaps. Non-playfield primitives use 4-step image swaps (0%, 33%, 66%, 100%) for smooth transitions. A GI timer (interval 25-40ms) controls the fade speed. (oqqsan, tomate80, Lethal Weapon 3)
An alternative approach uses the GI OFF image as the base playfield, with GI-on sections overlaid as additive flashers. When GI is on, the additive flasher makes the playfield appear lit. For localized flasher effects, separate playfield-sized flasher images are used. (iaakki, benji084, bord1947, Indiana Jones)
GI-Responsive Material Fading¶
For primitives that should respond to GI state changes dynamically, create ON and OFF duplicate primitives with different depth bias values (+200-300 for OFF). Group into collections by material type (p_toysplastics, p_metalsposts, p_cab, etc.) with corresponding OFF collections. On GI change, iterate through ON collections swapping materials between opacity levels. (iaakki, Indiana Jones)
A simpler approach for aprons and similar surfaces: create a difference/mask image between GI-on and GI-off states of the object, duplicate the primitive, apply the mask image, and change the overlapping primitive's material color to match the current GI color. (iaakki, astronasty, Blood Machines)
GI Ball Reflections¶
Two methods for ball reflections from GI exist:
- Use VPX lights underneath the playfield that are invisible for rendering purposes but create ball reflections.
- Use very low intensity (0.2) with high falloff power on surface lights -- the light does not illuminate primitives visibly but reflections still appear on the ball.
Under-playfield lights are the simplest approach. VPX can only show 8 ball reflections simultaneously -- only set "show reflection on balls" for one object per visible light source, not every bulb. (iaakki, flupper1, Indiana Jones; apophis79, Dr Who)
For VLM grouped GI, the collection should NOT be set to cast ball shadows. For split GI lights (individual lights), each should have "Cast Ball Shadow" checked. This distinction matters for correct ball shadow rendering -- grouped GI creates an overly uniform shadow, while split GI lights create more natural per-light shadows. (apophis79, Lethal Weapon 3)
Ball shadow height setting: GI light zPos must not be too low. Set z to roughly ball center when resting on playfield -- typically 28 (ball at 25 when resting). Shadows only cast from lights at proper height. (apophis79, metated, Warlok)
The 3-Light Method for Plastics¶
Reworking GI lights around plastics using Schreibi34's 3-light-per-bulb method from the VPX lighting basics guide yields excellent results. Key discoveries: plastics must have "static rendering" unchecked for GI to pass through dynamically, light from below via the bulb height parameter works better than surface-height-assigned lights on elevated primitives, and DisableLightingFromBelow (DLFB) on plastics controls insert bleed-through but does not behave linearly at extreme values (0.9999 is problematic). (iaakki, benji084, Bad Cats)
Skitso's GI Lighting Approach¶
Skitso's approach uses 3-4 VPX lights per physical bulb for more natural indirect GI lighting: one small bright light at height 28-30 with visible bulb and high transmit value, a larger dimmer light at height 1 shaped carefully for correct shadows, and an optional third light at height 1 shaped to match the space under plastics to simulate bouncing light. Key settings: transmit values must be carefully checked, disable-light-from-below on areas that should not receive light. The modulate setting controls light "volume" (transparency) -- leave at 1 normally, use values like 0.9985 for subtle emphasis. (o0skitso0o, Lethal Weapon 3)
Ramp Modeling and Rendering¶
Wire Ramp Construction¶
Wire ramps are among the most challenging elements to model. The F14 wire ramps were rendered using Blender with the Octane renderer, producing what iaakki described as "the best looking wires I've ever seen." (flupper1, F14)
Wire ramps for Maverick were built in Future Pinball and then imported into VPX. Future Pinball has better tools for creating wire ramp geometry that can then be exported and used as primitives. (antisect, Maverick)
For building wire ramps from AutoCAD blueprints: trace the ramp paths from blueprints, understand blueprint slot notation (the slot width shows where the ramp plastic sits below the playfield and must be wider than the ramp so sides fit in). (tomate80, sixtoe, Last Action Hero)
Wire ramps can be reduced from 70,000 to 17,000 triangles with no visible quality loss. Perfect reflections are not needed for wire geometry. UV mapping gets messy after reduction but remains workable. (tomate80, sixtoe, Spider-Man)
For wire ramp poly counts in the final release, in-game wire ramps should be kept lower poly for performance. For final renders, a subdivision modifier can be added just for rendering (not exported) and works well with bevel modifiers. (tomate80, gedankekojote97, Street Fighter 2)
Plastic Ramp Rendering¶
Transparent ramps in VPX need correct material assignment, a refraction render probe assigned, and NoExp prefix on ramp objects in Blender to prevent export as solid. Ramp dirt/scratches can be added as an overlapping primitive with its own texture. (apophis79, benji084, tomate80, Godzilla SEGA)
For ramp textures, copy the Blender render output multiple times in Photoshop to reduce transparency and get a better refraction effect. One version works better in VR (less projected detail), another works better on desktop/cabinet (more projected detail). VR ramps do not need color -- a glossy, dirty texture with no color works best in VR because the environment provides the color information. (flupper1, Congo)
When preparing VPX-exported ramp geometry in Blender: merge vertices by distance to connect unmerged polygons from VPX export, remove internal faces that mess up materials, add a bevel modifier before subdivision, and add a subdivision modifier to smooth out normal/triangle issues. Clean modeling early prevents texture, rendering, and performance issues later. Multiple ramps can be combined into one object with one shared texture. (flupper1, benji084, Congo)
Transparent Ramp Materials¶
VPX 10.8 added support for colored/tinted transparent ramps with blurry transparency. For colored transparent ramps like Space Station's dark smoke-colored ramps, use VPX's refraction color material property rather than tinting the texture. This preserves proper light interaction and avoids baked-in color that looks wrong under different lighting conditions. (tomate80, Space Station; niwak, sixtoe, Guns N Roses)
Setting ramp depth to -100000 in VPX makes it render transparent to everything underneath. This is critical for VR where depth ordering of overlapping elements is essential. (flupper1, sixtoe, Maverick)
For stacked transparent ramps that cause cloudiness, set different depth bias values per ramp (e.g., top ramp -600, next -599, etc.). VR is "super mega ultra sensitive" to depth bias -- getting it right for VR guarantees flawless desktop/cabinet. (kingdids, sixtoe, benji084, Star Wars DE)
Enabling "Render Backfacing Transparent" on plastic ramp primitives significantly improves their appearance in desktop mode -- the back side of the ramp shows baked detail through the transparent material. However, this setting completely breaks ramps in VR. (benji084, Congo)
Refraction Rendering¶
Rendered transparent ramp refractions in Cinema 4D create pre-baked ramp textures showing artwork visible through clear plastic. Import ramp geometry and playfield into C4D, apply glass material to the ramp, and render from the table camera angle. Render time is under 10 minutes. The refraction effect must be baked into the texture since VPX cannot render real-time refractions through ramp primitives. (benji084, Bad Cats)
To create a fog or haze effect inside a ramp (like Scared Stiff's spider tunnel), use refraction probe roughness on the ramp material. Higher roughness values on the refraction probe create a frosted/foggy appearance. This is cheaper than volumetric effects and works well for enclosed ramp sections. (sixtoe, Scared Stiff)
Refraction thickness on central plastic ramps should be set to 1 or 2 to avoid duplicated decals. (tomate80, Johnny Mnemonic)
Collidable Primitive Ramps¶
Primitive collidable ramps can replace VPX ramps for better geometry accuracy with minimal performance impact. Requirements: a massively simplified mesh (cannot use full-quality visual primitives), 100% vertical ramp walls critical for correct physics, and triggers on ramps that need manual height positioning using reference walls since no VPX height information is available. Simple box-like square ramp meshes work best for physics. (sixtoe, flupper1, gedankekojote97, Bad Cats)
The recommended approach: use a low-poly collidable primitive hidden behind a high-detail visible primitive. Seams and edges in primitives cause physics issues. Get the ramp working with correct shot angles in VPX first using native ramps, then smooth and beautify in Blender. (sixtoe, tomate80, daphishbowl, Iron Maiden)
Plastic and Toy Modeling¶
Plastics Render Compositing¶
Three-pass render pipeline for realistic plastics: (1) Graphics layer with unaffected artwork, (2) Reflection pass with specular highlights on edges, (3) Refraction pass with distortion effect through the plastic. Layers are composited in After Effects. The bevel on plastic mesh geometry adds edge highlight realism. Final composite is imported as a single texture to VPX. (benji084, brad1x, Bad Cats)
Plastic Tracing in Blender¶
Technique for creating accurate plastic meshes: lay out all plastic scans in a single image at consistent DPI (e.g., 300 PPI at 35"x35"). In Blender, set the reference image to the same dimensions as the source image. Trace plastic outlines in Blender using the scans as background reference. Create a big square outline (same size as reference image) and merge with all traced shapes. Project UV to bounds -- the UV of traced shapes aligns exactly with the reference image. Apply plastic modifiers, then split shapes apart. Result: plastics are perfectly to scale with accurate UV mapping in a single operation. (benji084, Earthshaker)
Creating Plastics from Images¶
Flupper's method (the easiest way): prepare a black and white PNG of the plastic outline in Photoshop, open the PNG in Inkscape, convert to vector path, export as SVG, import SVG into Blender as a curve, convert to mesh, extrude for thickness. This avoids manual polygon tracing entirely. (tomate80, flupper1, Judge Dredd)
For plastics without using Blender: create a wall with thickness X, set the top as the decal and the side as transparent material. This does not look as good because you cannot get beveled edges, but it is simpler than the full Blender workflow. (sixtoe, Street Fighter 2)
Plastic Materials¶
For realistic plastic appearance in VPX: bevel/cap material should have very little roughness (almost none), very little reflection, and the edge itself should catch some light. For VPX, use 1-2 faced bevels to catch environment reflections (more bevels = less reflections). For C4D/Blender, more bevels look better. If pre-rendered with reflections, no bevels are needed in VPX, which improves performance. (benji084, flupper1, Police Force; benji084, Taxi)
Stacked plastics need individual refraction probes -- one per layer. Disappearing transparent parts indicate depth bias issues. If overlapping transparencies exist between ramps and plastics, split into separate groups with different probe numbers. (apophis79, sixtoe, mcarter78, Flash Gordon)
3D Scanning Toys¶
The workflow for getting accurate toy models via 3D scanning:
- Source the exact action figure used in the real machine (check eBay for the specific model)
- Scan with a 3D scanner -- initial scans typically produce 2.5M+ triangles
- Decimate to a manageable poly count for game use
- Bake normal maps from the high-poly original to preserve detail on the low-poly version
(its.me.dazz, flupper1, sixtoe, Iron Man)
Polycam app on iPhone XR (or higher) produces usable 3D scans of pinball toys. Use a paint brush extender to rotate the object rather than walking around it, ensuring even lighting. A Lazy Susan turntable works for smaller items. OBJ files can be shared via Google Drive. Polycam can also scan an entire playfield under glass -- the 3D scan is useful as a reference overlay in Blender for verifying ramp heights, angles, and flasher positions. (ebislit, Godzilla SEGA)
The Godzilla head was decimated from 100,000 triangles to 4,600 triangles for VPX use. Normal maps from the original scan preserve detail on the low-poly version. (tomate80, Godzilla SEGA)
AI-Assisted 3D Model Generation¶
AI image-to-3D tools were used for complex Medieval Madness toys (castle and dragon). The workflow: gather multiple reference photos from all angles, feed to an AI generation app, then manually correct proportions and details since AI models have flaws in detail areas. Apply real-machine textures as UV maps. For the dragon, separate body and wing photos from eBay listings gave clean reference without occlusion. (tomate80, apophis79, sixtoe, Medieval Madness)
UV Consolidation for Multiple Plastics¶
Pipeline for consolidating multiple plastic primitives onto a single UV map: lay out all plastic meshes in Blender/C4D, create a reference PSD showing each piece's UV position, have the artist draw/place graphics within the reference layout, then apply the single consolidated texture in VPX. Benefits: reduces draw calls, easier material management, single image swap for graphics updates. (benji084, brad1x, Bad Cats)
Core Parts Library¶
Niwak's core parts library contains 400-500 pinball assets (screws, nuts, posts, etc.) with low-poly versions under 400 tris. Setup: download the library, go to Edit > Preferences > File Paths, add the root directory as an asset library path, save preferences. The asset browser view then shows all assets with search, filter, and drag-and-drop with positioning helpers. All parts are modeled in inches -- scale accordingly when importing. (niwak, iaakki, BOP)
Watch Polygon Counts on Small Parts
Original locknuts in BOP were 17K polys each -- wildly excessive. Sixtoe remodeled them at 780 polys. A single screw primitive in Taxi had 10,216 faces and was 27 MB in the VPX file. For small hardware like nuts and screws, anything over 1K polys is excessive for VPX. (sixtoe, niwak, BOP; sixtoe, iaakki, Taxi)
Material and Texture Techniques¶
VPX Material Properties¶
Key material properties for VPX work:
- BlendDisableLighting (DL): Primary brightness control, typical range 40-200 for inserts
- Transmission: Controls how much light passes through; set to 0 for GI bulbs to prevent bleeding through primitives
- Depth Bias: Works like stacking a card deck -- lower or higher values determine render order. Layers in VPX have nothing to do with rendering order; they are purely organizational. Smaller depth bias numbers appear in front of larger numbers.
- Metal Material: Must be checked for metal objects, or they render as plastic/white
- Perfect Black (#000000): VPX uses this as a mask in some rendering contexts. Drop targets and other objects can look "dead" with pure black backgrounds. Fix: change black to near-black (#010101).
(iaakki, flupper1, Indiana Jones; sixtoe, Big Bang Bar; sixtoe, wylte, Tommy)
Texture Optimization¶
Opening PNGs in Corel Paint Shop Pro and re-saving reduced file sizes dramatically (70MB to 25MB for playfield images). The original C4D exports contained bloated metadata. Removing unnecessary alpha channels from textures that do not need transparency (like metal posts) reduces size significantly. A 670MB table was reduced to 450MB just from removing alpha from non-transparent textures. Only playfield (for insert holes), plastic ramp covers, and flasher overlays actually need alpha. (iaakki, benji084, Indiana Jones)
VPX 10.7 supports WEBP image format for significant file size reduction. Lossless WEBP reduced a 40MB playfield to 17MB. Converting an entire table to WEBP can halve file size. WEBP at 90% quality provides excellent results for most textures. LUT images should remain PNG as WEBP conversion may subtly affect color mapping. (benji084, sixtoe, iaakki, Indiana Jones; antisect, Maverick)
VPX Texture Re-Import Warning
When using "reimport from" in VPX to update textures, the old image data remains embedded in the VPX file, bloating file size. The correct approach is to delete all old images first, then import the new ones. (tomate80, Indiana Jones)
Normal Map Generation¶
Tools for normal map generation:
- Online tool: https://cpetry.github.io/NormalMap-Online/ (free, client-side, no uploads)
- CrazyBump: https://www.crazybump.com (lots of fine-tuning options, can export different map types)
For VPX normal maps rendered in Octane, use object space normal maps (the rainbow-colored map), not tangent space. Tangent maps produce no visible detail when rendered from the overhead camera. (benji084, embee1979, iaakki, Metallica; kingdids, Star Wars DE)
Normal maps do not work well with refraction for stippled/pyramid rectangle inserts. The solution is to model the actual geometry (many little pyramids) rather than relying on normal maps. Since these are baked for 3D inserts, polycount is acceptable. (niwak, Guns N Roses)
Subsurface Scattering¶
Flipper bats benefit from subsurface scattering in Blender materials rather than just AO. SSS produces more realistic translucency for the rubber material, especially visible when backlit. (flupper1, Guns N Roses)
Adding subsurface scatter to bumper cap shaders creates a brighter core light appearance through internal light diffusion. Easy to overdo -- start conservative and tune. (frank_enste1n, apophis79, Flash Gordon)
Ambient Occlusion¶
AO in Blender computes proximity to nearby objects (white=nothing nearby, black=contact). Useful for adding realistic dirt accumulation near posts, rails, and corners. Applied as procedural dirt to the playfield (visible under slingshots, outlanes, plunger lane) and also applied to plastics, metals, and flipper bats via a nodegroup. For screws on plastics, a transparent AO alpha texture plane underneath each screw simulates the shadow/dirt effect on top of plastics. Keep playfield brightness values between 0.05 and 0.90 to avoid fake-looking extremes. (niwak, flupper1, Guns N Roses)
The AO shadow flasher layer can interfere with insert visibility, creating unwanted bright/dark areas around insert holes. Cutting out insert holes from the AO shadow image using the playfield as an alpha mask is the only reliable fix. (iaakki, benji084, flupper1, Indiana Jones)
Shadow and Lighting Systems¶
Baked Flasher Shadows¶
Technique for sideblade flasher baking: render 8K bakes in Blender Cycles, then extract the flasher contribution using "difference" blend mode between lit and unlit renders in an image editor. GIMP has difference mode in layer properties. Result: flasher color can be changed at runtime to match GI color. Each DT state combination needs its own shadow variant (8 combinations for 3 drop targets, since 2^3 = 8). (iaakki, sixtoe, Blood Machines)
Dynamic Drop Target Shadows¶
Drop target shadows need all state combinations rendered. For 3 DTs, that means 8 combinations. Each combination is a separate shadow image controlled by VPX flashers. Best practices: set targets to "hide from others" in Blender, crop shadow images to minimum needed size (not full playfield). (iaakki, Blood Machines; apophis79, mcarter78, Flash Gordon)
GI Shadows via Flasher Layers¶
HauntFreaks' shadow technique: create a flasher layer with a shadow image cast onto the playfield (done in Photoshop). This is faster than shaping each VPX light individually and produces soft edges without hard lines -- described as "the cheap man's blender render." The shadow images are controlled by GI state and drop target hits via script. (hauntfreaks, Game of Thrones)
Dynamic Ball Shadows¶
If dynamic ball shadows appear as squares instead of round shadows, ensure that all ball shadow primitives (RtxBallShadow and RtxBall2Shadow) have the correct ball shadow image assigned. Use the latest VPW Example Table version for the correct shadow image. (nestorgian, wylte, kev_v, No Fear)
RTX ball shadow depth bias configuration: set normal ball shadow DB to 0, 1st RTX group to -5, and 2nd group to -10. These values are table-dependent but close-to-zero values work well as defaults. (iaakki, wylte, TFTC)
Pupillary Latency Effect¶
"Pupillary Latency" simulates how human eyes adjust to brightness changes. When GI turns off suddenly, the playfield should appear darker than it actually is for a moment, then inserts should appear brighter. Implementation: two slow-fading flashers at glass level controlled by Lampz that dim/brighten the table when GI state changes. Insert DisableLighting values are tied to the delayed brightness value. The final version used Lampz-controlled flashers for smoother transitions rather than additive flashers. (iaakki, Blood Machines)
LUT and Color Grading¶
LUT Environment Emission Scaling¶
Different LUTs need different EnvironmentEmissionScale values. Use a Select Case statement keyed on the active LUT to set appropriate emission scale. Brighter LUTs get lower values (2-3), darker LUTs get higher values (7+). (oqqsan, Black Rose)
A backlit display (monitor) cannot make daylight surfaces look real since in real life they reflect light. Dark mode is best for realism -- illuminate the playfield primarily with its own lights. LUT sets can increase this effect without losing details in darker parts. (endi78, Black Rose)
Blacklight Mode¶
Big Bang Bar uses LUT swaps for blacklight mode rather than rendering separate blacklight textures. This keeps performance manageable since many parts glow under blacklight and rendering all as separate emission meshes would be too expensive. Real blacklight tubes appear hot pink/purple in person but photograph as deep purple/blue. Photos are misleading. The team went with more blue to match the in-game blacklight bulb and to preserve the green cabinet artwork colors that would wash out under pink light. The RGB room color, table LUT, and topper bulb color all need to be coordinated. (apophis79, cyberpez, .rawd, Big Bang Bar)
AGX Tonemapping¶
AGX is a tonemapping approach that preserves color saturation in highlights better than Reinhard or Filmic. For VPX tables with pre-rendered lighting, AGX produces more natural-looking bright areas (flashers, inserts) without the desaturation that other tonemappers introduce. When using VPX's AGX tone mapper, colors can shift from what you see in Blender. Apply a LUT for color correction to match the intended art direction. (tomate80, Space Station; sixtoe, wylte, Scared Stiff)
EXR vs PNG Lightmaps¶
EXR (OpenEXR) lightmaps preserve HDR data that PNG cannot. EXR retains full dynamic range, so bright areas (flasher spill, insert hotspots) maintain vibrancy and color accuracy. PNG clips highlights, causing washed-out or flat-looking bright areas. However, editing EXR files risks losing HDR data. SDR nestmaps in WEBP format are safer to edit in Photoshop. (tomate80, Space Station)
Environmental Lighting¶
Environment Image Selection¶
The NF HDR environment image makes all metals appear flat grey with no metallic reflections, especially in VR. shinyenvironment3blur4 provides proper metal reflections and is the reliable default. Environmental images cannot be swapped at runtime via script. Some environment images add an orange tint. VPX itself adds a slight reddish tint even without a LUT -- can be corrected by white-balancing a clean LUT to a known-white area of the playfield. (sixtoe, benji084, Congo)
VPX Lighting Formula¶
VPX lighting is calculated as: environment image * day/night slider * emission scale value (assuming the two ancient VPX lights in lighting settings are switched off). The environment image scale and day/night slider are mathematically connected despite appearing as separate controls. (flupper1, Congo)
Blender Environment Setup (No HDRI)¶
An alternative to HDRI: use an environment cylinder with a regular room image, a square for the ceiling, and a square with a backglass image for backbox simulation. All objects emit light through the material emit node. Advantages: easier to control reflections by moving/rotating objects, no noise or firefly issues. The backbox image should be slightly desaturated. (Deleted User, Godzilla SEGA)
Milky/washed-out reflections on metal parts are often caused by the environmental HDRI image reflecting a bright spot. Fix: rotate the environment image around the Z axis to move the bright reflection away from problem areas. Turn off "transparent" in Blender render settings to see the environment room in render view, helping position the HDRI correctly. An HDRI with more black/white contrast (like a kitchen with windows) produces better reflections than a mostly-white room. (apophis79, sixtoe, Haunted House)
Blender Light Settings¶
For incandescent bulb power in Blender: #47 bulbs produce only 5% of power as light (47.25 mW from 945 mW total), and #44 bulbs produce 78.75 mW from 1575 mW total. These real-world values help calibrate Blender lighting for accurate GI rendering. (tomate80, wylte, niwak, Tommy)
Blender 4.2.2 added an exposure parameter for point lights that improves control over the light's area of influence. Previously, increasing point light intensity to extend reach would blow out nearby surfaces. The exposure parameter allows extending the falloff distance without proportionally increasing near-field intensity. (tomate80, Space Station)
Shadow softness in Blender is determined by light size (bulb radius). Multiple light sources in an enclosed space create light bounce, which means less contrast. (iaakki, tomate80, Tommy)
Rendering Software and Techniques¶
Octane Rendering¶
Critical Octane setup for proper color (fixes overexposed images): Kernel gamma 0.7, HDRI gamma 1.0 and 2.2 (if using two HDRIs). For bulb emitter materials, uncheck "visible on specular" to prevent the bulb shape from appearing as a hard reflection on plastics. (flupper1, tomate80, Judge Dredd)
The Octane denoiser requires an "Octane Render AOV" node in the compositor. Without this node, the denoiser will not work despite correct settings. (tomate80, bord1947, flupper1, Judge Dredd)
Two rendering approaches for VPX textures in C4D/Octane:
- Camera projection: Renders from a fixed POV, looks great from that angle but is POV-dependent.
- Baking camera: Renders onto unwrapped UVs, works from all viewing angles (essential for VR). Requires enabling "Use Camera Position" checkbox on the baking camera tag.
(benji084, kingdids, Star Wars DE)
Cycles vs Octane for Baking¶
Cycles does normal texture baking (rendering from face texture). The difference between Cycles and Octane: how the view vector is defined (which influences reflection). Cycles defines the view vector as the normal vector. Octane allows a "hacky" view vector from the camera, not the face. This hack is needed for baking glossy reflection. For traditional glossy reflection bake under Blender, a dedicated shader material node setup can be used instead of Octane. (niwak, iaakki, Twilight Zone)
Render Speed Reference¶
1920p render times for reference: GTX 1080 takes roughly 28 minutes, GTX 1060 3GB takes roughly 48 minutes. Rendering at 8192x8192 is possible but uses approximately 7GB GPU memory and takes roughly 3.5 minutes for ramp textures; 4096x4096 is safer for lower-end machines. (tomate80, sixtoe, Judge Dredd; flupper1, Maverick)
Blender to VPX Export Pipeline¶
Export Workflow¶
The correct workflow for building a VPX table with Blender visuals:
- Build all shots, ramps, physics, collidables, and mechanics in VPX first
- Export the entire table as a single OBJ file to Blender (all parts remain separately identified)
- In Blender, adjust materials, lighting, and bake textures
- Import baked primitives back to VPX one by one with their textures
- Hide all original visible collidables in VPX and overlay with baked primitives set as toys (no collisions)
Making tables in Blender first causes alignment and physics issues -- always start in VPX. (iaakki, sixtoe, scampa123, Blood Machines)
Mesh Corruption Fix¶
Corrupted mesh faces (faces spanning empty spaces, texture flickering in VR) can be fixed by triangulating faces when exporting from Blender. This is especially important for flat shapes with concave spaces. If the model looks correct in Blender but breaks in VPX, check the "Triangulate Faces" option on export. (tomate80, sixtoe, cyberpez, F14)
When exporting primitives from 3D apps to VPX, irregular-shaped objects (plastics, ramp covers) MUST have "triangulate" checked before export. Without triangulation, VPX uses a single point as origin for the polygon, causing textures to render incorrectly -- parts of wrong textures appear in gaps between polygons. (sixtoe, Indiana Jones)
Blender Orientation¶
Tables in Blender appear upside down when using viewport shortcuts -- this is correct and matches Bord's tutorial videos (set up -Z). As long as all objects share the same orientation, it does not matter. Using the same origin point for all objects makes alignment in VPX much easier. Camera view (Shift+A > Camera) shows correct orientation. (iaakki, tomate80, sixtoe, Blood Machines)
Import Scale Settings¶
Tomate80's standard Blender import scale setting is 10, done automatically in his workflow. Model everything at real-world scale in Blender, then scale on VPX import. Use the playfield scan as a reference plane in Blender for accurate positioning. (tomate80, Defender; tomate80, Space Station)
Mesh Optimization¶
For reducing polygon count on complex models without a full remesh:
- Merge by distance
- Limited dissolve with very low angle (maybe 0), optionally check "All Boundaries" (may break the model)
- Reset normals
- Clear sharp edges
- Re-mark edges
- Small bevel + weighted normals
For constant-thickness parts (plastics, metals), use a solidify modifier on a single-side shape. Decimate modifier can be applied to selected areas only rather than the entire model. VPX faces should be flat and convex for best results. (niwak, iaakki, freezy, BOP)
Flupper's modifier stack approach to reduce high-poly models (e.g., 100K+ tris to 2K tris): Solidify modifier slightly enlarges the model (thickness roughly 0.0007) to prevent holes, then Remesh modifier creates clean topology from the complex mesh. (flupper1, SpongeBob)
Re-baking a table through the updated toolkit can dramatically cut polygon count. Johnny Mnemonic went from 2,358,056 faces and 219 MiB GPU memory to 1,063,488 faces and 96 MiB GPU memory. (apophis79, tomate80, Johnny Mnemonic)
Backface Removal¶
The VLM toolkit has a backface removal option during export. Set to 90+ degrees for no removal (all faces exported), set to 0 to remove all non-front-facing faces. The backface culling setting in VPX: 0 means full backface removal (opposite of what you might expect), while 40 is considered the "sweet spot" for most objects. (niwak, Iron Man; tomate80, No Fear)
Playfield Mesh¶
Purpose and Setup¶
A playfield_mesh primitive imported at position 0,0 with size 100 replaces the flat playfield for ball physics. The name must be exactly playfield_mesh. Physics, material, and visibility settings do not matter -- they are all overwritten by VPX. Areas with no faces become transparent (automatic holes for kickers/scoops). However, the mesh is rendered statically, so DL must be set in the editor before game load. Misaligning the mesh even slightly causes insert lights to appear offset from their actual positions. (bord1947, Congo)
Playfield Mesh Is Static
The playfield_mesh is rendered as static, meaning DL must be set in the VPX editor before game launch -- it cannot be changed at runtime via script. This prevents dynamic GI effects on the playfield surface. A non-static playfield would also eliminate alpha artifacts in transparent areas. (bord1947, Congo)
Kicker and Saucer Holes¶
Bevel kicker holes in the playfield mesh (e.g., 3 for Police Force). Hole depth matches saucer object depth -- no bottom is needed as the VPX object handles that. Ball can lip out of saucers with the mesh. Use VP walls for ball containment below the bevel. (benji084, bord1947, gtxjoe, Police Force)
Saucer holes that are too large cause "whirlpool" action where balls orbit inside. The mesh hole diameter should closely match the physical saucer size. Testing on a cabinet is recommended for verifying correct feel. (mcarter78, tomate80, WCS94)
Scoop Geometry¶
A collidable scoop that works well for ball entry often causes problems for ball ejection (and vice versa). The key insight: the curve angle at the point where the ball first contacts the scoop determines bounce behavior. After multiple iterations, reshaping the scoop curve to approximate 45 degrees at the impact zone eliminated rebounds while allowing proper ejection. (clarkkent9917, Road Show)
VR-Specific Rendering¶
VR Room Creation¶
New RGB VR rooms use the same lighting technique as Toolkit tables: every room object is duplicated and baked with a light-on and light-off texture in Blender. A single white light texture is baked, then VPX manipulates its color and opacity via script. Room brightness ties to the table brightness setting in real-time. Total room size can be kept under 50MB. Include an Ultra-Minimal room option for lower-end PCs. (rawd, Big Bang Bar)
VR cab/room components that are set to visible AND static will NOT become invisible through script code when VRRoom=0. This causes clipping in desktop/fullscreen modes. Solution: set all VR components to non-visible and non-static in the editor, then make them visible with code. This ensures desktop mode is unaffected. (rawd, leojreimroc, Diner)
The VR room/cabinet needs a 6-degree rotation around the X-axis to match the natural slope of the pinball table. Without this offset, the VR room appears tilted relative to the playfield, breaking immersion. (sixtoe, Star Wars DE)
VR Room Optimization¶
VR room optimization guidelines:
- T2's mega room was reduced from 675K to 513K faces through optimization
- A topper model was 250K polys alone (nearly more than the entire table) -- reduced to roughly 30K with decimation and still looked good
- High-poly models (1.5M tris for Krusty Krab interior) cause editor crawl and performance issues
- Large textures (up to 12K for skyboxes) work in VR but cause memory issues in 32-bit VPX
(sixtoe, terryred, dardog81, T2; gedankekojote97, SpongeBob)
Reflections in VR require setting the table-specific reflection option to "Dynamic" with strength at 100 in table properties. This causes stuttering on some systems. Left off by default. VR supersampling may need to be reduced from 1.6 to 1.0-1.3 for performance. (apophis79, rawd, Big Bang Bar)
VR Ball Reflections¶
In VPX Properties, "Reflection strength" (e.g., 40) controls reflection of objects in the playfield including the ball. For VR, this must be set to "On" not "Default" because VPVR does not use the default value. (rawd, Diner)
Eliminating incorrect ball reflections in the plunger lane and upper playfield requires "hacky" placement of dozens of dummy lights positioned in the air at specific locations. The technique works by overriding the default light reflections with properly positioned invisible lights. Not a clean solution but produces visually correct results. (iaakki, Game of Thrones)
VR-Compatible Ramps¶
POV-baked ramps do not work in VR -- they reflect the playfield from a fixed angle causing breaks. Solution: use Flupper's procedural/flow textures WITHOUT playfield reflection -- just grey tones to place "in world." Transparency can be adjusted via materials. VR users see through transparent objects naturally so it works. (sixtoe, benji084, Spider-Man)
VR Backglass¶
For VR backglass depth bias issues (backglass disappearing when GI goes off), adjust depth bias values: BGBright at -500, BGDark at 100. Smaller depth bias numbers appear in front of larger numbers. (leojreimroc, iaakki, Blood Machines)
Forced perspective lighting baked into metals and glass in VR rooms can cause issues. Better to separate metals and glass and give them proper materials in VPX. This prevents unnatural-looking glare reflections. (rawd, Street Fighter 2)
Flupper Techniques¶
Flasher Dome Implementation¶
Flupper's flasher dome rig uses textures that always face the player/camera; the dome is rotated via script. The domes are symmetrical cylinders, so any rotation around the vertical axis works. The foot/base texture coordinates are mapped separately in the upper-left corner of the texture image. When making domes transparent, delete the back faces of the mesh so the texture does not tile onto the rear. The lit mesh should be slightly larger than the base mesh. A separate filament mesh inside the dome uses BlendDisableLighting to simulate the glow effect when flashing. (benji084, wrd1972, flupper1, F14)
Dome primitives benefit from a 90-degree cut -- splitting the dome into two halves so the texture maps correctly from all viewing angles. Without the cut, the limited texture (single-angle photo) stretches badly around edges. (robbykingpin, BOP)
An improved two-layer approach uses an inner layer with opaque material for the base dome color and light blocking, and an outer layer with transparent material for the glossy dome surface and reflections. (tomate80, Space Station)
Flupper Bumper Scaling¶
Flupper bumpers (radius 45, height scale 90) may be larger than a table's original bumpers, causing collisions with ramps. Fix: scale all elements in the 10-layer bumper by the needed factor (e.g., 0.94x for Radical). Alternative approaches: lower cap height, adjust ZSize to 0.9. (iaakki, cyberpez, Radical)
Flupper Insert Workflow¶
Flupper inserts can be copied between tables. For toolkit tables, mark Flupper insert models as "Indirect Only" so they affect reflections/lighting without being in the output bake meshes. Then cut insert shapes out of the playfield texture using a black/white mask (must be pure #ffffff for alpha). (fluffhead35, sixtoe, iaakki, Iron Man)
Glass and Visual Effects¶
"Mayo" Glass Effect¶
"Mayo" effect: subtle glass grease/dirt simulation using flasher objects over the playfield. Adds realism by simulating light interaction with imperfect glass. Controlled via intensityscale parameter. Keep settings very low to avoid being obvious -- every imperfection added brings realism. (iaakki, Godzilla SEGA)
Mayo Light Technique¶
"Mayo lights" are floating VPX lights placed above the playfield (at glass height) to simulate the effect of flashers hitting dirty/greasy glass. This adds a white light overlay that flashers at full power would produce on real machines. Balance levels carefully -- initial implementations were typically too bright. Some mayo lights may not serve a purpose if the real flasher is under an opaque object. (iaakki, sixtoe, apophis79, No Fear)
Playfield Dust Layer¶
The transparent playfield window (viewing the lower playfield in Haunted House) looked like a hole without any visual treatment. Fix: add a custom dust/dirt texture layer over the window surface. Opacity around 200-250 looks natural. Made optional in the F12 menu. The dust layer also helps avoid the need for computationally expensive fake reflections. (sixtoe, cyberpez, Haunted House)
Weathered Table Aesthetics¶
Use imperfection PBR textures as overlays (ambientcg.com under "imperfections") and procedural noise grime on plastic and rubber (wave texture for rubber smears). This creates convincing wear without requiring manual painting. (mcarter78, tomate80, Time Fantasy)
Backglass and Cabinet Art¶
Backglass Creation¶
B2S backglass creation: extract images from existing .b2s file, replace with re-drawn artwork, re-package. Animation layers in B2S correspond to lamp/solenoid states. For VR, the table may contain its own fully animated backglass separate from B2S. (brad1x, benji084, iaakki, Bad Cats)
Backglass format requirements: 16:9 aspect ratio for both the backglass image and the full image including speaker grill. Provide 2-screen and 3-screen versions in 4K. For 2-screen B2S, the DMD cutout area MUST be transparent (not black). (astronasty, rawd, SpongeBob; astronasty, scampa123, Die Hard Trilogy)
Translites are not native 16:9. Three approaches: shrink to fit (black bars), expand and crop (loses content), or shrink to fit then use AI to fill sides ("West-East growth"). The third option is preferred -- keeps the entire original image with AI-generated side extensions. (soundscape2k, Iron Maiden)
Art Direction¶
Art direction rules for backglass/translite work: do not mix photo-realistic and illustrated styles, use movie promo images and stills, and edit to your own style. (astronasty, joepicasso, Die Hard Trilogy)
Cabinet Components¶
Data East machines have powder-coated black siderails and lockdown bar, unlike the chrome rails common on other manufacturers. When importing rail geometry from other tables, ensure the material is changed to match the correct manufacturer. (sixtoe, Lethal Weapon 3)
Side rails and lock down bar should be kept as separate objects (in their own Blender collection) rather than baked into the "parts" primitive. When rails are part of the main parts mesh, they cannot be individually hidden -- which is needed for VR cabinet mode and for players who prefer to toggle rails off. (tomate80, sixtoe, No Fear)
Backbox Geometry¶
The backbox shape differs by manufacturer -- Stern vs Williams have different geometries. Backglass aspect ratios need to be correct: 4:3 for most, not 16:9 (which stretches characters). (tomate80, astronasty, Blood Machines)
Static vs Dynamic Rendering¶
When to Disable Static Rendering¶
Plastics set to static rendering and opaque material will not change appearance when lighting changes (e.g., GI going off). Fix: disable static rendering on all objects that should respond to dynamic lighting. Also set "disable lighting from below" to 1 for plastics that should not transmit light from underneath. (o0skitso0o, Diner)
Primitives with static rendering enabled cause floating lights in VR. Fix: untick "static rendering" on affected primitives. Cannot set static as a script option. (sixtoe, Radical)
VPX pre-renders static objects at startup. Setting the parts collection to static improves quality and performance but requires a table restart for light level changes. (niwak, sixtoe, Guns N Roses)
Depth Bias¶
Understanding Depth Bias¶
Depth bias works like stacking a card deck: lower or higher values determine render order. If two semi-transparent objects overlap with wrong depth bias order, the bottom one is hidden beneath the other. Depth bias does NOT hide an object that is physically higher from the view perspective. Layers in VPX have nothing to do with rendering order -- they are purely organizational. (flupper1, Indiana Jones)
Depth Bias Strategy¶
GI bleeding into insert primitives even when inserts should not be lit is a common problem. Depth bias organizes the "VPX sandwich" into layers. Bigger negative number = closer to camera. If GI is at 0, insert prims need -50 or more to punch through without GI affecting them. DLFB limits light from below; depth bias limits from above. (sixtoe, iaakki, Spider-Man)
For VR backglass: depth bias values like BGBright at -500 and BGDark at 100 work well. Smaller depth bias numbers appear in front of larger numbers. Depth bias is poorly documented -- "mess with numbers until it works." (leojreimroc, iaakki, Blood Machines)
AI Tools and Upscaling¶
AI Upscaling¶
For upscaling pinball artwork textures, Waifu2x (specialized for hand-drawn images) works well on playfield art, plastics, and backglass. Cartoon-style playfield artwork (like X-Men's comic book art) upscales particularly well with AI upscaling tools. The flat colors and clean lines of cartoon/comic art produce much better results than photographic or realistic artwork. (niwak, sixtoe, Ghostbusters; sixtoe, X-Men)
New AI-powered features in Photoshop work well for enhancing badly compressed JPEG images of playfield scans. (iaakki, Radical)
For nestmap upscaling, chaiNNer with models like realesrgan-x4plus-anime and UltraMix_Restore can improve nestmap quality post-render with no FPS impact. (redbone615, Earthshaker)
Rendering for Marketing¶
For Blood Machines' marketing flyer designed to look like a 90s pinball advertisement poster: tomate80 rendered the full cabinet in Blender/Cycles with multiple camera angles matching reference photos. Key details: cabinet leg angles matter (too straight looks like a "badly drawn horse"), use black matte powder coating on metals, model custom fire buttons with inscriptions, and ensure the backglass uses correct 4:3 ratio. The render was alpha-cutout PNG for easy compositing. (tomate80, astronasty, iaakki, Blood Machines)
Blender's backdrop room scene can be set up for rendering table backdrops with table, backglass, and themed assets. Render with Cycles for realistic lighting. (gedankekojote97, SpongeBob)
Playfield Mesh for VR and Physics¶
Playfield Reflection Probe¶
Playfield reflections can appear extremely faint if the bm_playfield mesh X/Y scale values are not 1.0 in Blender. After fixing the playfield mesh scale to 1.0 and re-exporting, reflections appear properly. BM_Parts reflection must be enabled for parts to show in reflections. Ball reflection strength and playfield reflection strength are coupled through the same reflection probe, making them hard to tune independently. (tomate80, flupper1, bhitney, Space Station)
Mirror Backwall¶
Mirror backwall using iaakki's method: flip normals in Blender for every primitive that should appear reflected. Each mirrored primitive uses the same UV map as the original. The process is manual for every lightmap primitive near the back wall. If UV maps change after a rebake, the manual work must be redone. VPX reflection probes have a distance limit for ball reflections. Mirror primitives with render probes still consume GPU resources even when invisible -- they must be disabled in script (remove render probe from primitive), not just hidden. (iaakki, apophis79, astronasty, Lethal Weapon 3)
When setting up reflection probes on primitives, the probe's normal direction must point in the correct direction for reflections to appear. The reflection probe XYZ values in VPX determine the normal orientation. Incorrect normals result in no visible reflection. Testing all combinations (010, 001, 0-10) may be needed. (apophis79, Lethal Weapon 3)
Miscellaneous Techniques¶
Boolean Operations in Blender¶
For Blender boolean holes in metal brackets: apply the boolean modifier first, then triangulate (at minimum the faces with holes), then unwrap, then export. The geometry around boolean holes can cause shading artifacts if not properly handled. (cyberpez, wrd1972, bord1947, BOP)
Screw Thread Optimization¶
Screw threads are extremely high polygon count if modeled geometrically. Instead, render the screw image into the post texture -- the screw mesh is never brought to VP. For translucent posts, this technique makes the screw visible through the plastic without adding geometry. (sixtoe, bord1947, BOP)
Lattice Modifier for POV¶
The entire table primitive can be tilted backwards in Blender using a Lattice modifier. This makes the lighting/camera angle match VPX cabinet POV. The modifier should NOT be applied when exporting primitives back to VPX. (tomate80, Judge Dredd)
Weighted Normals¶
The Weighted Normals modifier in Blender improves shading on hard-surface models (metal plates, machine parts) by weighting face normals based on face area. Combined with Solidify and Bevel (with NoExp) modifiers, it creates realistic-looking metal parts for VLM baking. (niwak, Iron Man)
Glass Transparency Node Group¶
The VLM toolkit includes a "Glass Transparency" node group that handles darkening from light passing through glass material. Plug it between the shader output and material output in Blender. This helps match the visual darkening that occurs on real tables viewed through glass. Apply to plastics and flasher dome materials. (niwak, Iron Man)
Boosting Lightmap Brightness¶
To boost brightness of a dark object without re-rendering: change the opacity of all lightmaps associated with that movable in the VPX editor to a value greater than 100. For example, setting a spinner lightmap opacity to 200 made it appear properly lit. Going too high will make objects appear to emit light. (apophis79, sixtoe, Johnny Mnemonic)
Camera Culling Fix¶
A ramp near the apron can be used as a hack to fix camera culling (VPX stops rendering planes parallel to the camera). This ramp must be set to non-collidable or it interferes with the drain path. (bord1947, Defender)
Playfield Gaussian Blur for Realism¶
Playfield softening technique: duplicate the playfield image layer, apply Gaussian Blur at 4 pixels. This subtle softening makes the playfield look more realistic at gameplay distance by reducing the hyper-sharp digital look. (flupper1, sixtoe, Judge Dredd)