Frequently Infrequent Art Updates

Hello everybody!

In this thread I’m going to post Art stuff. Most of its going to be about Battlescape but I’m also going to try and post about more general game art topics. Some updates might be more in depth but most will be short with some pretty pictures. Everything posted here will be work in progress, nothing will be final. For final assets we will try and create a fancy separate update.

As with Flavien’s update thread I’m going to lock this thread, discussion should take place in different threads.


Optimizing VRAM usage

The amount of vram used by the prototype was a major issue and it still is. Granted, we have more optimization to do engine wise but it still was and will be a problem for us. Planets easily gobbled up a few hundred MB. Add all the deferred rendering buffers and 4k+ textures you will easily hit the vram limit of most of the video cards currently on the market.

To add more content we need to lower the used vram. Engine upgrades will help but we need to look at the art assets and see how we can lower the amount of used vram. One point of attack is to no longer use unique per asset normal maps.

To get good detail out of a normal map you need it to be at a sufficiently large resolution and capture all the fine detail. Ideally you’d want it to be at 16 bits per channel as well to alleviate artifacts. Looking at our normal maps there are small bits of high frequency detail, but most of it is just a large “flat” area. Essentially useless data. Data that still eats up valuable vram.

Our prototype assets didn’t look to good from up close. So we need to raise the quality level, lower vram usage and do it without normal maps… Getting vram usage under control will be an ongoing process but there are some ways to make ships look sexier that we haven’t used for the prototype.

On to the first make stuff look better methods.

##Face weighted vertex normals (FWVN)

Without normal maps it will be hard to smooth hard edges, this is where manually edited vertex normals come in.

Left is a cube. To smooth the edges you can’t just add all faces to the same smoothing group (right). The mesh needs to be altered to create a cube that has flat looking faces but smoothed edges.

One solution is to add edge loops while keeping all faces in the same smoothing group. The extra geometry will make the automatic vertex normal generation give the edges a smooth look, while keeping the sides flat. There is an issue with the silhouette, but still good looking.

Another option is to chamfer the edges and manually edit the vertex normals so that they aren’t used averages of connected face normals. Weighting the face normal averages by face surface area gives you a much better smoothing solution:

That looks neat! Much less added geometry and while the silhouette still has issues its less off putting than with the added edge loops. A few more verts and faces and no normal map required. Great! If you look closely you will notice that the sides have a gradient. There is some very slight shading going on and this is to be expected. The normals are a weighted average. Lets take a close look at the vertex normals now. Here are some profiles of corners:

  1. Default smoothing
  2. FWVN
  3. FWVN with longer edges
  4. FWVN with a large chamfer
  5. Tool assisted normal generation

While 2 and 3 look the same there is a slight difference due to one corner having longer edges. This difference becomes very noticible in 4 where the chamfer is very large. It starts resembling default smoothing much more, as to be expected since the face surface area ratios come closer to 1:1. Only in 5, the tool assisted example, you can see that the normals are perpendicular to the side faces.

Lets take a look at FWVN and tool assisted FWVN with a more complex example.

On the left is the FWVN example and on the right the tool assisted one. Notice that the flat surfaces on the right are flat while on the left you can see some shading going on. A minor hit to vert/face count but it looks great, whether its tool assisted or not.

The FWVN tool

This is the tool I wrote. It contains a few handy shortcut buttons and a way to assign material ids to selected faces. It can apply a developer material to visualize the generation. Applying the correct material ids as you model always gets you good looking normals with the push of a button.

Left mesh has all faces assigned to the edge layer. Right mesh has the flat faces assigned to layer 1, while all the edges are assigned to the edge layer.


A bunch of warmups. :toot:

Currently working on cockpit modeling and working on art pipeline modernization prototypes.


Bought iPackThat, an uv packer. Gave it a spin. Nice results so far. Seems to produce atleast as good as manually pakced uv, most of the time much better. Generates in a fraction of the time a manual unpack takes. This is going to be a huge timesaver. Here is a repack of the bomber:

Working on updating the bomber for the prototype. Some wip shots of the external model with its base metal material. Model is still using the old art pipeline so its kinda going to be a rush job.


Working on bomber cockpit:

And look at these two:



Going to type up some words about cockpit stuff

The Hellion cockpit for the prototype was a mess. Incredibly complex materials, insanely high resolution normalmaps, using up to 5 uv channels for some meshes. We reached the level of detail we wanted but it was just a too complex and vram slurping setup for use in Battlescape.


Previously I’ve talked about dropping normal maps for hardsurface meshes to keep vram usage down. To make up for not using normal maps we’re using a combination of face weighted vertex normals (FWVN from now on) and detail decals. In the following image you can see that using FWVN we can have rounded corners with no normal maps.

To get back little detail doodads/greebles/nurnies we either have to model them in or apply a decal to the surface. Depending on the size and importance of a detail part it might be better to model them instead of using a decal.

The decals are placed with a simple mesh and a special material applied. The performance is high since no special rendering setup is required. Its just a material rendered last in the render queue with a slight offset and blending. No projection math needed.

And here is a picture of them in engine. You’ll notice the seam decal having some lighting errors when it goes over the ridge on the top part. This is due to the vertex normals of the decal mesh not being in sync with the base mesh. Something to keep in mind when placing them!


We’re a small team with a small budget. Using an asset creation process that saves time and is easy to use is a huge boon for us. Creating large unique textures and HP/LP meshes for everything is something we’d prefer to avoid.

For the cockpits (and maybe other things, we’ll have to test) we’re using a detail texturing setup similar to what DICE used for Starwars: Battlefront. Its a neat trick that allows us to pack all detail texture info into a single RGBA image.

Instead of using a mask texture where each channel determines the blend power per detail layer, we’re using a single channel in an image for the mask. This mask is multiplied by the number of detail layers -1 and used as the index into a texture array.

The detail textures are quite simple. You store the two normal channels required in RG, diffuse alteration in B and roughness alteration in A. In the material the diffuse and roughness are blended with the Photoshop linear light blend mode. This allows the detail texture to brighten and darken which keeps the average value the same. Using a multiply blend mode would be faster but would always darken the values.

I create the detail textures in Substance Designer. It helps balancing all the values to make the detail texture effect just powerful enough.

The per asset textures can be reasonably low res. At minimum we need basecolour, -roughness, -metallic, -ao and -mask. 7 channels in total so we just need two textures. This leaves one channel unused. It could be used for transparency or emissive depending on material needs.

Here are two images showing detail texture turned off and on. There are 5 detail layers, 4 generic surface detail layers and one weave layer used as a border.

The mask system does have a downside. You can’t smootly blend between detail textures and in the above image you can notice a border between the detail and weave layers on the left 3 patches. It is possible to use the unused per asset texture channel as a blend factor between two detail textures and the cost of some performance. Something I’ll have to experiment with.

Here is a pic of the cockpit texturing job wip.

Overall I think this setup will allow us to good quality level for the time we can spend on the cockpits. On to making more detail textures and decal details. Yay!