Laughing Halls was the most recent environment created for Cleave, a game that I’m developing for Wolves of Ragnarok Studios. The halls is just one environment amongst a lineup of 30 total. It is the heart of the Insanity faction, being the home of leader Kaila Sixblades and her army of Fodder. In this developer blog entry I will go over the steps that went into creating this environment, from the time I began until I called it finished.
Feel free to check out Cleave on greenlight, give us a vote, and if you feel we deserve it, head over to our Indiegogo page from there to help us give a boost in quality–on par with or better than Laughing Halls, as well as the much desired (at least by us) multiplayer pvp mode and mobile version. Greenlight link: https://bit.ly/1WyRV4D
Due to the low budget of the project and the amount of environments and characters required, I had to use a lot of tricks to get the most out of the environment in the smallest amount of time.
As with any project, it’s best (and most would argue of greatest importance) to keep optimization in mind from the very beginning. Optimization can mean many things; it can mean paying attention to poly counts and planning ahead so as to not go over the maximum desired count for the scene, or it can mean cleaning up code and reducing instruction counts. It can even mean reducing texture resolution or number of shaders used, reducing lighting and shadow quality, or using tricks to achieve the same results without the extra processing power.
Optimization in this case simply means keeping the poly counts as low as possible while still getting the most detail out of the different models.
In regards to the textures, this is a different story. The best way to optimize textures is to get as much use out of a single texture as possible. Most smaller objects don’t need that high of a resolution texture, especially those viewed from further away, so you can combine those smaller assets into what is called an atlas.
Atlasing textures can be done a few different ways. The way I prefer to do it is to split up the UV space into quadrants. Each object would go within a certain quadrant. That way I can use 1 slightly larger texture to contain all the texture data from multiple objects instead of an average size texture for each object.
The software that I use can vary, depending on a couple of different things. Firstly, it depends on whether or not I have an active subscription to Autodesk for Maya LT. I much prefer to use Maya when it comes to modeling anything.
Blender is also an option, and usually what I turn to if Maya isn’t. For texturing, I stick with the Substance toolset no matter what. I’m pretty flexible when it comes to art style as I’ve done flat shaded, hand painted, and PBR. I prefer PBR overall, because it gives the most realistic results.
Most of my work reflects this, as it’s my preferred style. With Physically-Based Materials, the light information that is received is based on the type of material that the object is made of, and they usually contain a set of textures depending on the type of PBR material it is. The most popular one–and the one I use most–is the Metal/Smoothness or Metal/Roughness. In Unity it is called Metal/Smoothness. With the Metal/Smoothness version, we need our Base Color or Albedo map that contains the texture color information, a Normal map that contains our detail or bump information, and lastly, we need our Metal/Smoothness map that contains the Metal information in the Red channel and the Smoothness information in the Alpha channel. These channels are grayscale images that contain values between 0 and 1 in each pixel. The value depends on how Smooth or Metallic the object is in that part of the UV/texture space.
For some environments I will use Substance Designer but for this particular environment I didn’t need it.
I suppose I’ve rambled on enough about what goes into the environment, how about we get to the environment already!? To begin with, we started with the base environment from another completed area called Audia Monastery.
What we did here is we cleaned this area up and removed anything relevant only to the Monastery scene, which includes pretty much everything but lighting, effects, and some of the architecture. This is the result we ended up with–an empty shell of the former Audia:
By reusing the pieces that we can, it saves us a lot of time in the long run, especially on such a tight budget with the amount of work needed to call it finished. Everyone wants to save money, so even without a tight budget, this is a good practice. Just another of many optimization techniques.
We actually ended up deleting the walls altogether, as we needed a unique one for the Laughing Halls by the time it was all said and done. After deleting all the walls, we took the floor texture, tiled it, and replaced the old one from Audia with the new one. We also decided to change the carpet color to better reflect the intended end result for the environment, and also added additional floor pieces to extend the environment into the background further, to simulate the massive stone-like place. Once we were happy here, we took a screenshot to document the progress.
Next, we began to work on the pillars that were going to hold everything up. These were a bit tricky because of the detail we wanted to get out of them. They took longer than they should have in the UV mapping stage because of all the different little pieces that went into it.
We decided to put the detail into the model itself, instead of using a normal map, because the entire environment wasn’t going to take very many models, so we had a lot of performance to spare. The finished pillar ended up being just under 2,000 faces (4,000 triangles). Since we only needed 18 pillars total in the entire level, that ended up being just under 34,000 (33,714 to be exact) faces for all of them. Not bad at all. I try to keep the player from viewing more than 100k-200k faces at once between everything in the camera at any given time, to give a range of what I usually aim for as a top end limit.
We also decided to go ahead and remove the skybox and the rest of the geometry that was still there from Audia, and the ceiling pieces that block out the sunlight. Here’s the scene with the pillars added and skybox removed.
Once we had all of the pillars in place, our next step was to attack the walls and start to get the building closed in. I was going to need a lot of wall sections to achieve the effect that we wanted so we had to keep that in mind when we created the models. Since we wanted a good bit of detail in the walls so we could add in trim and ceiling pieces later, and have it all line up as close to realistically as possible, we had to compensate in other ways.
Really, though, this wasn’t much of a compensation but yet another optimization technique. Ideally, with most models you should only care about the parts of it that the player is going to be able to see. Anything else is wasted space, time, and performance. With this in mind, we could eliminate an entire side of the wall since the player would be viewing only the interior side. This cut half of the face count we would have had if the wall needed to be two sided (obviously). What we ended up with was a face count of 172.
We needed 10 walls, less than I originally thought. So with all of the walls we have 1,720 more faces to add to the previous total 33,714, which brings us to 35,434, with still tons of room to play.
We’re going to skip ahead a little since the next few pieces we needed were all involved with the same thing–building the rest of the wall and adding the ceiling. The first piece was a stone trim section that we could add along the top of the wall to break it up from the ceiling piece, and the ceiling piece to go above the trim. The texture for these is just a basic gray concrete PBR material, with the ceiling models and brick areas being basic brick PBR materials. We also needed an archway for the pillars that are in between the back wall and the camera. At this point, I figured we might as well go ahead and disable the outdoors lighting and start with some basic indoor lighting distributed carefully around the room.
Now we needed to start thinking about filling up the environment at least a little bit to give it a feeling of being lived in. Since this is the home of the Fodder, and since Kaila Sixblades has more or less turned them into her own personal army, we need to reflect this in the environment. What better way to do this than some type of bunk?
Since the rest of the environment is stone, we need to contrast that a bit, so we went with a wood material. We have a ton of bunks, but they were relatively small in face count too, about the same as the walls were, so that barely scratched the total count.
I also originally made the walls with the intention of filling up the space in the center. Since Kaila is worshipped as the leader of the Insanity faction, she should be idolized, so I took her character model and put a stone texture on it to create a statue of her, which filled up the space nicely. They were quite a bit extra to the count–40k worth.
The lighting also needed to be adjusted since we planned to add torches to light the halls. We needed to contrast it with a cool color, since fire produces a warm color. We went with a lighter blue (RGB 163, 175, 255).
All that was left now was finishing up the scene, which required a standing torch of sorts, some fire particle placement, and our additional lighting. I ended up using the PyroParticles kit that can be downloaded for free from the Unity Asset Store. It came with lighting and some decent particle effects, so that saved some time. I just had to modify the code for a couple of the scripts to be compatible with our project and disable the lighting flicker effect that it had. We don’t need any crazy dynamic lighting for this scene anyway. This was our final result without the active particle effects.
All in all, I had a lot of fun with this environment. Our total face count ended up being 160,816 (321,632 triangles) for the entire scene, which could still get quite a bit of optimization as I didn’t optimize the character statues–I just used the original character model. It runs at an average of 30-35 fps in real-time, which is great for what we needed. Total development time was 2.5 days, not including lighting builds. To finish things off and touch up some things, I added some global height fog to the camera to put a bit of fog across the floor, then activated the particle systems, and we have our final screenshot!
There is a lot more to come for Cleave so stay tuned. Be sure to Like WoR Studios on Facebook, Follow them on Twitter, and keep an eye out on Steam and the website for future announcements.
To get in touch with me directly, you can follow me on Twitter: https://twitter.com/khorelis