We were excited to talk with Christian Sparks about some of the techniques he uses to build the amazing world of Woodbound.
Well, Woodbound actually started out looking quite different than it does today. Initially, it was being built out primarily as a Don’t Starve inspired top-down survival game. While that initial foundation rings partly true today, my aspirations for Woodbound’s gameplay have branched out into a more full experience, which is due in large part to the change in art direction that prompted me to remove the top-down perspective so that the world & its visual style could be seen from a much more free point of view.
The original art style was much closer to Don’t Starve’s sort of graded, gritty look. Over time, however, I was less and less happy with the noisy, unorganized look and feel of the world, and so I set out to re-define what I wanted Woodbound to look like. Below are a couple sample images that show the old art style, compared to the new one:
So while most of the attention Woodbound has gotten has been for its look, it’s always been made with the intention of being a full-fledged game.
I’m hugely inspired by the cinematic look & animation of games from Fumito Ueda (Shadow of the Colossus, The Last Guardian) as well has the colorful, naturally expressive scenes & animation created by Hayao Miyazaki. (Spirited Away, Princess Mononoke.) There’s something about these two artists’ styles that evoke a certain kind of meaningful emotion to me, as well as others I’m sure, that I’d really like to capture and emulate, while also making it my own.
To do this, I focus on concepts of geometric readability & visually pleasing color palettes, while typically steering clear of traditional PBR texturing & shader creation. This route forces me to make assets that are cognitively-naturally seen and interpreted as what they’re there to portray through shape & color in an organic, almost minimalist way, as opposed to a literal, photorealistic image of what we see in every-day life. I have a huge appreciation for PBR & photorealism, but I also really love stylized/cel-shading, and the way it creates an almost child-like world to escape to, and I have employed a post-process shader originally posted by my fellow UE4 developer Thura Oo, which I’ve augmented for use in Woodbound to play nicely with the cinematic tools I use, like aspect-ratio bars, tight field of view, volumetric lighting, and dramatic, dynamic depth of field.
Typically my pipeline consists of jumping straight into the modeling of the objects that I am looking to make. I’m actually really terrible at drawing, and so concept art takes me way too long to create, and usually looks awful, so I’ll instead have an idea for something that I want to make, be it an animal, character, or prop, and I’ll open up Blender 3D and start iterating on the geometry. Each asset that’s made its way out of Blender and into UE4 has been iterated on at least 4 or 5 times, sometimes being passed into UE4 so I can see how it fits in with the world, and then being passed back to Blender for more changes. So as a pipeline so far, it’s anything but optimized, but as I’ve gone along, I’ve gotten a better feel for what I’d like to do geometrically, and so the iteration process has sped up and even decreased in passover count.
I really love procedural tool use & creation. For the rocks in Woodbound, I actually go through a routine of cube subdivision, globally aligned voronoi noise displacement, decimation of the result, and then modifier tweaking and geometry cleanup to get the sort of stylized, low-poly look you see in-game.
The cool part about aligning your displacement noise globally is that you can simply duplicate your modifier-ridden geometry and translate it around to get a completely different shape, and then simply convert your object into a new mesh and you’ll have a clean, low-poly stylized rock, which is a trick I picked up from an article by Greg Zaal, available here: Prior to converting these objects into base meshes, I’ll typically scale the initial cube geometry that constitutes this rock into various base shapes, or add in some preliminary simple subdivision (as opposed to the catmull-clark subdivision seen in the gif above) to get more square or pillar-shaped rocks. After converting them, I’ll also pass over them with a bisect tool to give them some nice slated features.
I actually don’t do a whole lot of texture work for Woodbound. As most of the objects are created using only geometry and color, the only times that an object will have a texture in its shader is if it’s using some kind of procedural animation, (tyically for foliage) procedural coloration difference (using world aligned noise masks as lerp alphas to have some slight color variance, for the house-materials as an example) or if there is a foliage mask, which I typically just whip up in Photoshop. For some of the foliage, I’ll create some plane-mesh foliage shapes, render them out of Blender, and then convert them into masks in Photoshop.
I really love making my materials as dynamic & modular as possible. As an example, I use a lot of tricks with distance fields in UE4 to create dynamic masks, such as for carving trails in-game:
This basic function will check for any distance-field information 5,000 units above the given pixel. If there is participating media there, the information will feed into the material as a dynamic lerp alpha mask that will help the material to determine that it needs to displace itself downwards below the ground, effectively removing itself from view. I used to use the same concept to subtract the opacity to remove the grass visually, but that still left the geometry where it was, with no opacity, which caused unnecessary overdraw. This solution removes that overdraw, while still removing the grass from view. The same alpha mask logic is placed in my landscape material to mask out the typical grass color on the ground and replace it with a dirt color. I use this trick pretty liberally, for things like trail carving, as well as removing grass from beneath placed objects like firepits or house foundations.
Another neat distance-field trick, which isn’t particularly novel, is grass touch-bend:
There’s a great thread on the UE4 forums that talks about how this works, available here, but the summary is that it displaces vertices away from a distance-field contributing object, with controllable strength, affect distance and falloff.
Talking about the particular lack of texture usage in Woodbound, one exception is the use of noise textures to get a procedural “wind-lines” mask that gives the grass it’s billowy sheen when the wind is blowing:
This effect is nothing more than a world-aligned noise texture panning along to serve as an alpha to lerp between the grass base color and the shinier, “wind lines,” color:
As you can see, all the magic happens in the diffuse section of the material, the grass motion is nothing more than a SimpleGrassWind node.
One last semi-procedural/modular material trick I’d like to share involves my flower material; more specifically, how I can get multiple flower textures & types using only one material & texture:
By packing the flower bulb textures into a flipbook texture, I can get a random float (clamped from 0-1 and frac’d to return a flat integer) and return one of 4 (or more if you pack more into your texture) different flower types using only one material. Also notable in this material is an exception to my typical no-normal-maps rule, just because I liked how the flowers got a bit more “shape” to them using a light normal map.
Lighting and effects
So the overall lighting theory for Woodbound follows what I’ve jokingly been calling the, “Scooby-Doo Rule,” where if it’s moving around frame-frame, it gets the simpler, cel-shaded treatment, and if it’s not, then it gets a more detailed, typical UE4 lighting treatment. So for things like tree-trunks, boulders, houses etc, the lighting will typically look a bit more complex/varied than the grass blades or tree branches blowing in the wind, similarly to how characters and moving objects in Scooby-Doo would have noticeably less fine details drawn in than the static background paintings that were used.
This was more or less my golden rule for light complexity, but out of sheer excitement for the addition of native volumetric lighting in UE4 4.16, I spent some time trying to make this rule work alongside dramatic light shafts from the sun in the world. This resulted in a seemingly weird mix of realistic effects in an almost cartoon world, but rather than clashing, I feel that these things compliment each other, given the scenes much more depth and intrigue. A particular challenge with the contrast in the cel-shading and the soft edges of the volumetric lighting was balancing out values between the two (which is becoming more and more handled by transition volumes in places where the light shafts are better viewable, like in forests) as too much volumetric intensity left things looking blown out and gross. Finding a good balance left me accidentally using partial over-exposure to my advantage, as the exposure threshold on any given pixel actually gave some of the static objects a more unique, complex lighting from a distance, as seen on the distant cliffs in this picture:
The next step for me was to include dynamic depth of field, to really drive the dramatic, cinematic look I’m after, and these things along with ambient particles like dandelion seeds or grass blades blowing in the wind really help to give the world a lot of tangible atmosphere:
As I kind of touched on above it’s really just about giving the dynamic objects like grass, tree branches etc a lot of motion, either with vertex wind, distance-field grass bending from intrusive objects, or simulated wind noise using diffuse masking. Making the world dynamic and alive is a huge focus, both for art and gameplay, and so adding more things to contribute to the worlds’ personality, such as wild animals, birds, rushing rivers, and even cartoony wind-lines in the air, are on my immediate to-do list.
I’m at a kind of tricky spot as a sole developer at the moment; I work a full time job that’s completely outside of game development, and I have a wife & two kids who need and deserve my attention. Combining that with me having naively signed on for more contract work than I was ready for, I’ve had little time in the last couple months to really crack at Woodbound. That being said, I’ve still made use of the time that I can scrounge up, and will continue working on Woodbound until it’s finished. I’m wrapping up a final contract job in the next week or two, which should allow me to focus much more time on more gameplay pieces, so that I might be able to present a vertical slice of visuals & gameplay to some investors, in the hopes that I can make my dream of working on Woodbound full time a reality.