‘Hydroponics Lab’ Environment Breakdown – Andy Baigent
Hey! My name’s Andy Baigent, I’m an Environment Artist at Creative Assembly in the UK and I’m currently working on their new FPS IP on the console team. I’ve been in the industry for about 8 years now and have worked on various projects ranging from mobile to AAA console & PC games, most notable being Driveclub and Star Citizen.
From an early age, I always found anything to do with 3D fascinating, I loved watching ‘the making of’ / behind the scenes videos of CGI films and games (and I still do!). This, along with the many years of playing games is really what got me interested in 3D art but it wasn’t until much later when I started University that I focused on environments and props.
Goals / Planning Pt1
When I started this project it had been about two years since I left Cloud Imperium Games where I worked on Star Citizen and I really wanted to go back and try making a small environment with the same workflow but, in Unreal Engine 4. This posed somewhat of a slight challenge since I hadn’t used UE4 properly in quite a long time, up until then most of my personal work was in Marmoset Toolbag and professional work in CryEngine, Lumberyard, Unity and proprietary engines (basically everything but Unreal) so opening up UE4 after such a long time was weirdly daunting.
I didn’t know what I wanted to make at this stage so I poured through Google, Pinterest & ArtStation, and after looking at a ton of different concepts and environment work I eventually found this concept by Oliver Guiney:
Luckily, Oliver had a breakdown of his concept along with a link to his Pinterest board so right from the start it gave me a load of ideas and reference to go by, but I wanted to go a bit deeper so I made myself a Miro board and started gathering a load of reference for the structure, materials, props and lighting.
Blockout & Planning Pt. 2
Once I felt like I had enough reference to go by I started blocking out the scene getting a basic lighting setup done.
With this and the reference I had gathered, I started making a Trello board with lists of everything I could possibly think of that could fit in a lab. In hindsight, I definitely over planned and having a load of tasks on various lists was a bit of a downfall as quite often I’d look at the board with dread and kept putting things off.
On the other hand, I don’t think I would have done as much as I did if I didn’t have the lists as it always gave me that little extra push and pressure needed to move forward with the project.
There were also a few props that I had on the list that never made it in because over the course of the project they either didn’t fit or I could use existing assets.
After I had a clear goal of what I needed, I started getting some materials together from the small library I had built up over the past couple of years so it was only a matter of modifying and updating them to fit the environment a bit more (though this was more of an ongoing task).
As the environment heavily relied on Parallax Occlusion Map (POM) decals, I set to work on making some high poly decal meshes in 3D Studio Max. I sourced a lot of the meshes from an earlier decal / trim sheet I had made as well as making a few new ones I thought would be good to have, but looking back I feel I should have made the decals as and when I needed them as I didn’t use half of them.
The plan was to have different materials on various decals, so I assigned certain meshes different materials in Max to allow me to generate a colour map in Substance Designer that I could use to mask and blend in the different materials. The grey material represents transparent decals so you could lay them over any surface, the blue and red materials represents different opaque painted metals and the pink material represents opaque bare metal.
When I started the project, I was quite worried about how I was going to get POM working in UE4 because the only information I could find online at the time was either very convoluted or editing the source code, neither of which sounded very appealing / doable. But I later found out that there was the ‘ParallaxOcclusionMapping’ node in the material editor and it was actually very easy and simple to setup:
(There’s a lot more you can do such as self-shadowing and pixel depth offset so I highly recommend looking through the POM content example map!)
The most challenging part of the material was getting the opacity right, but I knew from experience that a good base to start from would be an inverted ambient occlusion map.
From there, I played around with various histogram scan nodes and blended them with masks to either increase or decrease the strength of the AO map in certain areas, I then added in the masks generated from the colour map for the opaque painted and bare metal materials, and then finally to get a bit of variation, I ran it all through a few dirt nodes which were also masked depending on how strong I wanted it for different decals. A good technique I found was to also blend the dirt nodes together with your albedo as the dirt and opacity will fade out in exactly the same way which seemed quite natural.
It sounds a lot quicker and easier than it was, there was a lot of testing and iteration over time but in the end, it seemed to work really well.
Annoyingly, the emissive button decals were a (much later) afterthought and because I wanted to be able to change the light colour and emissive strength based on vertex colour and alpha, I didn’t want to go back and change a load of work to get it working in the original POM material so I ended up making new textures and a new material for them. But essentially, it’s exactly the same material setup just with emissive functionality.
Creating the scene
As well as the POM material, the whole environment relied on weighted normals. Weighted normals is a technique where you can change the shading of a model, depending on where the vertex normals are pointed. This can be used when smoothing a chamfered (or beveled) edge and setting the normals to the exact same direction as the larger faces. If done correctly, this will blend the shading across the chamfer/bevel, making the mesh look higher poly than it is which is a huge bonus if you’re using tileable materials and not baking from a high poly.
After I had everything I needed; materials, POM shader, basic lighting etc I started building up the environment by making the structural elements such as the floor, walls and ceiling, but I quickly realised that I was going to have to steer away slightly from the concept and put my own spin on it due to a few things that didn’t feel right such as the plant beds on the walls.
Initially, I had the same floor to ceiling plant beds but it kept bugging me because it looked a bit strange being one big component that also seemed too tall for anyone to reach the top without a ladder. I felt like making a ladder was a bit of a cheap shortcut so I redesigned the walls to house smaller, shelving rack units with a sort of rail system to give the idea that the plant beds could be taken off or be moved up and down, this also helped to break up the repetition in the walls.
The ceiling also went through numerous changes because originally, I wanted it to be as close to the concept as possible but I found that there was a lot of empty space. To “solve” this I ended up putting in loads of pipes and details that, in the end, just became way too cluttered and noisy so I decided to redo the ceiling by making the window bigger and spreading the lights and other components a bit further away from the centre. This helped reduce the number of elements needed to fill the space and it was also a huge help when lighting the scene.
Some of the props like the plant drums felt a bit out of place on their own so I incorporated them into the walls but for the most part, everything else was quite straight forward. I already had tons of reference and a big props list with links to lab equipment so it was just a matter of going through the lists and ticking them off.
Lighting & Postprocessing
Originally, I was going for a realtime lighting setup with dynamic GI and propagation volumes and whilst testing it in a new scene was great, I couldn’t get it looking right in the lab. It wasn’t until about 2/3 of the way through the project I decided that once I had everything finished (structure, props, materials etc) I would scrap the realtime approach and strip out every light and start from scratch, but this time by going down the baked lighting route.
This was a bit of a pain and in hindsight quite a chunk of time wasted but starting again from scratch pretty much gave me uninterrupted focus on the lighting which was amazing because it forced me to re-learn a lot of things I had forgotten after not using UE4 for a while.
My lighting setup is quite simple, most likely not optimal but as it was a portfolio piece, I wasn’t too concerned about memory usage.
For the most part, the post-processing was tweaked over the whole span of the project but much like the lighting, it wasn’t until the end where I could really focus on it and aside from things like vignette, chromatic aberration etc, it was the colour grading that helped this scene the most (it looked pretty terrible without it).
To achieve the final result, I bumped up the Global Contrast by quite a bit to give the scene more depth. I also reduced the Global Sautration levels by about 25% as all the colours were too vibrant, this did mean that I lost a lot of the green from the plants so I increased the saturation of the green channel in the Midtones to bring their colour back. Similarly, I decreased the Red and Blue channel in the Scene Colour Tint to give an overall greenish tint to the environment, and then I used a LUT texture that comes with the Amplify LUT Pack to give the environment a bit more of a cinematic feel
Overall, I’m pretty happy with how the lab turned out and although I kept breaking away from it every now and then, the urge to get it finished never went away and I definitely learned and re-learned a lot.
I hope you enjoyed reading this and that you learned a thing or two!