Environment artist Jason Lewis talked about how his team managed to build an interactive scene from Star Wars in UE4.
We’ve had the pleasure of talking with Jason Lewis about his team’s most recent Unreal Engine 4 scene, which features some of the most realistic real-time rendering of Star Wars-themed assets. It’s an astonishing project, which you can actually download and play on your PC. We’ve talked about the choice of tools, the production pipiline, the lighting, textures and of course the use of UE4. Staggering work!
Hello there, my name is Jason Lewis and I guess you could call me the lead of this group project. I am a Senior Environment artist working for Obsidian Entertainment. In addition to myself, the other artists working with me on this project all currently work for Obsidian as well, from additional senior artists, to mid-range and junior artists as well. We even have someone on the QA team contributing some artwork as well. In total there are 17 people contributing to this project in varying capacities. This is a just-for-fun personal project that we are all contributing to for no reason other than we are all a bunch of super Star Wars fans and with all the Star Wars awesomeness going on these days, we all thought it would be a good time to jump in and produce a quality fan art project. In addition to just being a bunch of super Star Wars nerds, several of us have been wanting an excuse to learn Unreal 4 for some time now, so we figured that this was a perfect opportunity.
I myself have been working in the games industry for over 21 years, with a broad range of studios, from small start-ups early in my career, to some of the larger publishers/developers such as Sony and EA. I have contributed to many games over the years, some of the more notable titles are Enter the Matrix, and The Matrix Path of Neo [Shiny Entertainment], SOCOM 4 [Zipper Interactive& Sony Computer Entertainment], Medal of Honor Warfighter and a brief stint on Battlefield 4 DLC [EA], and Armored Warfare [Obsidian Entertainment]. I also took a brief hiatus from making games back in 1999 & 2000 to work on the Starship Troopers Animated television series. As I mentioned previously, in addition to myself we have several other artists, most with over 10 years of experience, working with me. A few of note are Terry Hess, another senior artist who has worked on several Call of Duty titles and also worked for EA on Medal of Honor and Battlefield 4. Craig Marschke, another senior artist from the Call of Duty realm and the fondly remembered Novalogic era. Ken LeSaint & Thad Clevenger, two more senior artists from various industry backgrounds. Brian Leleux, one of Obsidian’s primary lighting artists, and several others.
Star Wars Project
So our Star Wars scene simply started out as me wanting to build a 3D Millennium Falcon. I am a huge Star Wars fan and I have always wanted to build a CG Falcon, but just never seemed to get around to doing it until now. It started out as a simple 3ds Max model, but then I thought it might be pretty neat to see it run in real-time, and since I had no Unreal 4 experience prior to this, I figured this could be a great project to learn UE4 with, so my goal was to build the most highly detailed real-time Falcon that anyone has ever seen, and I think I have pulled it off, except for maybe the Falcon model from the recent ILM X-Labs VR demo that was at GDC a few months ago. Theirs might be a bit more detailed than mine, or at least the two might be on par with each other, but theirs is more accurate to the Studio model from what I have been able to see from online videos, whereas with mine, I took some liberties with the details to make it work better with my scene.
Originally it was just going to be the Falcon sitting in Docking Bay 94 so I could run around and look at it in real-time. Then I thought it would be neat to add the interior to the docking bay, and then maybe some of the surrounding Mos Eisley city, then I thought “hey, let’s put the Mos Eisley Cantina in as well!” It was at this point that I realized the scope of this project had grown beyond my ability to finish it by myself, so I extended an invitation to several of the artists working with me at Obsidian to help out with this project in their free time, and I got many very enthusiastic YES responses, so I divided up the work based on the time and effort commitments that volunteers were willing to put into it.
We are currently about 90% done, and our ultimate goal is to finish it, and put it up on the internet for people to freely download and enjoy. It’s not really a game, more just an interactive fan art piece. You can run around with a blaster (or a hidden weapon that you have to find) but we were unable to enlist the help of any character artists, so the only characters in the environment with you are a bunch of Astromech droids and a few Gonk droids. We are also working on a VR version as well as several people in the group have been playing around with Occulus and Vive VR kits, and we thought it would be cool to have a version that runs in VR, so we are currently trying to get that finished as well.
Building Star Wars
The scene is really an experiment to see just how much detail (both polygonal and texture detail) we can run on modern PC graphics hardware at acceptable frame rates. As a result we are pushing some rather high polygon counts and texture sizes. We are doing some modularity, but on a more macro scale. Buildings are instanced, the entire docking bay is reused 3 times in the level, some of the props are reused, but we are not doing much micro-level modularity (no wall, floor, stairs tile-sets, etc.) most everything are unique assets. From a composition standpoint, we studied several scenes from Star Wars Episode 4 and tried to mimic those as best we could while still working within the confines of a freely-navigating real-time environment, but the main focus of the environment are the docking bays and the ships in them.
The scene is quite heavy from a resources standpoint. My Falcon alone is roughly 700,000 triangles, with another 500,000 or so for the docking bay and surrounding props. There are a few spots in the city were the polygon counts can get up to a little over 1 million. So far VRAM usage on the graphics cards we have tested it with peak at about 4.1 GB when settings are turned all the way up. Due to the time restrictions of this being worked on in our free time, we have not had time to build any LODs, instead we do a lot of streaming chunks of the scene in and out of memory based on the player position. Despite our high polygon and texture counts, the scene runs quite well on the GPUs I have tested it on so far. Currently we get 45 – 60 FPS on aGeForce GTX 970, 980, and a Titan X. If we reduce the memory pool size, and make the mip-mapper more aggressive, we even get some pretty decent frame rates on a 2GB GTX 760.
As for the mockup phase, we didn’t go through it in the traditional sense. We built everything un-textured first, but rather than build low-detail versions of our assets to rough out the level, we built all the models to final detail levels from the start, then did our base layout pass, then went on to lighting and material/texture production. There was some iteration that was done throughout the process, but we found that skipping over the block-out modeling phase allowed us to get more done faster. The scene did grow a bit too large at one point and we did have to scale it back bit to fit the time and available man-power.
Our scene does have a tremendous amount of assets, and I believe that is a big part of what makes it so unique and immersive. We broke the assets up into 3 categories, Buildings & Structures, Ships, and Prop assets and as I mentioned earlier, those were then divided up amongst the volunteers based on the time and effort they were willing and able to put into it. For the prop assets in the scene, I came up with a pipeline early on to achieve a high quality end result, but also to be able to get them done quickly. For the most part, everyone else on the team has followed my process. Most of us are 3ds Max users, so it basically goes like this:
- Build out the final low-poly mesh
- Build out high-ploy mesh for baking (our high poly meshes are typically only used to generate beveled edges in our normal maps. Small micro-normal map details are painted or sculpted in Via Zbrush, Quixel, or Substance Painter)
- Bake Tangent Space Normal Maps/AO Maps/and Curvature Maps
- Add micro details to the normal, AO and curvature maps
- Final texturing pass (most of us use Quixel Suite, a few use Substance Painter)
The Buildings and large structures are modeled to their final low-poly state and brought into UE4 without any high to low baking as they mostly use tileable plaster and metal textures. Most of our building materials use world-space projected textures eliminating the need for time-consuming UV work. Only a quick, simple UV pass was required for lightmap baking.
As for the Falcon, that was a whole different animal. First thing that had to be done was to break up the iconic ship into several pieces, each with its own unique material. The final Falcon is made up of 50 unique meshes. Due to its large size, and intricate level of detail, neither of the above mentioned texturing processes would work, as simple tiling materials would not offer the level of fidelity I was trying to achieve, but giving each of those 50 pieces their own unique texture sets would have quickly blown out even a 4GB or 6GB GPU since they would all have to be 4K resolution to keep the texel density from breaking down when the player’s camera gets up close to the ship. So to alleviate these problems, I decided to try out Unreal 4’s layered material system. For those not familiar with the Layered Material system, it basically allows you to create master materials with tiling textures that define different surface types, and within a single root material, you can drop in several of these master materials and blend them together via masks that live in the mesh’s 0 – 1 UV space. This eliminates the GPU memory problem by using a few 1K tillable textures to define all the surface types, and a single 4K mask texture for each piece of the Falcon, instead of using 3 4K textures for each piece of the ship. Layering the tileable materials with the blend masks gives you a much better level of fidelity than if you were just using traditional tileable materials. The down side to the Layered material system is that it incurs a higher per-pixel cost than more traditional material set-ups thus increasing the GPU work-load.
I touched a bit on material creation in the above question, but I will go into it in more detail here. So material work is also mostly based on the category that its parent mesh falls into, Structures/Ships/Props. For buildings and structures we use tileable materials with worldspace aligned textures. UE4’s worldspace aligned system works quite well and allowed us to create these assets faster by not having to spend a lot of time on intricate UVs that would have to be set up very carefully as not to have lots of seams in the tiling. The world-space projection does a pretty good job of blending between curved surfaces, you do get an occasional seam here and there, but nothing horrible. The speed benefits far out-weigh the random seam or projection glitch here and there. In addition to the tiled materials, everything is also blended against a global normal and AO map that defines the major shape and silhouette for each of the structures.
Our big ship in the environment, the Millennium Falcon, is using the aforementioned layered material system. I did do some early on experimenting with using the layered system for smaller prop assets, but found the time to set it up and the additional GPU cost of using that system just didn’t make sense for assets that are smaller than these hero set pieces. The artist that built the Imperial shuttle initially planned to use the layered material system just like the Falcon uses but in the end he was running a bit behind on his model so he decided to just go with the traditional Diffuse / normal / roughness / metalness workflow as the layered system, while very effective, does take a bit more time to set up over a traditional texturing setup.
Prop assets use pretty simple material setups. Your basic Diffuse map/Normal map and a single grey-packed texture for roughness, metal-ness, AO, and specular. We put multipliers in the shader for specular and roughness so we can tune the overall matt/shiny values of any surface without having to go back and re-author the textures. In addition we use a lot of emissive materials throughout the level which give nice pockets of bright color and also complement the actual lighting as well. Another material trick we use a lot of is UE4’s flipbook node. You can make an animated sprite texture atlas and then tell flipbook how many rows and columns are in your atlas, and it will continuously scroll through those sprite frames and by plugging in a multiply node, you can adjust the speed which the flipbook plays back at. I used flipbook for all of the animated lights on control panels and consoles.
Our textures were mostly created procedurally with Quixel Suite (and a little bit of Substance Painter). Most of us are very fluent with Quixel as we use it for production here at Obsidian and a few of us made some great preset smart materials for our Mos Eisley scene that we shared with the rest of the team to allow for even faster texture creation. I’d say our split is about 70% Quixel/Substance textures, and 30% photo-sourced textures from the internet and personal collections. Most of the tileable textures were the photo-sourced maps for things like building walls and plaster, and dirt and sand terrain and ground textures.
After doing a rough 1st pass on lighting for this scene, I quickly realized the lighting this environment was going to be a pretty big task, so when one of our dedicated lighting artists here at Obsidian offered to light our scene for us, I quickly handed over the lighting reigns to him. Here is what he has to say about lighting our Mos Eisley scene:
The smaller lights in the Falcon, walkway, panels, etc. utilize a material node for controlling the strength of the bloom and baked GI individually with each sub-material. So some of the lighting along the walkways might have an increased light bounce strength compared to the lights on the panels. Their bloom was also lowered for the increased post-process bloom for the bigger lights like the sun and docking bay lights.
For the rest of the scene, since 95% of it is exterior (or interior with openings), I worked with the single dominant directional light and targeted a real-world luminance value with accurate Kelvin temperatures*. Once the dominant light source was good to go, I worked with the Lightmass settings (using many of the settings from the archviz threads, in-editor, no .ini changes) and got the first bake to see where additional lights would need to be placed to increase light in the corners or wherever extra GI was needed. After the environment was fairly finished, I started working on lighting the interior. A majority of the lights in the scene for the environment itself were static as I only wanted their color information (no specular) for extra GI or to bring more emphasis to particular areas. Any light that would affect the player is Stationary for the additional baked elements, but with the dynamic shadows for the assets that needed them. No dynamic GI or AO was used, as they were still fairly problematic when I originally started on the lighting. The fog was done with both types of fog types UE4 has to offer. The atmospheric fog worked well to give the static skybox more depth and color associated with the time of day, while the height based fog let me push the low-lying, dusty feel. Finally, there were multiple post-process volumes placed around the scene. One that was unbound and used for the entire scene and a couple of volumes for some of the interior spaces. The global volume had grain, bloom, chromatic aberration, vignette, tonemapper and exposure changes, while the individual interior volumes used the same settings but with minor color and exposure adjustments.
*The method of relying on real-world luminance values in UE4 isn’t 100% perfect as some luminance values aren’t possible in the editor. There are also other factors that can adjust the measurement, such as cubemaps, fog, and other lights, so the luminance will shift throughout the development of the level. However, I enjoy starting with the measurement for base lighting as it generally captures the mood pretty quickly and allows me to artistically deviate later on during a polish pass.
There is a lot of good advice to be passed on to people with less experience if they are unsure how to get started or where to focus their attention when starting any new project large or small. Here is a collection of tips from myself and others working with me on this project:
One way to get things done quickly and move at a good continuous pace is to focus on the big picture first. Broad brush strokes, get your forms and composition down before you get too involved with the small details. It is easy to get lost in the details and doing so can quickly bog down your development process and push your goals way out! Also, find some good production methods that work for you. I have personally seem a lot of forum posts that talk about the right way and wrong way to do things, ignore these. There is no right and wrong way to create things. Be open to other methods people are trying to teach you, as it can only help increase your skill set, but at the end of the day, if the process works for you, and the end result is to the quality level you were striving for, then you did it the right way!
Understanding PBR can make things much, much easier when the scene is coming together. Utilizing any of the current texturing tools like DDO or Substance Designer/Painter will speed up the texturing process tremendously and allow you to get fairly accurate materials in place much faster. Having all of the materials feel unified and grounded in the space will help when it’s time to do the lighting, which is another extremely important aspect of an environment (but I might be a bit biased). Don’t be afraid to dive into the technical side of building an environment either. Knowing how the lights will affect your materials, the difference between the two cubemap projections, the 3 light types and the multiple shadowmap types they offer will make lighting much less painful and easier to troubleshoot if something looks wonky. Color theory also helps a lot with lighting, because that lets you know how to push the scene more through the use of color relationships on top of the existing textured assets. The mood can be established just by the colors, regardless of the light intensities.
We would not recommend to anyone fresh out of school to try and tackle something of this caliber. It would probably overwhelm them. Start smaller, work with other friends and colleagues to divvy up the work. Even if everyone just makes one or two assets to share in a scene, try to get as much mileage out of each piece. Understand a true PBR workflow and share universal materials dressed with decals to give them life. Inefficient construction will also save you time, but will be harder to run on an average machine. Quality and speed are never on the same side of the spectrum, so make your choice at the start of the project and plan accordingly.
Quote from the artist working on the Imperial shuttle: I worked on the Lambda Shuttle and I went about making mine a little different than everyone else. I went with the more traditional high poly to low poly bake. Looking back I would definitely recommend skipping the high poly step altogether and just working on your final mesh from the beginning. The time savings makes it totally worth it unless you plan on having a really nice high poly model to show off on your portfolio. To get the nice edges you would normally get by baking high to low you can use several other techniques. Maya and Max both have ways of using a shader to get rounded edges on hard surfaces and that will save you a ton of time. There are some pretty exciting new tools in the works that will allow you to easily bevel all of your hard edges and create a quick high poly as well.
Make sure your proportions are accurate. If they are off the asset will look incorrect even the player/viewer can’t pinpoint what is wrong, they will still know something isn’t right with the asset. Give your assets History. Don’t just make a door and paint it red. Think about what has happened to the door. What color was it before it was red? How many times was it painted? Who or What uses the door? Are they wearing metal or cloth? Is the door kicked open or pushed open? All these give history to a door. It will make your asset infinitely more interesting. Together this will create a better overall composition.
Thanks for taking the time to check out our project. If you are interested in seeing how the project evolved from the start, we have a polycount thread on it that was started pretty early on that shows the project in its early states.
Also, if you would like to download it and enjoy it first hand, please feel free to do so. It is a bit system intensive we recommend a minimum of 16GB of system RAM and at least an Nvidia GTX760 or AMD equivalent to run at acceptable frame rates. For high frames rates and / or resolutions of 2560 x 1440 or 2560 x 1600, we recommend at least an Nvidia GTX970or higher, or AMD equivalent.
You can download it here:
Happy creating everyone!
Full list of the people who have contributed to this project:
- Jason Lewis
- Terry Hess
- Craig Marschke
- Ken LeSaint
- Thad Clevenger
- Brian Leleux
- Aaron DuBois
- Geoff Schofield
- Daniel Cuatt
- Matt McCorkell
- Matthew Carranza
- Adam Hernandez
- Jami Moravetz
- Brandon Rosser
- Steven Quintero
- Anthony Rogers
- Seth McCaughey
Jason Lewis, Senior Environment at Obsidian Entertainment
Interview conducted by Kirill Tokarev.