OpenVAT is a Blender add-on that encodes Vertex Animation Textures (VATs) directly from animated geometry. Designed for real-time engine export (Unity, Unreal, Godot), it supports:
Curious to know more about VATS in general and this add-on was created? Check out my overview video: https://www.youtube.com/watch?v=eTBuDbZxwFg See why I’m excited about the latest 1.0.4 release: https://youtu.be/uZ4-0MxR3CU
For more information and engine integrations, check out the OpenVAT playlist - with videos from me and other creators utilizing the tool: https://youtube.com/playlist?list=PLxoaj1mvYohtaPyN0qmhTVHZJqLh8VTlt&si=sqy2aLo2mXc8-20J
Get the git: https://github.com/sharpen3d/openvat OpenVAT targets technical artists, shader developers, and studios aiming to bridge Blender simulations, procedural animation, or geometry nodes with performant in-engine playback.
Active Object or Collection (combined)OpenVAT Standard or CustomStart Frame, Current Frame, or Selected ObjectGiven target MyObject, results are stored like:
/MyExportDir/
└── MyObject_vat/
├── MyObject.png ← position+optional normal data
├── MyObject-vnrm.png ← (if separate normals)
├── MyObject-remap_info.json← min/max metadata
└── MyObject.fbx/.glb/... ← encoded proxy mesh
Immediately after VAT creation, a new object will be added to the scene as a copy of the proxy object with all modifiers stripped and the decoder modifier added. This will be added in the exact location as the active_object and is unselected by default. Hide or move the original and scrub the timeline or play the scene to see the vertex-encoded animation play.
-Z Forward, Y Up** Using tangent-space normal maps on VAT-animated meshes can be tricky. In most cases, it is recommended to use an object-space baked normal map for surface detail, and comine this with the animated VAT normal for proper surface lighting during deformation. This requires alteration to the default provided shaders.
Engine integrations are meant as example cases and templates, and may require modification for production use cases - feel free to reach out with integration questions and recommendations.
*forward rendering only, I am working on a custom vertex factory for a modern approach to handling VATs in Unreal, along with specific VAT creation options to better utilize VAT in Niagara systems. Currently OpenVAT works in Unreal 5 without forward rendering enabled, however this can lead to undesired lighting issues on the VAT when using lit materials.
Watch the walkthrough: https://www.youtube.com/watch?v=T1KVvUIduGI
-Download the zip from Engine_Tools/Unreal5 extract, then drop into the Content of your Unreal project (in system file explorer, not directly into engine UI)
-When you import your own vertex animation texture, make sure it's compression is set to RGB16
-Split your mesh on any hard edges before baking (ensure soft/hard edges are marked, and use automatic edge-splitting for best results), this allows soft and hard edges during vertex sampling.
-This was built in UE5, and is NOT UE4 compatible at the moment. The process is viable for UE4, but setup differs. Please reach out if UE4 integration is needed.
-Check the Github OpenVAT-Engine_Tools folder for Godot starter content. This is not integrated with a specific importer, but just requires manual entry of min/max values (similar to Unreal).
** EffectHouse
- As an integration test, I have created a TikTok EffectHouse compatible shader example, which can also be found in OpenVAT-Engine_Tools
A new Animation Data panel has been added.
⚠️ Important behavior notes
- Does not affect encoding: The animation definitions do not change which frames are baked. The full encoding range is still exported.
- No skipping: Defining animations does not “skip” frames in the bake or change how the VAT is generated; it only tags ranges inside the encoded data.
- Global frame ranges: Animation frame ranges are currently global scene frames, not relative to the VAT encoding start frame.
scene.node_tree to a version-safe path:scene.compositing_node_group and CompositorNodeTree.scene.use_nodes + scene.node_tree.get_scene_compositor_tree(...) – returns a valid compositor tree for the current scene.get_compositor_output_socket(...) – returns the correct output node/socket:Background and Foreground.use_premultiply = False.inputs[1] (BG), inputs[2] (FG).Fac = 1.0), and the Alpha Over output is always wired into the compositor’s final output socket.get_scene_compositor_tree(...) to obtain a compositor tree in 4.x and 5.0.CompositorNodeComposite being undefined in Blender 5.0 and keeps the unnormalize workflow stable.This extension does not require special permissions.
There are a couple reasons this can happen, specifically texture import settings in unity, or could be an issue related to your specific encoding setup. Likely, you should check the VAT texture compression in Unity is set to RGB 16 or Automatic (differs between Unity versions) and check that it is imported with max size matching the real dimensions of the export
Really cool add-on ! Thanks you so much :) I was wondering if you were going to implement a feature more focused on rigid bodies. In the context of a rigid body simulation, instead of baking each vertex position, could there be an option to simulate the pivot point (2 maps: position & rotation) of each piece of debris?
It’s possible, but from initial research it most likely requires RGBA for correct quaternion rotation. So Flexibility with rendering to Alpha channel has to come before this, and will take a fair amount of work outside of Blender in engine shaders- but yes, this is on the docket.
Its a good addon, very intuitive, although I'm having and small issue with the values when I import the model to unity, it seems all my vertex are displaced and it doesnt keep the shape correctly