Tell me about your art asset pipeline?

Hi, let’s talk about asset pipeline.

  1. What middle format do you use for models? DAE? FBX?

  2. How your import process is organized? .bat file? custom Blender script? Importing models through the editor one by one?

  3. Have you fixed z-up problem or you just rotate all models? :slight_smile:

  4. How quick you can make changes into your models? And how often you do?

  5. What format you storing textures in? What format you converting them in for in-game use?

  6. Is this an automated process? And how if it is?

  7. What version control solution you use for your code and assets?

Right now I have no automation. I used to have .bat file that launches AssetImporter with every model added to it by hand, not cool. Using mostly FBX. Converting textures by hand. I use png when lazy and DDS when I need custom mip-maps or compression. I’m using git, pushing imported assets into it. I never had a lot of assets in my projects, but now I feel I should invest a bit of time into it.

So would like to hear anyone on this forum. What is your method and what do you think of it?

But especially I want to summon @Dave82, @Enhex, @Modanung, @szamq, @JTippetts

1 Like
  1. Blender file
  2. Import though editor
  3. Have no problem with rotation, they are same as in blender
  4. Modify editor in blender, export through the plugin into urho internal folders makes auto refresh
  5. png
  6. No, My game uses about 30 models its not much to do one by one. An hour?
  7. Mega sync, and manual backups through freefilesync
1 Like

When you finally have all your models in game, all you do is spend time in editor and place prefabs to make levels. I made maybe 5 imports form blender through last year

1 Like

My answer is almost identical to szamq’s, with the exception that I use Mercurial (hg) for my version control, for both code and assets (I probably shouldn’t for assets, or I should at least have a separate repository from my code, but I it do anyways). I also don’t use the auto-refreshing of his answer to 4, but I’ve thought about it before (I’m not sure it would work great for me, though, as some of my assets are node prefabs, and I don’t think those end up reloaded, though I’m not certain…).

I will say, unlike szamq, I do not use Urho’s editor for much – I use blender to create even the node prefabs, and I modify them by hand as needed (or in code, depending on what it is). I do use Urho’s editor a little bit when messing with materials, and for particle effects, and also for a bit of debugging stuff (making sure I’m not creating extra nodes and failing to remove them when I transition to a battle, and things like that).


Using Models are saved in Blender’s file, exported directly to urho’s .mdl.

Open the original blender file, make changes, export, copy output to the game data directory.

My main concern is loading time. PNG is super slow to decompress so I only use it for small images, and for the rest I use TGA (huge but should be faster to load than PNG). This is a place that can see improvements, there are formats designed for fast loading, and that’s the most important thing - file size is 1 time download, load speed is every time you launch the game or load a level.
You could also use urho packages with LZ4 which is fast loading compression, though your users wont have easy access to the files if you want to support modding.

I don’t have automation for exporting models since it’s a 1 time thing and I have few.
I do have automatic in-memory(not creating files) material generation for level textures since there are many of them and they all use the same simple materials.

For code Git.
For assets I just keep backups.


My process looks a whole lot like everyone else’s. The Blender importer makes things pretty easy for me.

I can make changes fairly rapidly. Levels themselves are procedurally generated, so I don’t need to manage things on the scene level.

All my textures are PNG, stored directly in my bitbucket git repo.

Nothing in my process is really all that automated, to be honest. My game isn’t super asset-heavy, though. I do have a script that can take a batch of diffuse textures and a batch of corresponding displacement textures, and combines the displacement to the alpha channel of the diffuse, and a few other simple command-line tools, but that’s about it.

1 Like

Whoa, thank you all for sharing your insights. Right after writing this post I learned about Blender export plugin. How came I never knew about it?

You are importing .blend file through the editor? I found it to working poorly, it breaks all the normals and stuff.

Yeah, I want to figure out what size of prefabs I need for my project, wall segments? rooms? whole buildings? To save time and nerves.

That’s interesting. I want to try it.

Why don’t you export right into wanted directory? :slight_smile:

Aren’t DDS is an ultimate solution? I messed with ImageMagick (console app, not library) a bit, and now I’m thinking about making a script that will check textures sources folder for updated files, converts them and puts into game data folder.

Woo AUTOMATION! :slight_smile: Does it use ImageMagick? What language you use for this sort of thing?

no direct export:
I manage my assets externally, so the blender files don’t have hardcoded path to a specific game.
Also some assets’ license require protection so I need to pack them from a different directory.

AFAIK DDS files are lossy, while PNG & TGA are lossless.
DDS should be much faster, but I was worried about quality loss and didn’t give it a shot yet.
Also DDS isn’t completely “clean”, it uses patented compression algorithm and require OpenGL extension (tho that isn’t a real problem).

Not ImageMagick, though I do use that sometimes, mostly for when I help my wife with her work. Usually, I use my own custom tool, it’s a Lua interpreter that embeds my noise library and some other useful stuff. Most of my automated tools and texture generators are Lua.

In the documentation it is only briefly mentioned under Tools, but on the forums I’d say it’s been the default recommendation for over a year. I guess you missed those topics.

Oh, and yeah, I use it too. :wink:

1 Like

I must say that DDS is conatiner, not a format.
Compression and 'lossiness" is the feature of DXT image format.

1 Like

Hey , Sorry for the late reply !

1 . Mostly i use my own models (made in 3ds max) so i export them directly to Urho. In some cases if i have to import an external model i prefer the .obj and .x for importing.Since these formats tend to be backward compatible so i don’t need to update the importer plugin for this.

  1. As i mentioned i use 3ds max most of the time.There are lots of other tools i use but everything is done mostly in 3ds max,I wrote a complete scene exporter for max back when i used irrlicht. So when i swithed to Urho3d i had 2 choices : either write another scene , mesh , etc exporter for max or write a Urho3d importer.I decided to go with the 2nd option.Since it is lot easier to write code in c++ than fiddle with a notepad-like editor and maxscript.

  2. I convert coordinates at export level.

  3. Since i use completely my own formats i could say the changes can be exported in seconds.I make any modification to a model and press ONE button on my exporter and everything (textures , models ,material etc) are placed in the game’s directories ready to use.
    The only difference is in skinned models.I prefer to export them in x format then use AssetImporter to convert them to mdl.Well this is a bit slower but still way faster than write a complete mdl exporter for max.

  4. I store almost all my textures in psd and use png , dds , bmp formats in game.

6.Well unfortunately not.This is the only part where i must do everything manually.Some of my textures are built from 7-8 layers.I edit layers , contrast , hue ,etc then i save it in png.If the final texture looks satisfing i save it in psd.Sometimes i go with different versions of the same texture so i end up with different psd files for the same texture (brick01_dark , brick01_dirt01 , brick01_dirt01b etc)

7 currently i don’t use any version control system , i use some dirty manual backup to different usb flash drives(simply overwirite the older files) which seems fast enough so right now i’m happy with it.

1 Like

Currently building an asset pipe in my spare time, so these are more current vs ideals right now:

  1. I use Maya so .ma and .fbx, but thinking of a different approach here, maybe alembic/cortex/usd/gltf and procedural tweaks in a Gaffer graph. I want independence from any proprietary DCC app if I can!

  2. Working on the Gaffer windows port so it’s all just nodes and python in a nice pipeline UI which can be run to export on-demand.

  3. Y-up is the one true up, get rid of that 3dsmax while you still can

  4. I want to change them constantly and want automation and QC checks, so considering Pyblish for Maya followed by Gaffer for procedural modification and then export to game at build time.

  5. Textures ideally in .exr or .tif linear-space with ACEScg primaries (maybe krita for WIPs), and OpenImageIO/GafferImage to convert into a custom format I’m working on (maybe google’s AV1 i-frames for compression), with ISPC to convert to a GPU-compressed format either online or offline as well, depending on platform.

  6. Working towards this yes for a full game (gaffer execute -script build.gfr)

  7. Considering either git-lfs or subversion, but there isn’t really a good solution out there here for assets, do you store actual versions side-by-side for WIPs in version control or just override the one file and keep versions in history? Thinking a WIP repo and a runtime repo could be done here maybe…

But yeah lots of these are ideals, would like to make it work one day… :slight_smile:


My 3D workflow is usually as simple as export with Urho3D-Blender.

Blender file data (assets) can be unpacked in relative or absolute filepaths.
Urho3D-Blender is nicely flexible in where it can put exports.
I use symlinks for flexible asset location.

Sometimes I have made slight modifications to produce the exact XML I want.
Whatever needs processed on whatever workstation, it’s generally child’s play with Python. :snake:

1 Like

My blend files update frequently & generally contain lots of unused meshes, so the Blender exporter works good for my situation:


  1. Will occasionally import complex multi-part objects using the Urho3D editor.
  2. Certain animated characters don’t play nice and I have to do Blender -> DAE -> assetimporter. Exporting multiple animations this way is a huge headache. Thankfully I don’t have many characters.