logo80lv
Articlesclick_arrow
Talentsclick_arrow
Events
Workshops
Aboutclick_arrow
profile_login
Log in
0
Save
Copy Link
Share

Behind Creation of Nitro Express Checks and Balances Skin for Hunt: Showdown 1896

Alexander Sheynin explained how he created the Nitro Express Checks and Balances Skin for Hunt: Showdown 1896, going over the intricate golden details and showing the material setup.

Introduction 

Hi all! My name is Alexander Sheynin. I'm a Senior Hard Surface Artist at Crytek, with more than 7 years of experience in the video game industry. I worked on such titles as Hunt: Showdown, ILL, Returnal, Remnant 2, The Matrix Awakens, Miasma Chronicles, 7 Days To Die, and many more. 

I’ve always been a big fan of sci-fi and horror stuff mostly because of the execution of art in these genres: how to create an item and make it convincingly realistic.

So since the beginning of my career, I was always keen on the nature of how things become attractive to a human eye, what makes them stand out and look believable. In my works, I rely heavily on details: every mesh should be made to serve some certain function; every texture should bring life and story to your asset. 

But it’s not only about unique, detailed texturing, complex lighting, or a strong silhouette; humans perceive an image as a unified whole, so if something breaks this balance, everything begins to seem artificial. In this article, I’ll try to show you my approach to weapon creation for Hunt: Showdown 1896. 

Nitro Express Checks and Balances

Nitro Express Checks and Balances concept art was done by my colleague Ivo Nies. This rifle is a part of a military luxurious set, including several other weapons for our latest Road To Hell event in Hunt: Showdown 1896. The design direction was to create a ceremonial military weapon: it should use high-status materials, like gold or exotic wood, but still could be slightly worn, have some insignia, unit emblems, or ranks, use ornaments, and be decorated with a rope cord.  

Before I start, I always make a reference board, where I break my weapon into components, like an actual firearm’s compound parts. It is not always restricted to a certain weapon model, colors, or materials; usually I add similar stuff to be able to choose what works best. One important thing here: I tend to make notes and keep the board organised so other artists can follow along.

After the board is done and I have some understanding of what's coming next, I set up a weapon character in the engine and a scene structure in Blender. It has separate collections, each named by the stage of production. 'From Engine' contains the original weapon model parts (in case I do a new variant of it) or some mesh references; 'Export' contains all the export node meshes that we send into the engine; 'Blockout/Highpoly/Lowpoly' are the collections where the actual work with geometry happens. We'll take a closer look at each of them in the next chapter.

Blockout

So here comes the first feature specifically related to our work: the concept is not a blueprint that you need to follow 100%. Its main purpose is to serve as a guide, showing you a theme and setting the mood, but the responsibility for certain design decisions relies on the 3D artist. This happens because our primary goal is to provide players with the highest-quality asset possible, the one they see in the game from a first-person view. The concept art team mainly works in 2D, so some proportions or volumes might be off if we transfer them directly. We need to keep the balance: adjust shapes and forms to match a perfect visual appearance in-game while still following the concept art.

I try to keep all meshes relatively procedural so they can be easily edited in the future: cylindrical objects are made from polygonal lines with Screw, Solidify, and Weld modifiers, while most of the meshes have boolean operands. For this, I use Hardops, this is why I keep all the booleans in a corresponding subfolder called Cutters. 

To export assets to the engine, we use a special in-house plugin that works with an empty and meshes parented to it. But here comes a problem: I need to have easy access to mesh editing, material changes, and transformation tweaks without parenting and unwrapping blockouts every time I export them.

So here comes the power of Geometry Nodes. Blender provides the flexibility of procedural operations driven by nodes, which is extremely powerful, easy to manage, and time-saving in comparison with modifiers. While I still keep doing some stuff manually (like the barrel I showed before, since in certain cases it might be faster), recently I've been introducing more and more Geometry Nodes into my workflow.

This is how it works: I reference my current in-work meshes from the Blockout collection into an object parented to an export Empty in the Export collection, which gives me the opportunity to procedurally unwrap, set materials, and adjust shading without manually copying each object or losing modifier stacks.

First, I add a cube (or any other object), parent it to an export empty, enable Geometry Nodes, and remove the original Group Input. Instead, I drop in Object Info nodes – these are references to my meshes in the Blockout collection; with the Relative option checked, all the referenced meshes maintain their transformations from the Blockout. I use this instead of a Collection Info node because it's easier to manipulate objects individually; for example, when I assign material IDs and materials further down the chain. After this, I have an auto-unwrap setup based on angle and a UV packing algorithm. The Realize Instances node is used to convert the referenced info into real geometry; Triangulate is a mesh triangulation that preserves normals info.

And it's done. Now I can do any tweaks to my meshes: destructive editing, modifiers, boolean, or even Geometry Nodes operations – all this info will be translated to the export cube and exported into the engine so I can perform silhouette changes or material adjustments on the fly. Later in production, I will replace referenced meshes from the Blockout with corresponding ones from the Highpoly/Lowpoly collections.

Seashell & Decorative Elements Setup

Although this part looked pretty simple in the concept, in 3D, it turned out not so obvious and required several transform iterations to look decent on a weapon.

I began with a simple shape like the purple segment in the screenshot above, then mirrored it and deformed it in a way that the shape is visible from the side but still retains its round center where the barrel meets the receiver. If I had kept it as a straight symmetrical shape, it would either have been covered by the receiver mesh or the distance between the two barrels would have been too wide.

The number of green and blue ribs, their profile, and twist values have also been adjusted several times so there is no visible mesh intersection and everything looks natural. Same for the red rings – they share the same thickness and profile, but the tilt and radius are different. So here I used both Geometry Nodes and modifiers.

The same approach was used when creating the ropes and the belt wrap. First, make a segment; then make sure it tiles perfectly by creating two temporary mesh instances – this way it's easier to edit the borders. After that, add an Array, Curve Deform, Weld, and Subdivision.

The main mesh of the stock was created using booleans and Shrinkwrap: I started with one big low-poly chunk, set creases, and then split it into parts. To control the thickness of the stock near the star, I duplicated the base mesh and conformed the subtracted mesh surface using the Shrinkwrap modifier. This way, it not only gives control similar to the Lattice and Surface Deform modifiers, but also allows me to adjust normals and surface smoothing more precisely using the target wrap mesh.

As soon as I’m happy with all the parts, I export them to the engine, check in-game, and if everything looks fine, I can move to the next stage.

High Poly

During this stage, I combined subdivided meshes and sculpted parts in ZBrush. Additionally, I need to mention that all the cords were made in Subdiv, because later I would have to unwrap and paint them to transfer a directional cord texture to the merged low-poly mesh.

The approach is pretty simple: you grab a boolean setup from Blender and import it into ZBrush, where you recreate the same structure within a folder. With the Live Boolean option, you can non-destructively manipulate your operands, including the entire sculpting toolkit. I prefer this method because it gives me crazy polycount limits while still maintaining decent viewport performance; I can manually tweak and polish certain areas and benefit from polygroups and the Polish by Features option.

If I'm not sure what works best, I can always use Morph Target and Layers to store my mesh in memory, make some tweaks, and manually paint it back with the Morph Target brush, or decrease the opacity of a layer if I want the desired effect to perform at less than full strength. I use this approach in all my work, but this time it was much easier because the asset is pretty clean and didn't require heavy edge damage or seam welding.

3D ornaments were made in subD, merged with corresponding parts in ZBrush to be able to have smooth transitions in intersections, and exported back to Blender as a single piece after decimation.

The scarf’s bottom was made via Geometry Nodes: a simple rectangular plane with Distribute Points on Faces and Instance on Points nodes with a procedural thread plugged into the Noise Texture node was used to drive the distortion.

Low Poly, UVs & Bakes

The process of making low poly was not too complex. Most of the time, I reused meshes from the blockout stage; I just accepted boolean operations, and if there were any drastic changes (like merged 3D ornaments), I did some manual retopology with RetopoFlow.

The most frequently asked question about low poly creation is how many polygons/segments you need. You can always measure it by setting camera views in your scene or bringing the weapon into the first-person view in-game and comparing: the silhouette should be smooth enough and not have any visible polygonal edges. So if the 16-edge-based cylinder for a barrel has visible edges, start to increase segments to round the circle shape.

But sometimes we need to add more geometry, even if it doesn't have an impact on the silhouette. For example, for the sake of better UV packing, when we have long, thin islands that don't allow us to fully fit the UV square. Or when we have overly strong normal bending artifacts, some edge slicing helps resolve the distortions.

In my case, I kept the star-decorated elements in the geometry, because they are visible up close in-game from the first-person view. I also kept the cord pretty dense, because it was supposed to be rigged and needed enough segments to perform realistic physics.

So first, I updated my export proxies' Geometry Nodes again with low-poly meshes to test them in-game. The fancy cord belt on the barrel was done by remeshing the original high poly, so I have a solid piece with no holes between the cords; then I created a vertex group attribute and painted weights in Weight Paint mode to be used later with the Decimate modifier.

The idea was to make the decimator reduce more geometry in the areas that are less visible to players in the game view. You can notice the orange color on the inside area, while the visible outside areas have less impact. The belt's edges are painted blue, which means they have 0 decimation applied. After decimation is done, I collapse the modifiers and cut a straight line inside – this is a UV seam, which allows me to unwrap this piece as a rectangle with perfectly straight edges.

The weapon is divided into 5 texture sets, mostly because of the in-game attachment setup, where every solid piece might be replaced if the weapon has variants. So it has a barrel (blue), a handguard (orange), a receiver (green), a cord (yellow), and a stock (dark cyan).

I did some test UV packs to measure texel density between the sets. It was approximately the same, except for the handguard – it had a slightly higher value and allowed more stuff to be added into it. That's why the cord's leather bands and single ropes were included in this set. One important note here: despite the stock being originally planned as 4x2K, during texturing it turned out that it required more resolution due to small details. Because it's unwrapped in a square format, it hasn't changed much.

However, if I had upscaled the barrel (which has a rectangular unwrap) to a full square after texturing was done, it might have broken some texture scales and tiling. That's why I recommend doing some test texturing before doing the final UV packing and bakes.

A double decorative cord was made and unwrapped as a trim – it is a long repetitive piece deformed into a curve object.

The rest is pretty usual: duplicate symmetrical parts to save UV space, unwrap so the islands are straightened so you won't have artifacts over seams; scale up islands that belong to the most detailed and visible areas. As soon as I'm happy with the UV sets, I export meshes for baking normals, ambient occlusion, and color ID masks to Marmoset Toolbag. Additionally, I baked down some textures applied to the high-poly cords I mentioned before: replicating the same directionality on a merged mesh through masks in Substance 3D Painter would have been too time-consuming.

The final mesh setup looks like this: after the bakes are done, I export both the assembled gun and the exploded parts, so I can comfortably paint on isolated details or work while the whole gun is visible. Isolating or hiding excluded geometry doesn't always work for me, because I rely heavily on masks and anchors, and some strokes might leak into unwanted layers.

The final mesh setup looks like this: after the bakes are done, I export both the assembled gun and the exploded parts, so I can comfortably paint on isolated details or work while the whole gun is visible. Isolating or hiding excluded geometry doesn't always work for me, because I rely heavily on masks and anchors, and some strokes might leak into unwanted layers.

Texturing

In my texturing workflow, I use anchors and 3D texture projection a lot. This led me to the following layer stack order: I begin with a medium gray or black layer instantiated across all texture sets. It won't be visible in the end, but it serves as a filler between masks, in case there are gaps or semi-transparent transitions. Next comes a purple folder called Height, which contains only layers with height and normal information. I can sort them into separate folders within it; however, at the top of the Height folder, I put an empty fill layer with an anchor, and every channel of this layer is set to Pass Through. This allows me to get all the height and normal information from the layers below and use it in the Micro Details slots of every generator later.

The last one at the top of the stack is a folder called AS_Adjust (red) – it contains universal effects, like sharpening, AO darkening, and edge brightening, applied to the whole set. These effects give the textures more depth and contrast.

I was not sure about the grip design, it had some visible floral ornaments upon the scale pattern, but it would have been too time-consuming to make several designs in 3D, conform them to the surface, and bake them down. Instead, I decided to go with ready-made height alphas from Textures.com, which I could swap on the fly without any additional work.

I gathered some, projected them onto the mesh with the planar projection method so it stays in the same position on the opposite side, and then just moved it along the grip while switching from one design to another just by replacing the mask in the fill. Planar projection, as well as other 3D projection methods (especially Warp), gives you the advantage of deforming your alphas to your surface without actually editing the texture files. So you just rotate a transform gizmo to match an angle, or move control points like with the Lattice modifier.

However, the scale pattern was approached differently. This time I didn't find anything suitable on Textures.com, so I had to create it on my own in Substance 3D Designer. It's actually pretty simple: the base shape was made from a paraboloid alpha; the slope is just a linear gradient multiply, while the scattering was done via RGBA Merge and Split nodes. This way, I was able to lay out the scales without additional masking – you just create an alpha from your pattern shape, merge it using RGBA Merge, then transform it to distribute the scales, and then split it back to use only the RGB data, but not the alpha.

Two maps were imported into Substance 3D Painter: height and normal, and this time projected by UV. At the end of the Substance 3D Designer chain, I used a Normal node, which allows me to control the intensity of the normal map – I had to re-export it a few times so the result looked visually decent but also didn't overinfluence the generators' masks. The bottom star was baked from a high-poly mesh onto a flat plane, and then edited in Substance 3D Designer the same way.

The rest of the ornaments – especially the dogs hunting the deer, the barrel leaves, and the shield – were provided from concept art. I ran them through a similar setup in Substance 3D Designer to be able to control intensity, normal directions via the Normal Vector Rotation node, tiling, and alpha masks. The scope ornament was fully made in Substance 3D Designer.

The materials I used in this project were quite clean and untouched because I wanted to emphasize the luxurious and brand-new look of this weapon. The logic behind the wood texturing was as follows: areas are darker where water and dirt can accumulate, areas are brighter if they rub against each other, and dust forms where cavities are present. Adding height and normal information from my Height folder into generators like Metal Edge Wear, Dirt, or Mask Editor helped me achieve the desired effects.

Metal materials were approached the same way. An important thing to mention here is that we can only measure color values accurately by looking at our final in-engine renders, because of its color correction and rendering models. Substance 3D Painter may display them differently; that's why I always use correction layers set to Pass Through blending mode with Levels, HSL, or Contrast/Luminosity filters to adjust Diffuse, Specular, or Glossiness. Some things might look perfect in Substance 3D Painter, but after in-engine integration, you may find certain values to be off or too dull.

Cord texturing relies on maps baked from the high poly.

All the other mesh parts were done in the same manner.

The last topic to discuss here is LODs. The asset should look consistent at each level of detail, which is why we often bake down some overlapping parts, like bolts, for example, which could be reduced in geometry at a distance but still need to appear. Here is an example with the scarf: it is baked down onto the stock mesh, so we can remove its geometry when the weapon is far from the camera. To have the same textures on the scarf mesh and its projection on the stock, I mostly used 3D map projection methods instead of UV, and the Clone tool to copy one sampled area to another.

Rendering

All the renders were done in CryEngine. I made some custom cloth meshes in Marvelous Designer and textured them with Substance 3D Designer and Painter. The light setup consists of 3-4 spotlights (key, rim, and fill), the purpose of which was to create strong shadows and highlight specular reflections. All the cameras have a relatively low FOV with a high Depth of Field effect.

Additionally, I created a weapon rack asset.

Post-processing was done in Photoshop. I painted some custom vignette masks so their shapes would suit certain weapon positions better. I used Color Lookup and Color Balance adjustment layers to add some mood to the renders, while offsetting the exposure gives me a kind of fog effect, which makes the picture breathe, in my opinion. It also lifts the darkest values, so I don't have pure black areas. You can compare how the weapon looks in the actual game with no post-processing (except vignette):

Conclusion

Thank you very much for reading. I hope you found some useful tips and are able to bring them into your own work.

Big thanks to the editors for giving me this opportunity to share my knowledge with you.

Alexander Sheynin, Senior Hard Surface Artist

Interview conducted by Stephanie Almogabar

Built for the Game & Digital Art Industry
Get Our Media Kit

Comments

0

arrow
Type your comment here
Leave Comment
Built for the Game & Digital Art Industry
Get Our Media Kit

We need your consent

We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more