New world art assets, more realism now? (Patreon)
Content
Author: Salireths
In the previous post we have looked at the process of texture creation, however, game environments are not made just out of textures alone! Textures have to be applied to 3D geometry with the help of the shaders, and that's what I've been so busy creating.
Shaders are, roughly speaking, small programs that run on your GPU for each pixel on screen to render each frame. It accesses geometry and texture information and mashes them together via power of math, producing the result that you see!
Since the time we started, Unreal Engine team have added so much new amazing features into the engine, and it seems like its power is growing exponentially, especially with the upcoming Unreal Engine 5. Not only they are adding new artistic opportunities, tools that are more convenient to work with, but also they make the games run smoother, and optimization process less painful!
This is why, even though I created some shaders a couple years back, to utilize all this new amazing tech I had to bring my work up to speed, and the most efficient way to do that was to re-do it from scratch.
The new pipeline is already much easier and faster for me, and has amazing features for me to utilize to raise the art quality bar for our project. I really like how it looks, I think this kind of graphical fidelity and style finally starts to represent what I dreamed about all this time, though I couldn't believe that it was achievable for just one tech-artist. And while I'm the only one making models for our game, its only possible thanks to many other artists and programmers working at Quxel and Epic Games who generously provide their hard work as assets for everyone to use and remix as they see fit.
Level Creation
Tiling Textures
A bunch of new textures were completed, so I can freely paint textures and surfaces!
Keep in mind, these textures are unlike most other textures you might encounter around 3d realms - they do not have color in them - everything you see on the gif above can be recolored into any color right in-engine (and also gif kills color anyway).
Color might be a simple thing, easy to overlook when you're working with fancy materials, reflections, lighting, normal (bump) maps, etc. But color is one of the most crucial elements when constructing any scene. Having a full artistic control over it is very freeing.
Height-Blended Texture Transitions
The textures are painted onto the landscape manually or via special procedural brushes, but they need to transition nicely between each other. Simply cross-fading them is not enough any more, not realistic, and leaves the obvious old-videogame look. Here, the textures gradually replace each other based on their height, this way, for example, a rock can appear on top of a grass cover as it transitions, even though they are from totally different textures.
All together it creates satisfying and realistic surface transitions.
Landscape Editing
A new UE4 set of features that allows to literally move mountains. Previously landscape had to be painstakingly sculpted by hand with little ability to move things after the fact. This should tremendously help creating level layouts and iterating on them quickly.
Water
New UE4 features that create all kinds of water bodies, simply, efficient and fast. Similar to landscape tools, you can literally shape the world with it quickly, and if you change your mind - it's easy to move oceans. The depth of the water system alone deserves a post of its own, perhaps later, when I'll be making a more thorough dive into it.
Runtime Virtual Textures (RVT)
This new UE4-UE5 feature allows to paint many different textures on the landscape, essentially for a very small performance cost for players. The engine creates one huge texture for the entire landscape of the level, however in order to keep it performant, it generates high-resolution tiles only near the camera, while places further away are very low-res (until you approach them, that is).
It works sort-of like loading a terrain view google-maps, by splitting the world into many tiles with different texture resolution.
Texture Bombing
Used to remove texture tiling artifacts (you know how annoying that can be in games). Usually a very expensive (hard on your GPU performance) technique because it samples the same texture multiple times and stamps it at different angles every time, blending the seams in-between them, but because Virtual Textures caches it, its basically free now! And thankfully UE already has a function for it built-in, I just modified it to fit our art.
Distance Blending
Makes textures disappear into macro-scale solid color at the distance, helps bring out big landscapes and distant objects without the busy noise throughout them. Can't really show it in a GIF because compression just kills it.
World Painter
This system will let us make worlds more visually interesting, give an ability to define specific colors in any spot on the level for a much better artistic control, different biomes, mood, etc. Inspired by Cyan Worlds' tech for their upcoming game Firmament.
We just started on this one, it's not finished yet. The bright colors used in the gif above is just a test of blending between different placeable in-level brushes.
Landscape Blending
Thanks to RVT feature mentioned above, additional objects (like rocks) can be seamlessly embedded into the landscape, creating nice, imperceivable transitions.
Virtual Heightfields
Yet again, the RVT enables yet another cool effect. Traditionally, in games, landscapes are 3D models that have a polygon approximately every one meter. Now, with this tech, we can make it so it creates a polygon every millimeter! The textures on the landscape don't have to be flat ever again. This is a replacement for the older, more laggy, less efficient, deprecated tech called Tessellation (maybe you've seen it in other games).
Volumetric Clouds
Unreal Engine 4-5 now have absolutely gorgeous volumetric clouds that you can literally fly up to on your own Dragon wings. I have yet to learn this system myself in order to create interesting and more art-directed clouds with it, so I'm not showing it now, but there is plenty of great screenshots of what its capable of.
Generic Shader
Generic shader is used on 90% of all static-mesh surfaces in the game, thus such an anticlimactic name. It is designed to be suitable for almost all static decorations and items.
Material layers
It's hard to explain what it does it without getting into technical details, but the result is that instead of writing a giant spaghetti mess of node-wire-code, it is like a lasagna now, split by layers that are easier and nicer to write and maintain.
And then, once written, these layers can be stacked together to create shaders without delving into code at all, which personally helps me a lot. It might not be obvious how difficult it is to switch gears from being an artist to programmer and back, and now - I don't really have to do it as much, I can focus.
Base Trim-Sheets
To provide various models with the necessary details and difference in material, I'm creating textures that are reused across many different models, a piece of it here, a piece there.
It's like a sheet with stickers you can apply onto miniature models. You cut them from a pre-made sheet and stick where they look best to create quick details!
However, I'm unsure about its usefulness after we transition Unreal Engine 5 - where instead of flat textures I could just model it out with actual 3D geometry, because polygon count is no longer even a consideration…
Matter Composition
To facilitate our crafting system that we've prototyped, we need to give items a possibility to be created out of different materials. Same item but different finish - this can have consequences on its usefulness and durability systemically, without creating more models for different combinations. Kind of like in Tinker's Construct mod for Minecraft.
Additionally it just helps creating environmental art and control the mood of the scene. Don't like the look of cold sharp metal? Swap it to warm cozy wood.
Item Damage
Similarly to how item can be made out of different matter, this matter can be chipped away and depleted. This also needs to be visibly reflected in the model, either when it's partially damaged or fully destroyed.
Dirt and Wetness
With such a dirty game like ours, one simply must have a way to make a mess out of things! It's not something I got time to finish just yet, so I can't show you any results yet. I'm sure it will be a part of a much more lewd post in the near future.
Triplanar Projection
Sometimes creating UVs is too difficult, time consuming, or even impossible, sometimes a model just needs a continuous surface without any texture-seams. If you played Space Engineers or No Man's Sky, you can notice how textures effortlessly flow on the geometry when you dig through the ground. The same texturing technique can now be applied in our game as well.
Level Assets & Models
Rocks
You need rocks to make any convincing outdoor scene, no exceptions. And this is why I was sculpting a batch of new rocks for our game, and a lot of them! Old ones that I did were cool and stylish, but ultimately not very fitting for the rest of the game's new art.
I used Quixel Megascans as a starting-off point and hand-sculpted the rocks into different shapes. They turned out to be somewhat a mix between signature-Blizzard and a realistic style, which I liked very much.
I kept modularity in mind when creating these rocks, what sort of use they will have when creating levels. Some rocks are good at creating ramps and overhangs, others are better at creating cave walls and ceilings.
Then I created a low-poly version of every rock and did UV mapping, after which I baked the textures for the rocks at 8k resolution, textured them in Substance Designer, and put it into the game at its full 300 mb glory. But don't worry, it won't blow your GPU up, the engine actually doesn't load entire textures at the same time, it only loads a portion of it that it needs thanks to power of the new Virtual Textures feature (it looks super crisp).
When its time to move to UE5 I will probably ditch the baked textures completely (high poly models can be directly painted without textures), and just use the raw mesh with millions of polygons. It will actually be a lot more performant and require much less space on disk than the low-poly with textures.
Biotech Stuff
I'm still scratching my head against creating a unique technology and culture for Dragon civilization in our game. Lore-wise I did change and iterate on it a lot, but what is a central point is that I want to show Dragons from their lewd sides, as this has been the main motivation for me to create since the beginning of my artistic journey.
However how does one make a technology inheritably lewd? That's what's been on my mind for a long time, and I need a lot of good ideas for it (please help me out!).
Here is an example, an accessor/computer that player will need to use in order to open doors and control things, somewhat similar to a totem, shaped in a way of you-know-what. User needs to insert their hand into the opening in the middle to interface with it. And who knows, maybe large Dragons just prefer to sit on them!
To texture this object I used the trim-sheet technique I talked about before. It is a quick way to give it some details which otherwise would take too much time to model and bake into a unique texture (which will also be blurrier than trim-sheets). As a counter-side to this approach, it requires meticulous planning. Otherwise how would you design a texture that you intend to use far into the future?
In fact, the sole purpose of this pillar for a time was to actually test the trim-sheet texture/shader I designed. I will be making more objects later and will also update the old biotech models (which are unfortunately broken right now due to me re-writing shaders).
Bonus - Unreal Engine 5
Unreal Engine 5 early access was recently announced, and while we're not yet switching to it just yet, we will for sure in the future. I couldn't help but peek into it and was absolutely blown away by the amazing possibilities it brings. Let's look on why exactly it is a game-changer for us.
I don't have any of my own screenshots to share just yet, so please check the video in the link above, it's really worth your time (much more than any of my presentations).
Lumen
Lumen is the future, and it is the bright one at that! Since the beginning of real-time graphics people have been trying to create a solution that would create believable lighting in the virtual world.
Direct light has been figured out for a long time already, but not the indirect scattering, like when its an overcast day. Most games pre-render such lighting on the surfaces in a static way (Source Engine is a famous example). Yes there is also Nvidia RTX stuff... But its slow and expensive (I have RTX 2060 and its not enough to do raytracing properly).
Lumen changes that, you don't need a specialized card to have it enabled. While not as accurate as brute-force ray-tracing, the techniques used for it are, I believe, an ideal balance of quality and performance.
Our game is fully dynamically lit, meaning that even if we wanted, we can not pre-render lighting like Source Engine does. Lumen will dramatically enhance the artistic quality of our levels (and its very simple to make great looking day-night cycles too).
I'm very excited for this tech, it has been creating truly jaw-dropping results so far!
Nanite
So, traditional approach at creating static/rigid mesh models for games is…
- Block out the rough base-mesh of the model you're creating.
- Sculpt the high-poly model out of the base-mesh, that’s the part that's actually fun.
- Paint the high-poly model (not always but we can use the paint later).
- Spend tedious hours to turn the high-poly mesh into a low-poly one (you place every polygon by hand).
- Spend tedious hours to create a UV-map (a special layout describing how a 2d texture maps to the 3d model).
- Bring the hi-poly model and low-poly model into a special "baker" software where you'd "bake" out special textures (including the painting we did).
- Take the baked textures and low-poly into a texturing program (Like Quixel Mixer, Substance Designer, or Substance Painter) and create actual textures that are going to be used in game, and export them.
- Take the low-poly and create at least 4 alternative versions of this one mesh, progressively reducing the Level-of-Detail for each. The less polygons are rendered when mesh is at the distance from camera - the better performance will be. And be careful to make it so players don't notice the "pop" when the mesh changes when they step away/move closer. And be careful not to destroy the UVs!
- Create a separate mesh or a collection of primitives to serve as a collision mesh.
- Import the textures, low-poly, collision mesh, and all Level-of-Detail meshes into the engine, put it all textures into a material and apply it to the mesh. Now you can place it in the level after some tweaking.
- Get some sleep…
No surprise games take so damn long to create (or require so much people)! You have to repeat this process FOR EVERY MESH YOU MAKE! Sometimes it helps to batch models together, like what I did with the rocks I'm showing in this post, but it's still SO MUCH WORK! AAAAH!
Now, Unreal Engine 5 comes to the rescue. Let's look what the process of creating models for our game is like when using Nanite:
- Block out the rough base-mesh of the model you're creating.
- Sculpt the high-poly model out of the base-mesh.
- Paint the high-poly model.
- Create a collision mesh.
- Import the high-poly model with collision mesh into the engine, apply a special shader (the one re-used across all other meshes) to it and do some tweaking.
And that's all. Do I still need to explain why I want to use Nanite?
Not to mention, the quality of models is much better. Also, while hard to believe, but millions of polygons, when compressed, is less data to store on disk than high-resolution textures baked for low-poly meshes.
Other
UE5 also brings a lot of other cool new features, such as Animation Warping (create less animation permutations), World Partition (will help us work on large-ish worlds faster and with much less headache over manually splitting them into small chunks so it stays optimized), and Metasounds (when we finally get to work on sounds).
Why not move now?
Simply put, UE5 is in early-access and quite raw still. There are issues with stability and a lot of features are currently broken (like there is no transparency right now, so you can't have proper water or glass).
It is being worked on by Epic Games tirelessly, they say it is going to take them until early 2022 before releasing a proper production build of it, and we think we can and should wait. We have a lot of unfinished things in our own code now, we better focus on completing that first without having to deal with extra problems and extra delays.
However I can't wait to start working with UE5, and, if I find time, I might just prepare a few scenes in it before we switch to it.
Conclusion
Wait! We're not done here! What about creature shaders, trees and grass?!
Well, I guess it will have to wait another post...
As you can see, a lot is going on to make this game look good and still keep it feasible to pull off by one tech-artist (me). All the tricks and magic you can think of - you can bet I use it already.
Next post we'll take a look at the creature editor and what Hopfel has been brewing to make animations and creature-customization side of our game possible.
With lots of Dragon Love,
- Salireths.