Join the Shadow Venom's Workshop Discord Server!
Check out the Shadow Venom's Workshop community on Discord - hang out with 3270 other members and enjoy free voice and text chat.
ForgeLab
Things VAM did not have, built so that dropping them on an atom is the whole setup.
Things VAM did not have, built so that dropping them on an atom is the whole setup.
Or maybe some of these things did exist before, but even for me, they were simply too complicated to actually use.
Which is also why nothing here is a prop pack, and nothing here is a simplified version of something else: there was nothing to simplify. These are capabilities added to VAM, generated in code at runtime, with no Unity in the loop and nothing extra for you to install.
The design philosophy: two halves, and the whole point is that you never have to pick one
Plugins usually choose. Either it is simple and you find its ceiling in an afternoon, or it is powerful and you spend that afternoon reading before anything appears on screen. Refusing that choice is the shape of this entire line.
If you just want to play, it is already done. The test we hold ourselves to is specific: load the plugin, do nothing else, and the right thing is on screen. No asset to find, nothing to model, nothing to point at anything. If you have to configure it before it works, we got the defaults wrong, and that is a bug on our side rather than a step on yours.
If you are building something serious, the ceiling is a long way up. Nothing is hidden to keep a panel tidy, and no control gets deleted because the list got long. Every parameter is an ordinary VAM storable, so all of it is drivable from Timeline, from triggers, and from other plugins.
A player never meets the complexity. A creator never has to fight the simplicity.
| Plugin | What it is |
|---|---|
| Volumetric light you can see. Eight plugins across god rays, follow spots, full stage rigs and cold pyro, generated in code, spending none of VAM's six pixel lights unless you ask. | |
| Every kind of tail, in one plugin, with real physics. Drop it on a Person and it is already moving. | |
| Steam off her skin, water running down it, and room-scale volumetric fog that takes the shape of anything already in your scene. | |
| Glass that reflects the actual room, bends what is behind it, fogs over so you can wipe it with a hand, and breaks when you hit it. Flat, curved, or a tube around her. |
More in the line. Each one ships finished, plug and play, and measured.
V1.0
It reflects you. It bends what is behind it. It only lets you see the parts of her body she wants you to see. And it breaks.
Real glass, generated in code. Flat, curved, or a tube around her.
Drop it on an Empty and there is already something between you.
Part of ForgeLab by Shadow Venom.
The pane has gone soft with heat. Not opaque. Worse than opaque. It keeps a shape, a shoulder, the dark of her hair, and takes away every detail that would settle the question. She has been standing there long enough for the water to find its way down the glass in the slow, wandering lines that water actually takes, and each one that runs opens a clear stripe behind it, and closes again.
Then she puts a hand flat against it and draws it down.
Where her palm went, the fog is gone. A window the width of her hand, and behind it, in focus, wet, unhurried: her. The rest of the glass stays exactly as fogged as it was. She does not wipe the whole pane. She never does. She gives you the strip she decided on, watches you through it, and lets the heat close it again while you are still looking.
And when it does close, when there is nothing to see again, you find out the glass was never the safe part of this.
It gives when you push. And then it gives all at once.
Now count how much of that VAM cannot do. It has no glass you can put a hand through. Nothing that fogs and stays fogged where you did not touch it. Nothing that reflects the actual room instead of a cubemap someone baked in 2019. And nothing, anywhere, that breaks.
There are glass props. They are pictures of glass.
GlassForge is glass that reflects, refracts, fogs, and shatters: all of it real, all of it at runtime.
One plugin on one Empty atom. No mesh to find, no asset to place, no Unity, nothing to point at anything. Add it and there is a pane hanging in your scene with your room in its surface.
And every part of it can be switched off independently, including all of it.
Hit it. Physically. With her hand, a prop, anything with a collider.
Not a trigger you fire. Not an animation you play. The pane has colliders, the impact has an impulse, and the impulse decides.
You will probably find this out before you read any of it, because a pane that gets knocked on load will break on load, and the Rebuild button is right underneath. That is on purpose. It tells you in the first two seconds what kind of object this is.
There are two thresholds, and the gap between them is the whole feature.
Hit it below the first one and nothing happens. Hit it between the two and the glass cracks and stays cracked: a real fracture pattern spreading from the point of contact, frosted along the break, still one solid pane you can lean on. Hit it above the second and it goes.
So you can knock. You can crack it and leave it cracked for the rest of the scene. You can crack it three times in three places and then break it. Both thresholds are sliders in impulse units, which means "how hard" is a number you tune rather than a mode you pick.
The shards are real rigid bodies. Count per face, burst speed, and whether they collide with each other are all yours.
Which makes this workflow possible, and it is the one people are going to keep:
- Turn Freeze Settled Shards off
- Hit SHATTER
- Grab the pieces with your hands and put them where you want them: mid-air, on the floor, balanced against her
- Press Freeze Shards Now
Everything stops exactly where you left it and stays there. You have just used a physics simulation as a modelling tool, and the result costs nothing to hold.
Left on its default, shards freeze themselves a few seconds after they settle, which is the same saving without the arranging.
Condensation you can wipe with a hand, and water that runs down it.
Condensation is a full-surface fog with an amount slider, and it picks up the glass's own tint so fogged blue glass stays blue.
Touch Wipe is the part that matters. Anything that touches the glass clears it, and it clears along the contact path, not in a stamp where the hand ended up. Drag a palm down and you get the streak a palm makes. Drag a finger and you get a line.
Which means you can write on it.
Then it fogs back over
Re-fog Time decides how long the clear stays. Set it short and a handprint is gone in a few seconds, which is the version that reads as a hot shower. Set it to zero and the clear is permanent: anything wiped stays wiped, which is the version you want when you are drawing something you would like to keep.
And a rectangle you can place, for when you want a window
Fog Wipe Zone is a separate, authored clear area: position, size, and edge softness. Use it for the strip at eye height that someone already wiped before your scene started. It is drivable from Timeline like everything else, so it can open as the scene runs.
Wandering trails, not straight lines
The other half of a wet pane. Rain on a window, a shower running down the door. The drips wander, gather, and speed up as they collect, because water on glass does not fall in a straight line, and a straight line is the thing that instantly reads as fake.
Density, speed and size are three sliders. Set the speed to zero and they stop, which gives you glass that has been wet for a while rather than glass that is being rained on right now.
Each trail opens a clear channel through the condensation as it goes. Fog plus drips is the combination worth trying first: the fog is what hides her, and the drips are what keep taking little pieces of that away.
Not a cubemap. Not a probe. The actual room, from the actual angle.
The reflection is rendered from the mirrored position of whatever camera is looking at the glass. Walk sideways and the reflection slides the way a reflection slides. Put her in front of it and she is in it: the real her, the pose she is in now, the light she is standing in now.
Because it is a render and not a lookup, everything in your scene is in it. Her hair. Your Lumen Forge beams. The steam. Things behind the camera.
And it costs almost nothing, because it does not redraw every frame
A mirror only has to be as current as your eye can tell. Left on its factory setting the reflection updates on a gate, and on our bench that made it the difference between free and one whole extra render of your scene. There is a table further down with the exact figures and the one rule you have to get right.
There is also a Static mode, which renders once and then stops. For a mirror across the room, nobody has ever noticed.
Arc, or a full tube, with a real curved reflection
Two numbers turn the pane into an arc: an angle and a radius. Take the angle to 360 and it closes into a tube: a shower cylinder, a display column, a container with her inside it. Optional caps top and bottom (the bottom one is off by default, on the grounds that you would step on it).
The curve is real geometry, not a bent texture, so the reflection curves with it: it stretches along the sweep, wraps toward the edges, and does the thing curved glass does where the room smears as it goes round.
The width slider disappears when you switch to curved, because a curve's width is its angle times its radius. It is not hidden. It stopped existing.
3 to 9 flat panels, and each one can carry its own mirror
Set the shape to Prism and pick a side count. Three is a triangular column, four is a box, nine is close enough to a cylinder to read as one while still catching light in flat planes.
Then choose how the reflection handles it:
Faceted: each panel gets its own mirror, aimed by its own normal. Walk past a box and the four faces disagree with each other exactly the way real glass panels do. This is the one that looks expensive.
Curved: one shared reflection blended across the whole shape, for when you want the prism to read as a cylinder rather than as facets.
Faceted mirrors are ranked by what is actually facing the camera and capped by a budget you set, so a nine-sided prism does not quietly ask for nine renders of your scene.
And every panel is a separate breakable face, so a prism does not shatter as one object. It comes apart a panel at a time.
True optical refraction, with thickness that means something
Switch on refraction and what is behind the pane stops lining up with what is beside it. An arm crossing the edge of the glass breaks at the boundary and picks up again, offset. Step back and the offset changes. It is the single cheapest way to make a viewer believe there is a physical object in the way, because it is the thing a painted glass texture can never fake.
Physical Refraction scales the effect by the pane's actual thickness, so a 3 mm window barely disturbs anything and a 5 cm slab throws everything sideways. Thickness is a real dimension of the mesh, not a shader constant. Thick glass is thick.
There are two ways to feed it, and the choice matters more than it looks:
- Transmission Camera: a second render of the scene from behind the glass. Correct at any angle, sees things that are off the edge of your screen, and costs a full render.
- Screen Grab: samples what is already on screen. Free, and honestly indistinguishable for a window you look through straight on. It cannot show you what is not on screen, which matters at grazing angles.
There is a genuinely counter-intuitive interaction between refraction and condensation that saves a whole render. It is in the technical section, because nobody would find it by guessing.
One slider, for when you have more than one transparent thing
Transparent surfaces in VAM draw in an order, and when two of them disagree you get the classic bug where the fog is in front of the glass from one angle and behind it from another.
Render Queue is a plain slider with the same range VAM's own clothing uses. The default sits at exactly the value the ecosystem pins standard transparent surfaces to, so it composes correctly with water surfaces and volumetric fog out of the box. If you have something unusual, you move it.
Small, unglamorous, and the difference between "these two plugins work together" and "these two plugins fight".
This is the shower door that Steam Forge was missing. Steam coming off her, water running down her, room fog in the air, and now a pane between you and all of it, fogged from the same heat, with her handprint in it.
They were built to sit next to each other. The render queue slider above is why they compose instead of arguing.
- Add an Empty atom
- Add GlassForge to it
- There is glass. Move the Empty to place it.
That is the whole setup. Everything below is optional.
- The panel is four tabs (Shape & Look, Optics, Wet, Break), and the tab strip shows a filled dot on any tab that is currently doing something, so you can see the state of the whole plugin without opening it.
- BUILD / REBUILD GLASS and SHATTER are always visible at the top, on every tab.
- Changing width, height, thickness or a curve rebuilds automatically a moment after you stop dragging.
- A control that needs something else switched on stays visible, greys out, and says what would wake it up. Nothing is hidden to keep the panel tidy.
- Every parameter is an ordinary VAM storable, so all of it is drivable from Timeline, triggers, and other plugins.
The bench, the method, the numbers, and where something did not resolve, it says "did not resolve" rather than "small".
Glass is one of the easiest things in a real-time renderer to make expensive, because the obvious implementation renders your scene again for every effect. So this was built around measurement, and several of the design decisions went against the first guess.
Every claim below points at a row. MEASURED is a reading off the bench. DID NOT RESOLVE means the difference was smaller than that comparison's own measured noise, which is not the same as "small", and we are not going to blur the two.
The machine
8K is deliberate. Four times the pixels of 4K, sixteen times 1080p. For anything that costs fill-rate that is a stress test rather than a typical setting, which is exactly why we measured there.
The run
The method
A measuring tool drives the whole run unattended: it sets a configuration, lets it settle, samples, writes a row, and moves on.
| Item | Value |
|---|---|
| GPU | NVIDIA RTX 5090 |
| Render resolution | 7680 Γ 4320 (DSR 8K), fullscreen |
| MSAA | 4Γ |
| Pixel lights | 6 |
| VSync | off |
| Scene | Fixture room, one pane, camera parked, VAM UI closed |
| Baseline frame time | 3.49 ms with every GlassForge switch off |
8K is deliberate. Four times the pixels of 4K, sixteen times 1080p. For anything that costs fill-rate that is a stress test rather than a typical setting, which is exactly why we measured there.
The run
| Configurations | 72 |
| Passes over all of them | 5 |
| Settle before each sample | 20 s |
| Sample window | 15 s (β 4,000 frames per row) |
| Then, unattended | 5 h 54 m soak at factory settings |
The method
A measuring tool drives the whole run unattended: it sets a configuration, lets it settle, samples, writes a row, and moves on.
Frame time, never FPS. Frame time is linear, so it can be added and compared. FPS cannot be averaged honestly.
Every row repeated five times, and the spread is what decides. Each comparison is measured against the repeat-spread of the two rows involved, in their own conditions. A single global "noise floor" is the wrong yardstick: a row driving an extra render is noisier than one sitting idle, and a quiet row must not lend its precision to a busy one.
Every row restates what it depends on. Rows inherit state from the row before, so a row that only sets the one thing it is testing is measuring the leftovers of its neighbour.
The pass/fail criteria were written before the numbers were read. Every "must change" was paired with a "must not change". If the thing that was supposed to sit still moves, the run is void, not interesting.
Every row proves the feature actually ran. Live counters ride alongside the frame times: shatters completed, wipe contacts registered. A feature that silently stopped running looks exactly like a feature that is free, and the second one is good news, so nobody checks it.
UI closed, camera parked. VAM's own open panel costs frames. Measuring with it open measures the panel.
The price is the number of extra scene renders
Every optical effect here works by drawing your scene again from somewhere else. That is the cost. Almost nothing else registered.
Cost of a scene, over a plain pane MEASURED
The most expensive thing on this page is not a setting
A second camera that can see the glass cost more than every quality dial on the panel put together. If you are running a WindowCamera or a mirror rig that also frames the pane, that is where your budget went, not in the resolution dropdown.
The counter-intuitive one: turning a feature ON makes it cheaper MEASURED, twice
Condensation needs to know what is behind the glass. With refraction off it gets that from a dedicated render; with Screen Grab refraction switched on, it uses what is already on screen instead, and the extra render goes away.
β If you want fog, switch refraction on and set it to Screen Grab. You get the refraction for free and the fog gets cheaper. Two independent runs six weeks apart agree on this.
Every optical effect here works by drawing your scene again from somewhere else. That is the cost. Almost nothing else registered.
| What asks for an extra render | How often |
|---|---|
| Reflection | At the rate you set |
| Refraction on Transmission Camera | Every frame |
| Condensation, even with refraction switched off | Every frame |
| Each additional camera that can see the glass | Multiplies all of the above |
Cost of a scene, over a plain pane MEASURED
| What you are building | Reflection | Refraction | Cost |
|---|---|---|---|
| A window you look through | off | Screen Grab | free |
| The factory setting | gated | off | +0.02 ms |
| A shower door (fog, wipe, drips) | off | Screen Grab | +0.02 ms |
| A mirror wall | Realtime | off | +0.14 ms |
| A display case | gated | Transmission | +0.17 ms |
| Everything at once | Realtime | Transmission | +0.26 ms |
The most expensive thing on this page is not a setting
A second camera that can see the glass cost more than every quality dial on the panel put together. If you are running a WindowCamera or a mirror rig that also frames the pane, that is where your budget went, not in the resolution dropdown.
The counter-intuitive one: turning a feature ON makes it cheaper MEASURED, twice
| Configuration | Cost over a plain pane |
|---|---|
| Condensation on, refraction off | +0.15 ms |
| Condensation on, refraction on, set to Screen Grab | free |
Condensation needs to know what is behind the glass. With refraction off it gets that from a dedicated render; with Screen Grab refraction switched on, it uses what is already on screen instead, and the extra render goes away.
β If you want fog, switch refraction on and set it to Screen Grab. You get the refraction for free and the fog gets cheaper. Two independent runs six weeks apart agree on this.
The mirror can only refresh while a frame is being drawn, so it refreshes every frame, or every second frame, or every third. Never anything in between. What you set is a ceiling; what you get is whichever of those falls under it.
That makes the boundary sharp instead of gradual:
And the gated settings do not separate from each other DID NOT RESOLVE
Static, 30 and 60 were indistinguishable on the bench. Choose by how the reflection should look (how stale you are willing to let it get), not by cost.
That makes the boundary sharp instead of gradual:
| Your scene runs at | You set | The mirror redraws | You save |
|---|---|---|---|
| 55 fps | 60 | every frame | nothing |
| 55 fps | 54 | every 2nd frame | half |
| 55 fps | 30 | every 2nd frame | half |
| 90 fps | 60 | every 2nd frame | half |
| 90 fps | 30 | every 4th frame | three quarters |
A rate at or above your frame rate is not a gate at all. You are paying the full Realtime price while the panel says Custom Rate.- Once you are below it, stop worrying about the number. At 55 fps, 54 and 30 are the same thing.
- If you do not know your scene's frame rate, use 30. It is below almost anything anyone plays at.
And the gated settings do not separate from each other DID NOT RESOLVE
Static, 30 and 60 were indistinguishable on the bench. Choose by how the reflection should look (how stale you are willing to let it get), not by cost.
These did not clear their own measured noise. That is not the same as "cheap": no difference was found at all. Set them entirely on how they look.
The mirror resolution row is the one worth internalising: a 4096 mirror is not a performance decision. Set it as high as looks good.
| Setting | Range tested |
|---|---|
| Mirror resolution | 512 β 4096, gated and at Realtime |
| Mirror anti-aliasing | 1Γ β 8Γ |
| Transmission resolution | 512 β 4096 |
| How much of the screen the glass fills | distant β filling the view |
| Frozen vs live settled shards | both |
| The whole bathroom line on top of the factory scene | fog + wipe + drips together |
The mirror resolution row is the one worth internalising: a 4096 mirror is not a performance decision. Set it as high as looks good.
The average frame barely moves when a pane shatters. Reporting it that way would say "shattering is free", and that is false. The entire cost lands in one frame.
80 is the highest setting that still fits inside a 60 fps frame on this machine, which is why it is the default.
The 300-shard figure has been measured on two independent runs six weeks apart: 56.5 ms and 55.4 ms. It is the most reproducible number in the product.
| Shards per face | That one frame |
|---|---|
| 40 | ~8 ms |
| 80 (the factory setting) | ~13 ms |
| 160 | ~26 ms |
| 300 | ~55 ms |
| A 9-sided prism at 80 per face (720 shards) | ~89 ms |
80 is the highest setting that still fits inside a 60 fps frame on this machine, which is why it is the default.
The fixture room is deliberately light. On a busy scene the same shatter lands on top of a longer frame. Treat 80 as a ceiling rather than a starting point.
Shard count is per face. A prism multiplies it. The 720-shard row above is the factory 80 on a nine-sided prism, and it is a visible stall.
The 300-shard figure has been measured on two independent runs six weeks apart: 56.5 ms and 55.4 ms. It is the most reproducible number in the product.
Just under six hours at factory settings, fog and touch wipe running continuously. 1.5 million wipe contacts were registered over the session.
An overnight run is the only instrument that catches the failures which do not exist yet at minute one: a leak, a drift, a stutter that grows.
And one thing the soak taught us about our own instrument
The fixture's own "frames over 16 ms" counter read zero for all six hours, while the measuring tool's per-minute maximum said otherwise. Both were right: the counter uses a short rolling window and the tool takes the maximum over the whole minute. But it means that counter cannot detect a rare hitch, and a clean reading from it proves nothing. Two instruments watching the same thing is how that surfaced.
| What was watched | Result |
|---|---|
| Memory floor, hour by hour | Flat. Three of the six hours landed on the same value. |
| Average frame time, start vs end | Unchanged |
| 95th percentile, start vs end | Unchanged |
| Stutter growth | None |
| Garbage collections | 4 in six hours, the engine's rather than the plugin's |
An overnight run is the only instrument that catches the failures which do not exist yet at minute one: a leak, a drift, a stutter that grows.
And one thing the soak taught us about our own instrument
The fixture's own "frames over 16 ms" counter read zero for all six hours, while the measuring tool's per-minute maximum said otherwise. Both were right: the counter uses a short rolling window and the tool takes the maximum over the whole minute. But it means that counter cannot detect a rare hitch, and a clean reading from it proves nothing. Two instruments watching the same thing is how that surfaced.
The panel was rewritten late in development: four tabs, and every visibility rule moved into one place. That is exactly the operation that leaves controls behind, so three checks ran before release:
None of that is visible in the plugin. It is the reason the plugin behaves.
Every control was checked for whether any visibility rule exists for it at all. It found three that were visible and did nothing in a reachable state, one of them in the factory default state, which is the first thing every user would have seen. The fault in that class is never in one control; it is in the relationship between two, so reading them one at a time cannot find it.
The whole performance table was re-run and compared against the pre-rewrite run, as distance-from-baseline so the two runs' different sampling regimes cancel. 45 comparable rows, none got more expensive. And the comparison itself was verified first: rows inherit state from the rows before them, so every shared row's effective state was diffed between the two tables to confirm they were comparable at all.
The public API was frozen deliberately. 62 parameter names and 21 dropdown values become permanent on release, and renaming one afterwards breaks other people's scenes silently. They were checked against everything else on the atom for collisions, using a control that could demonstrably have failed.
None of that is visible in the plugin. It is the reason the plugin behaves.
In the order that actually helps:
Things that are not settings, on purpose
There is no quality preset and no performance tier. A tier that lowers resolution would be selling you something we measured as free, and
a preset whose every step cannot be pointed at a measured row is a decoration.
- Count the cameras that can see the glass. This is the whole budget. One is free-ish; two is the most expensive thing here.
- Decide gated or Realtime. This is the second and last decision that costs anything.
- If you want fog, turn refraction on and set it to Screen Grab. Cheaper than fog alone.
- Set resolution and anti-aliasing on looks. They did not resolve.
- Leave shard count at 80 unless your scene is light, and remember it multiplies on a prism.
Things that are not settings, on purpose
There is no quality preset and no performance tier. A tier that lowers resolution would be selling you something we measured as free, and
- VR has no numbers. Every figure on this page is flat-screen, and none of them should be read as applying in VR: a mirror refresh renders once per eye, and a headset's frame rate is low enough that the rate gate crosses fewer of those steps. What exists instead is field observation: GlassForge has been run in VR repeatedly through development with no perceptible stutter or anomaly, including alongside heavy volumetric fog. That answers does it break, which is the question that decides shipping. It does not answer what does it cost, and nothing here pretends otherwise.
- Anti-aliasing 2Γ vs 4Γ specifically was never priced. The default is 2, and the whole anti-aliasing axis read flat everywhere it was measured, but no row measures that particular step. That is an argument, not a measurement, and it belongs in this list rather than in the tables.
- More than two cameras was not measured. Two was, and the second one was already the most expensive item on the page.
- Several GlassForge instances in one scene was not measured.
- The fixture room is light on purpose, so costs could be attributed to the thing that caused them. Isolation is the right way to attribute a cost and the wrong way to conclude it is small.
- Screen Grab refraction cannot show what is not on screen. At grazing angles you will see it. That is the trade for it being free.
- Shards are rigid bodies. A few hundred of them in a scene that is already heavy on physics is a physics cost, not a rendering one, and it will not show up in any of the rendering numbers above.
v1.0
First release.
To everyone in the VAM community who keeps building things nobody asked for. And to whoever it was that first put a pane of glass in a scene and then wished they could break it.
Part of ForgeLab. Each one ships finished, plug and play, and measured.