I really like how you've articulated your entire process. This was a very enriching read. A Well deserved feature!
Great article! Thanks for the awesome read.
Wow, this is so cool! Nice job!
Johannes Böhm shared a complete breakdown of his astonishing “Hotel Cortez” environment. Great look at some of the techniques and tools, which can help to create such a showy piece.
Whenever I start working on a new personal project, one of the primary concerns for me is the effort and time involved. When you have a full-time job, a family and hobbies other than 3D Art, it can be a daunting task to start a project that will potentially cost you hundreds of hours.
Being efficient is therefore of the utmost importance, as well as selecting the right project for you.
In this article, I will try to outline the choices I made, both in the way I worked and the way I structured my work on my latest project, the Hotel Cortez from American Horror Story’s Season 5.
Disclaimer: I used a bunch of techniques that would probably not be very good for an actual game production.
When I was looking for a new project, I knew I wanted to build something that required relatively little texture work, was very modular and wouldn’t require a lot of small, individual props.
One of the places that came to mind was the Hotel Cortez from American Horror Story.
At first, it seemed very ornamental with a lot of detail, but upon further inspection I realized that there really wasn’t a lot of variation and I would be able to reuse and adjust a lot of the details.
The whole place also consisted mostly of four different Materials, namely Gold, Wood, Marble and Carpet.
I started blocking out all the major architectural pieces in a very rough for to make sure the modularity and the scale worked. I also started looking for camera positions for the final screenshots already so I could focus my efforts more on the areas that would be prominent in those. In Unreal there is a nice function to remember camera positions. You just move your camera to the view you want and hit CTRL + any number. When you hit that number again, the camera will snap to that view.
I wanted to bake and normal map as little as possible because it is one of the most time-consuming and, for me, boring parts of environment production.
So instead, I used a lot of geometry for details. It’s maybe not the most performance-efficient way of building an environment, but it does save a lot of time and in a lot of cases it looks better (especially if the details have as much depth as they do in the Hotel).
I always tried to break down the wall murals and reliefs into repeatable parts, modeling one section, UVing it properly and then copying it as much as I needed.
Being thorough with every single part saved me the need to tweak things later.
I asked my good and substance-talented Friends Mathis Widrat and Oskar Johansson Möller to create tileable textures for the gold, the marble and the wood for me.
I then set those up in a Multi/Sub-object Material in 3ds Max as well as in Unreal.
One of the most important things to check for with tileable textures is that you achieve an even Texel density. If you have a very high-res object next to a bunch of low-res ones, it will stick out and the end result will often look worse than if that object was just as low res as the rest.
A table and lamp created using purely geometry and tileable textures.
There were some objects where I couldn’t really get around baking, such as the flowery details on the pillars or the room keys but most of the props were textured using those few tileable textures and just building mid-poly objects with a bunch of Material IDs.
That meant that most objects by themselves would look rather mediocre without tons of details.
However, I do believe that good composition, color, light and consistency in quality always trump crazy amounts of details.
In a lot of pieces that are posted online every day, you can see that they were done by expert modellers that put a lot of effort into every tiny detail, but forgetting the overall composition of the piece and not giving the eye areas to rest on which leads to an Image that is somewhat exhausting to look at.
On some props, baking Normal maps couldn’t be avoided.
Most of the Shaders in the scene are very straight-forward PBR-Shaders. For the velvet chairs and Sofas, I used a combination of Fresnel and Fuzzy Shading Nodes.
The Carpet shader is a modified version of the carpet shader from the Unreal Realistic Rendering Demo with custom Masks and textures. That shader was probably the thing that took most time tweaking.
I found that just a single tileable texture on the golden reliefs wasn’t really making the details pop enough. What I ended up doing is giving all of those models a second, uniquely unwrapped UVChannel. In that channel I baked an AO map, used Quixel to create an edge mask and hand-painted a mask for cavities (I experimented a bit with baking and Quixel but didn’t get satisfying results). I stored all these masks in the RGB channels of a relatively low-res texture (each of the golden objects would have their own texture).
In the Shader I then slightly multiplied the AO into the albedo (a tech or lighting artist will probably tell you not to do that, but I found for this particular it helped a lot to make details pop), the edge map to decrease the roughness on the edges (again, maybe not exactly physically correct, but I liked the look) and the cavity Map to blend between the gold and a dirty gold map (creating dirt in the cavities). It’s all rather simple from a shader standpoint, but it helped bringing out the details a lot.
The Shader that was used on most of the Golden models
First thing I do when I start lighting a scene is to go into unlit mode and check the color values to make sure I don’t have too bright or too dark (especially since I multiplied the AO into the Albedo) so the light and GI can still do their work.
A look at the histogram in unlit mode shows quite well balanced texture values.
The second thing is to turn off the Automatic Eye adaption in the Post Process volume. Otherwise the brightness/exposure will be adjusted by Unreal directly.
Settings to turn off the Auto Exposure in the Post process Volume.
The next step was to set up the reflections since they were going to influence the overall lighting greatly due to all the reflective surfaces in the scene. I ended using Screenspace reflections and a mixture of Box and Sphere reflection Capture actors.
Since I chose a static lighting approach, I also adjusted the lightmap resolution on all actors to be relatively low, but evenly distributed, so that the lightmass baking would be quick and iterating would be easier.
From there, it was just placing lights where the lights are in the real scene, beginning with the big ones and working my way to the smaller ones, always baking and checking how the overall scene looks.
I used the “Source Size” and “Source Length” setting quite a bit to match the lights up as much as possible with the real light sources.
A lot of the time, I placed the actual point light within the light-model and deactivated “Cast Shadows” on them.
When I was happy with the overall look, I started increasing the light map resolutions and settings and continued tweaking.
For the carpet, I couldn’t get the shadows of the sofas strong enough (I think it had to do with the way that that shader was set up or the bounce light that was too intense), so what I ended up doing is taking a screenshot of the existing shadow in unlit mode and using that as a decal. This is a very hacky way that I would not recommend using in any actual game environment, but it worked very well in this case and saved me a lot of time trying to figure out what exactly the problem was.
The Lightmass settings I ended up using.
In the very End, I started to edit the Baslightmass.ini according to an ArchViz article on ue4Arch.com.
I didn’t end up using the highest settings they suggest because build times were insane, but instead used the following:
NumIrradiance CalculationPhotons = 4096
Static Lighting Level = 0.4
NumHemisphereSamples = 128
IndirectPhotonDensity = 6000
IndirectIrradiancePhotonDensity = 3000
IndirectPhotonSearchDistance = 180
Screenshots and Post Process
I used roughly the same camera positions that I had set up earlier, but used real cameras in Unreal that allowed me to tweak the DoF for each one separately. I tried using the HighResScreenshot function to take screenshots bigger than my screen resolution, but that gave me a lot of reflection artifacts, so I ended up using the Nvidia Control Panel to overwrite my Screen Resolution and then just taking Screenshots using the “F9” key.
I then sent all those shots to my good friend and former art director Eric Cochonneau who did some final color and contrast adjustments in Lightroom.
I could probably have achieved similar results using UE4s post process settings, but that would have taken a lot more time.
A final, color-graded screenshot.
Keeping the spirits high
The project ended up taking a bunch more time than I initially anticipated. I started working on it in early October and finished in Mid-January. I find it very hard keeping the initial excitement for a timeframe that is that long.
Especially towards the end of a project I always have force myself putting in the effort and not just accepting what I currently have but pushing if further. I find that this phase often decides if your piece is going to be good or great looking.
What helped me this time was having a very clear Image and a written down plan of what assets I would have to create. I would update that plan every month or so, listing the highest priority Items for that stage.
Another technique I used was asking friends and colleagues to list the top three worst things they see in the scene.
If there was something that a bunch of them mentioned, I knew that that was the first thing I should fix.
Building 3D scenes takes time. Focusing on the final output rather than on the process will help you get more efficient. Not every nook and cranny has to be perfect.
What counts is the overall image and how well it transports the Ideas you want to talk about (visually).
Finally, I would like to thank Eric Cochonneau, Mathis Widrat, Oskar Johansson Möller, Kunal Luthra, Damien Tournaire and Geoffroy Calis for all their support.
If you want to see more of my work, check out my Artstation.