Mods / FrameForgeTSR
- Tags:
- Author:
- SalemStyles
- Side:
- Client
- Created:
- Aug 2nd at 12:17 PM
- Last modified:
- Aug 2nd at 12:33 PM
- Downloads:
- 109
-
Latest release (for Vintage Story 1.22.0-pre.1 - 1.22.6, potentially outdated):
zzzzzzFrameForgeTSR_v2.5.1.zip 1-click install
Final Frame Studios Presents: FrameForgeTSR
What it does:
FrameForge TSR is a client-side performance and rendering mod for Vintage Story designed around one basic idea:
Make the game render less expensive frames, then use modern reconstruction and sharpening techniques to make those frames look better than you would expect.
This project has been a many-month-long development effort that originally grew out of the techniques and rendering systems I developed for my VS TrueScale 128 HD texture project this is mainly meant to go with that mod https://mods.vintagestory.at/vstruescalehd . That project needed a way to render a heavily upgraded HD texture environment at a lower internal resolution and then reconstruct the image back to a much higher-quality final frame.
FrameForge takes those ideas and turns them into a runtime system for Vintage Story itself.
Instead of simply lowering graphics settings and accepting a worse-looking image, FrameForge uses temporal upscaling, jitter, frame history, sharpening, anti-aliasing, adaptive resolution, and custom shader processing to recover detail after rendering at a lower internal resolution.
The result is intended to be:
Less rendering work → more available GPU headroom → reconstructed image → better performance without simply making the game look worse.
The mod also includes a collection of runtime performance systems that work independently of the game's normal rendering options. These include adaptive view-distance controls, storm/weather performance protection, particle management, AO/SSAO controls, bloom handling, and other rendering/runtime optimizations.
The performance systems were designed to use different mechanisms from OptiTime, so they should generally be able to coexist rather than attempting to modify the exact same systems. That said, Vintage Story's rendering pipeline is complicated, so if you find a specific combination that causes problems, please report it.
One of the reasons I built this in the first place is because I personally run Vintage Story on hardware that is... let's politely call it a potato. My stronger machine spends a lot of its time doing development work and running extremely long upscaler training sessions, sometimes for days at a time. 😅
So this isn't a theoretical "maybe this helps performance" project. A major goal has always been making the game playable on hardware where the normal rendering workload becomes difficult, without completely sacrificing image quality to get there.
How it works:
The main system is Temporal Super Resolution (TSR).
Rather than treating every frame as an isolated image, FrameForge uses information from previous frames along with controlled sub-pixel jitter and depth information to reconstruct the current frame.
This is fundamentally different from simply resizing an image with bilinear or bicubic interpolation.
A traditional resize essentially asks:
"What color should this larger pixel be based on the pixels around it?"
Temporal reconstruction can instead use information from multiple frames, motion/history information, depth, and shader calculations to determine where detail should actually belong.
FrameForge uses this temporal information to reconstruct edges and fine detail while the game is rendering internally at a lower resolution.
The mod also includes several selectable upscaling, anti-aliasing, and sharpening modes. Some of these are ports/adaptations of techniques from publicly available research and open-source implementations, including AMD FSR1-style processing and other established reconstruction/sharpening techniques.
The exact result depends heavily on the selected combination of:
- TSR quality
- TSR scale
- Temporal jitter
- History weighting
- Reactive strength
- Upscaler mode
- Anti-aliasing mode
- Sharpening mode
- Edge detection/edge treatment
- Sharpening strength
- Adaptive resolution settings
There are also multiple sharpening options because different textures and resolutions benefit from different amounts of sharpening. Too little sharpening can look soft, while too much can create halos and ringing, so these controls are intentionally exposed.
Anti-Aliasing
FrameForge also provides its own AA processing.
There is an SMAA option as well as an upgraded FXAA path that replaces the normal vanilla FXAA processing when FrameForge is handling that stage.
Important:
If you are using FrameForge's FXAA/AA processing, do not also enable the game's normal FXAA option, or you can end up stacking the two systems.
Ambient Occlusion
FrameForge also contains additional AO/SSAO controls, including strength, radius, bias, and related runtime controls.
These systems may eventually be moved or integrated more deeply into our upcoming Radiant Ruins shader project, so some of this functionality may evolve as that project develops.
Runtime Performance Systems
There are also two important performance systems outside of the actual upscaler.
Adaptive View Distance
FrameForge can dynamically adjust rendering distance depending on where you are.
It can treat environments differently, including:
- Forests
- Dense foliage/canopy
- Caves
- Indoor areas
- Open environments
The goal is to avoid spending the same amount of rendering power on distant geometry that is barely visible while maintaining normal view distance where it actually matters.
Storm Protection
The Storm Protection system is designed specifically for expensive weather conditions.
Rain, snow, sandstorms, and other weather effects can create large temporary rendering costs because of the number of particles and effects being processed.
FrameForge can respond to these conditions by reducing the cost of those systems client-side.
Depending on the selected settings, this can involve things such as:
- Reduced weather rendering distance
- Reduced particle counts
- Reduced heavy-weather particle counts
- Ambient particle reduction
- Particle pooling
- Particle limits
- Weather-specific performance thresholds
- Separate handling for heavy storms
The goal isn't to simply turn storms off.
The goal is to make them less expensive to render when they become a major performance spike.
Adaptive Resolution
FrameForge also contains an adaptive resolution system.
Instead of always rendering at one fixed internal scale, the renderer can adjust its internal rendering resolution based on performance targets.
This allows the mod to spend more GPU power when there is headroom and reduce internal rendering cost when the GPU is struggling.
The reconstructed image is then returned to the game's final rendering pipeline. being worked on currently** I am trying to make it smoother and more natural.
How to make it work:
There are a few important things you need to do before using FrameForge.
1. Open your Vintage Story client settings
Find:
glContextVersion
Set it to:
4.6
FrameForge uses compute shaders, and the required compute-shader functionality will not work correctly if Vintage Story is running with an insufficient OpenGL context.
If you do not have OpenGL 4.6 available, this mod is not going to function correctly.
2. Back up your saves
This is a client-side rendering/performance mod and should not be modifying your world data, but please back up your saves anyway.
Any mod that hooks deeply into the rendering pipeline deserves a little caution.
3. Set your Vintage Story resolution to 50%
This one is important.
Before entering your world, set your game's resolution scaling to 50% from the main graphics menu.
Then leave it there while using FrameForge.
FrameForge has its own internal resolution scaling and reconstruction system. It takes the lower-resolution render, processes it, reconstructs it, and sends the resulting image back through the rendering pipeline.
If you change the game's resolution scaling after FrameForge is already running, you can cause the internal scaling calculations to become mismatched.
So:
Main menu → Graphics → Resolution Scale → 50%
Then leave it alone.
Yes, you are absolutely welcome to experiment with it.
No, I cannot promise that it won't make the renderer do something extremely cursed. 😂
4. Open FrameForge's menu
The FrameForge configuration menu is opened with:
SHIFT + ,
That's Shift + comma.
There are multiple configuration tabs containing the TSR, upscaling, sharpening, performance, storm protection, AO, and runtime settings.
5. The presets are conservative
This is important because the default presets are intentionally designed to be conservative for lower-end hardware.
The mod is not intended to stop at a 50% internal render scale.
If your hardware can handle it, you should experiment with the FrameForge resolution/upscale controls and increase the reconstruction target.
The system is designed around upscaling the lower-resolution render back to the game's final resolution.
So if you have the GPU headroom, don't assume that the conservative preset is the maximum quality the system can provide.
Compatibilities and Incompatibilities:
FrameForge modifies several parts of Vintage Story's client-side rendering pipeline.
Because of that, it will most likely conflict with other shader/rendering mods that attempt to modify the same rendering stages.
FrameForge was specifically developed with our upcoming Radiant Ruins shader project in mind, and the two are being developed to work together.
Other shader mods may or may not work depending on exactly which rendering stages they hook into.
You are absolutely welcome to try combinations, but if two different mods are attempting to take control of the same render stage, shader, framebuffer, or post-processing operation, things can get interesting very quickly.
OptiTime
The performance systems in FrameForge were designed to operate through different mechanisms from OptiTime, so FrameForge and OptiTime should generally be stackable.
That said, there are a lot of variables involved in a modded rendering pipeline, so if you find a specific combination that causes instability, visual problems, or unexpected performance behavior, please report it.
Graphics cards
FrameForge was primarily developed and tested on NVIDIA hardware.
That does not mean it is NVIDIA-only.
It means that NVIDIA is currently the hardware platform I have had the most opportunity to test on.
If you are using AMD or Intel graphics and encounter shader compilation problems, visual artifacts, crashes, or unexpected performance behavior, please let us know.
The more hardware configurations we can test, the better we can tune the system.
And please be patient with us while we do it.
How to report bugs:
If something looks wrong, please send us information that lets us reproduce it.
The most useful things you can provide are:
1. A screenshot
If the problem is visual, take a screenshot.
Especially useful for:
- Flickering
- Ghosting
- Trails
- Strange sharpening
- Broken transparency
- Incorrect AO
- Upscaling artifacts
- Weird particles
- Missing geometry
- Weather problems
- Anything that simply looks... wrong
2. Your client-main.log
Please include your client-main.log when reporting rendering, shader, or runtime problems.
3. Tell us what settings you were using
If possible, include:
- GPU
- Vintage Story version
- FrameForge version
- TSR mode
- Upscaler mode
- AA mode
- Sharpening mode
- Resolution scale
- Other rendering/shader mods
- Whether OptiTime is installed
The more information we have, the less time we have to spend playing detective. 😅
Also, please remember that FinalFrame Studios does not use AI to write or generate our fixes.
That means when something breaks, an actual human has to investigate the rendering pipeline, reproduce the problem, figure out what the hell Vintage Story is doing, write the fix, test it, and then release it.
So fixes can take some time.
Please bear with us.
Special thanks:
A huge shout-out to Coriaender for helping me understand how to get compute shaders working properly inside Vintage Story.
Without that knowledge, FrameForge would not have been possible.
Seriously — big credit where credit is due.
Magic_Oldie also deserves a special thanks for relentlessly bugging people into helping, performing the first initial tests on the early versions, and providing feedback and insight while the system was still very much in the "what the hell did I just break?" phase of development.
And a massive thank-you to everyone over at Farms and Forges for helping test this project and for being one hell of a stand-up community.
If you're looking for a friendly Vintage Story server/community, go check them out:
You can also reach me through the mod development community here:
Thank you to everyone who has tested this, reported bugs, provided feedback, or simply put up with me breaking the renderer for months while trying to make it faster.
This project is still evolving, so if something isn't working quite right, let us know.
We'll keep tuning it.
AS ALWAYS feel Free to buy us a coffee :D
| Mod Version | Mod Identifier | For Game version | Downloads | Released | Changelog | Download | 1-click mod install* |
|---|---|---|---|---|---|---|---|
| 2.5.1 | frameforgetsr | 109 | Aug 2nd at 12:21 PM | zzzzzzFrameForgeTSR_v2.5.1.zip | 1-click install | ||
|
This is the working stable version so far it will be updated with further runtime settings and optimizations as we develop it more in the future. | |||||||

Trying this out in hopes of improving FPS while in forests, unfortunately it seems to drop forest distance to the incorrect distance (96 when I set it to 192), and does not automatically reset view distance back to the default I have set. Also not noticing any improvement in FPS even when the view distance is set very low, like 64, which would normally improve my FPS significantly. Let me know if there's anything I can do to improve this, thank you for your efforts!
Checking again, noticing a slight improvement with other settings but still trying to get the FPS down to 60. Mod seems to target 30 FPS, as it always seems to hover around there.
Thanks for the feedback! I am actually going to be releasing an update I have been sitting on and testing, so I will look into these issues and see what I can do about them and get them added in :D Thanks for the support and for taking the time to test this!
I believe this was around the 1.22.3 area when I released it, so it definitely needs a bit of updating in a few areas.
EDIT: Doing some testing now, as I was running into a few issues where some things weren't firing properly. I have also fixed most of the hitching and issues with the Auto Render Distance. It should work much more fluidly in forests now.
I also found that it wasn't firing properly in caves or indoors, or was only working sometimes, so I'm looking into that as well. I'm also adding a few runtime processes that I had already planned and have been working on.
What could really help me track down the remaining issues, though, is your current mod list and your
client-main.log. The current issue I'm looking into is GPU headroom. If you're running a heavy shader, or using my texture pack alongside a heavy shader, it's going to be pretty costly.Unfortunately, this mod can't magically give GPU headroom back when the GPU is already being heavily used by an atlas, shaders, or both. I'm looking into this as well to see if there is some kind of solution that could make shaders or texture packs cost less, especially when you have a lot of mods adding to the texture atlas.
But give me a few days to test everything and finish up the update. :D https://discord.gg/VwrjBSuWu
So, optifine is okay- I'm assuming Optimum isn't? This new description is simultaneously more coherent but also a lot more daunting to read through haha. I got through a lot more of it this time! The very short of it is that it is a mixture of frame gen integration and adapting settings on the fly?
Yeah that's actually a pretty good way of describing the general idea with one important correction FrameForge isn't frame generation
It's primarily temporal reconstruction/upscaling + runtime rendering optimization It renders internally at a lower resolution uses temporal jitter/history and depth information to reconstruct the image, then applies the selected sharpening/AA/upscaling processing On top of that there are separate systems for adaptive resolution, view distance, particles, storms/weather, AO, etc
As for OptiTime vs Optimum: OptiTime and FrameForge were designed around different systems, so OptiTime is the one I'm reasonably confident about stacking with.
Optimum is a different story. I havn't tested it , and after looking through Optimum's current implementation, there is considerably more overlap. Optimum itself now has FSR1 resolution scaling, shader/rendering optimizations, particle handling, culling, lighting optimizations, frame pacing, etc., so I don't want to tell people "yes, they're compatible" without actually testing the combination
In other words I would currently treat FrameForge + Optimum as untested/experimental rather than saying it's outright incompatible.
And yeah I agree the new description is still a bit daunting. I'm trying to explain what the thing actually does without turning the page into a computer science textbook. The short version is basically:
FrameForge = temporal reconstruction/upscaling + adaptive rendering + a bunch of client-side performance systems designed to reduce how much work Vintage Story has to do each frame.
The full description is mostly there for the people who want to know exactly what the wuwu code magic is doing. But Optimum is its own fork I believe of the games own engine so it isn't a mod "Optimum ships as source. You build it once against your installed copy of Vintage Story, and the installer produces a self-contained Optimum folder with a launcher that patches copies of the engine assemblies the first time you run it, then caches the result for instant launches after that. Your original Vintage Story install is never touched."
Oh and the adaptive resolution is still being worked on so if it doesn't work properly yet let me know I am tryin to find a way to make that one work more dynamically.