As a new year begins I’ve had the urge to take stock of things. Nothing too profound but I’ve been trying to optimise my workflow recently in an attempt to get more ‘bang for buck’ out of the time I’m spending on my portfolio. I’ve been using Blender for 3D work since being made redundant and I really appreciate such a great package is available for free. It’s been a bit of a learning curve and although I do miss some of the features from the expensive packages like Maya, it’s certainly got a few neat features of it’s own.
My wish list
Whilst learning to use a new package I got thinking about my usual asset creation workflow and if any of it could be sped up or automated. I made a list of desirable features my ideal workflow would contain:
- Rapid and accurate modelling process.
- Modular re-usable geometry features and textures stored in a ‘library’ of some form.
- Place-holder objects produced early for inclusion in the game engine.
- Easy placement of surface features on new assets.
- Work-in-progress visibility to allow for changes (iterative passes).
- ‘Agility’ – design changes should not be a big problem at any stage of creation.
- Accurate specular maps for ‘free’ based on the layers of the diffuse texture.
- Accurate small details Normal maps, again for ‘free’ based on the layers of the diffuse texture.
I’ve now started to use texture baking not only for Normal and Occlusion maps but also as a way of building up the Diffuse map. One benefit of this is that features can be placed on a model in an intuitive way rather than trying to position them in the correct place in a Photoshop file (UV’s can be at odd angles and disjointed shells mean that features have to be carefully aligned and masked in several places). I think its also a great way to work as it allows for design changes without too many problems.
An aspect I’ve always disliked about creating the Diffuse maps in a 2D art package is having large files with dozens of layers, it can become a nightmare to organise and keep track of what layer does what even with carefully grouping and naming. If changes are required to the model’s geometry and UV map it means shifting those elements around on the layers which is no trivial task. Many artists will be familiar with turning layers off and on trying to work out which feature is ‘Vertical Shut-line 7’ , etc. It’s a frustrating process and if a change drastically affects the all features you’ve carefully laid out in an image file, you can end up with a major headache.
Then there’s the UV seams vs warping issue to consider. Hiding seams in concave creases in the model is great when the model’s structure allows for it but sometimes it’s just not possible on quite curved geometry (where UV warping starts becoming a problem if seams aren’t used in the more obvious places on the surface). I found however that baking down over UV seams does a pretty good job of hiding them and you have to get really close up to notice them using this method.
The problems with Sub-Division surfaces
Baking Normal maps from Sub-Division surfaces is a quick way to produce the high resolution geometry and changes can be made fairly easily but they are not without their annoying little idiosyncrasies. The differences between the high and low res version of a model on curved creased areas can result in an ugly wavy effect on the bake that’s often just too obvious to be ignored and has to be corrected later in Photoshop (thereby causing hand-editing to be included into what should be an automatic process). It’s also a real struggle to maintain the flow of nice rounded sections when you want holes punched into them, you end up with horrible kinks in the surface that just don’t look that great. Nurbs are the better option in that regard, they can maintain the smooth flow better (as when you ‘cut’ the holes in them all you are really doing is hiding that portion of the surface). Triangle polys in sub-divs are another cause of kinks in the surface and removing them often means adding more edge loops, thereby adding more complexity into the geometry which in turn can cause ridges in the smooth surfaces that are fiddly to flatten out. I’ve heard a lot of engineers and architects still only use Nurbs for design work due to this kind of behaviour.
So why don’t I use Nurbs if Sub-Divs cause these annoying problems? Well I have considered using Sketch-up (because it’s cheap) which I believe uses Nurbs and I’ve seen some amazing detailed models created with it. I suppose it’s an asset re-usability and workflow issue mostly. Getting geometry out of Sketch-Up and into Blender could be done but only in polygon form and my PC would grind to a halt eventually. If Blender had better Nurbs support I’d look more seriously into using Nurbs. The short-comings with Sub-Divs could be worked around by converting to high res polys and manually tweaking the verts to iron out the ‘Normal Kinks’ but this goes against my idea of an agile workflow and any design changes later down the line are going to be more of a problem than if working from Sub-Divs.
I’ve been trying to come up with a good work-around for the problems with Sub-Divs and I’ve come to conclusion that maintaining a large smooth hull for the basic shape of the model and floating any complex geometry over the top is the ideal solution for me. It will allow surface features to be moved around easily and they can also be generically textured to some degree to help with the creation of the diffuse map later. The floating features need to be blended into the smooth hull at the edges but an alpha map does this nicely and quite complex looking structures can be created by layering features in this manner that would otherwise take quite a while to model into one continuous shell.
I’ve even taken this a stage further in some cases by pre-baking the complex features down to a flat poly and arranging these over the surface of the model. This allows me to hug the game resolution model more closely thereby helping to avoid misalignment on the resulting bake and also easily tile repeating features around the model on simple ‘ribbons’ of polygons. The only real problem I’ve found so far with this is with the ambient occlusion (or lack of it) between the features on the object as there’s nothing there for the renderer to see. This can be solved quite well by placing either the original geometry of the object or a simple proxy version just for the occlusion bake. These occurrences are few however and often aren’t required. In some ways unique ambient occlusion over the whole of an asset is also best avoided where sections of the asset can be reused to save on texture space.
The Diffuse and Specular maps
These two maps are obviously closely linked, one generally defines the other (unless it’s wet, etc.). Many times on a rushed project though, artists just take the diffuse map and fiddle with the levels in Photoshop for 2 minutes to create the specular map. This just isn’t the way specular maps should be created but doing them right usually means more time in Photoshop or some pre-planning.
The way I’m now trying approach diffuse maps is by firstly doing what I’ve always done in a way, by layering textures and elements together from a re-usable library of images to create the final map. How I layer them together however is where the workflow change comes in. I’m going to try and move towards layering them directly over the 3D model using polys in Blender rather than in a 2D art package and bake them down in a similar way to how the Normal maps are created.
The diffuse textures from a library will come complete with associated normal and specular maps, so the fine detail normal map and specular map I’ll get with minimal effort once the diffuse map arrangement is complete. The specular map should also be perfect in terms of correctly representing the reflectivity of each element of the diffuse map. Its this approach to creating the fine normals and spec maps that I’ve wanted to implement for a while now but never had the time to sit down and work out a good workflow to get the desired results.
The new order of things
I’m just starting to incorporate these changes into a new workflow but it’s seems pretty good so far. I’m going to write some code to automate the baking and then subsequent layering of the diffuse, specular and normal maps. I’ll be posting some work done using it in my gallery in the near future and I’ll report any problems or benefits I’ve encountered along the way.