I feel like you can shoot this after printing it out...
And yes, these video are made using the standard unity pipeline but we will release soon also the HDRP version. Stay tuned!
Hi khiree.taylan, the projects could run in multiplatform. The graphics showed in these videos are made using a gtx 1070 but soon we will release also the mobile version :)
Weapon Artist Malte Resenberger-Loosmann kindly shared his workflow covering low and high poly, UVs, baking setup, basic material setup in Substance, rendering in Marmoset and more!
Hi, my name is Malte Resenberger-Loosmann and I am a freelance 3D artist. For 9 years in the games industry, I worked on several mobile, browser and AAA games. I always had a keen interest in visualization and design and soon I figured out my excitement for hard surface weapons modeling. I have learned so much during my time in the industry and wanted to make a contribution as well, so I decided to share my personal workflow.
Idea and References
Usually, I start thinking of which weapon is kind of unique but almost every weapon was modeled by someone. So I often decide to add a personal touch to it to make it unique. During the video games I play or movies I watch I often see a special weapon of interest which triggers me. Once decided on the weapon I try to gather all information possible (it is very hard to get some references here in Germany according to the country laws).
Once I got the numbers (height with shooting system), materials used and special features I start collecting a bunch of reference images with PureRef.
As you see I put a reference image to match the desired proportions. In addition, I created a bunch of kitbash primitives to grab since I know I’ll often create a cube, plane and such. To keep everything organized I put everything low, high and the concept in layers. Once everything is set up I usually start a very rough block out.
Since I am not a huge fan of fancy shortcuts I haven’t customized my Maya too much. I have my custom frequent operations I use the most: HardMesh, Jbools, and a simple script polySelectEdgesEveryN “edgeRing” 2 are helping me a lot. Everything else is built-in.
Boolean using HardMesh
I try to stay as long as possible in one 3D package because I don’t like to import/export objects all the time. Another reason is that ZBrush decimated/ booled meshes have negative effects on Maya’s performance in the viewport after importing them. So instead of spending around 900$ on ZBrush, I spend around 100 $ on a HardMesh license. The plug-in is able to perform very clean booleans with an incredible amount of bevel control and the creation of panel loops.
A good example is a flashlight I created. Starting with a base shape, classic edge/supporting loops and converting the preview smooth after modeling is the base. Depending on where I want to have my details I add subtraction meshes which were modeled in the same way as the base mesh. My favorite ones are the panel tools. I just create some planes/open meshes to create them where they should be. In HardMesh there is a modifier stack similar to 3ds Max so you could fully control your boolean operations. Setting wider bevels is making your high poly edges pretty smooth. This is done to avoid anti-aliasing later on. So I make sure not to use too tight bevels in my entire high poly modeling.
Everything else is classic subsurface modeling and in some cases, I use floating geometry.
Creating the low poly is pretty much fun because you could determinate the level of detail of a weapon. Of course, it is always a trade of having details vs. triangle count and it matters for which kind of project the asset is for. These days polygons are not the bottleneck but texture space (memory) is. My basic rule is to translate everything from the high poly to my low. It has a huge impact on the silhouette and shape language of the weapon in general.
When I finish a low poly part I quickly jump over to the UV creation as I find it very handy to have a basic UV layout in place when later on packing all the parts together. I start with a basic auto unwrap, selecting everything and sew and move it together. For sure it won’t look good and is completely off at first.
Then I start to cut my edges where I want them to have. The 3D cut and sew tool is very good for cutting edges in the viewport without having too many overlapping windows on the screen. Once I cut everything I open up the UV window hitting Unfold and Optimize.
Everything is clean and folded now. With Orient Shells, you make sure to have all islands aligned straight. At the end, you could use Straighten UVs to those islands which were not straight but should be since it will save you a lot of UV space when packing them.
In general, packing is pretty simple. At first, I pick all lop poly parts which should be combined into one texture sheet like the stock. I do a simple 512 at 1 iteration pack to see if it’s packing nice and if there are some issues left. I do perform some custom scales to make sure saving texture space in areas the player won’t see. Inner parts or caps are scaled pretty small. Sometimes target welt or other operations will cause double edges or hidden faces. To get rid of them I suggest that you perform a mesh clean-up with a low Length tolerance.
Before mirroring some parts make sure to include every low poly you want in that texture sheet to pack at 2048 by 4 iterations. Make sure to turn off Shell Pre-Scaling when you did scaled islands by hand. You could add higher values but you have to deal with longer packing times through. After the final pack, I mirror some parts needed and transform it by 1 to another UV space to prevent the mirrored parts from baking. Otherwise, it could lead to some baking issues.
At the end of mirroring ьake sure to weld your mesh and to apply Soften/Harden Edges by Texture Borders to avoid normal bending/gradients in baking.
When I’m done packing all parts I create some materials with a name of the weapon parts.
Baking is pretty much straightforward. I always organize my meshes in Maya with the help of the outliner. I load my high and low poly into Marmoset, set all the maps I’m gonna need for Substance and perform a test bake. Sometimes I need to adjust the cage amount or paint skews.
Here the material names are pretty important. I prefer to autoload my textures into Substance Painter‘s Shader instead of assigning every map by hand. I found some naming convention in the Substance documentation.
Make sure to click on the gear in Marmoset and change your map naming to the names of the identifier. Material name (from Maya) and baked map names (from Marmoset) needs to match together.
In Maya, I prepare my low poly mesh to achieve the best visibility in Substance to start painting each part. It would not be too much fun to paint on a part which is hidden. You could bring back all the mirrored parts to the default UV space. Export your meshes to one .fbx file and add the mesh file and textures to a new project in Substance Painter. Depending on which graphics card you’re on I would set the resolution to 2048 or 4096. Within each shader, you could up or downscale if the performance isn’t too good. I prefer to select a shader first, hit the Solo button and work in 2 or 4k.
Now you should be able to see all parts with auto applied textures.
I define my materials by looking closely to references from the real world. Sometimes it takes a while because there are many poor replicas or airsoft weapons with cheap materials. I found many weapons are having painted steel on several parts. To work accurately in PBR I layer my materials and build up from the base.
This is my basic workflow on materials:
- Base Color (non-metal through the painted surface)
- ColorRoughVariation (to get some contrast)
- NoiseDetails (height information for detailed surface)
- Edges (full metal and height because metal is underneath the paint)
- DetailedDamage (small metal spots)
- Custom Scratches – DirtLayer (non-metal white rough value)
- AO pass
I export my maps as an Unreal 4 Package.
Before importing things into Marmoset I usually do some research on how a weapon looks in slow motion or look for some unique ideas to add. I put some work into the ejecting function of my weapons to have a look and feel about how they could look and work in the game.
Therefore I build shells and some FX geometry. Something very simple. Most of the time I use some low poly planes for smoke and a cone for light volumes. I unwrap everything and create one single FX texture map where smoke, sparks or particles are at. In Marmoset I set the shader material to unlit, geometry to cull back face off and put my texture to transparency as Add. As I work with metalness-roughness PBR workflow I’m using the Marmoset Unreal Shader template or just change the default shader to metalness, GGX reflection and invert gloss.
I do have a pretty simple light setup containing rim-, sun-, back- and a fill-light. In render settings, I use local reflections, GI and AO. I’m not a huge fan of chromatic aberration and grain so I use very low values there.
There are so many ways to achieve the same results I’m having and these are the techniques I personally used to create my weapons. I hope you liked my workflow and could profit next time creating your weapon.
Malte Resenberger-Loosmann, 3D Artist