This entire project was a big experiment in rule-bending, just to see how far I could go. I was inspired by Id Software's “Rage” and its use of mega-textures to create amazing vistas with no perceptible repetition of details. The main issue with open-words in games is not so much that things don't hold up up-close; rather, it's that they dont hold up far away! Tiling textures can only take you so far and Skyrim suffers terribly from ugly-carpet syndrome. I wanted to do a kind of pseudo-megatexture environment and see where I could go with it. I work in Unreal though, and Unreal is definitely NOT made for that kind of thing. Well, I wondered if I could just make an environment out of several very large, unique 'hero props' and use every other trick I know to make the scene compellingly alive. I decided to attempt to incorporate a bunch of things that the Unreal Engine was NOT designed to do, all in one project, with no DX11, no static lighting, and no scripting. An utterly stupid idea.
The project then became this: An environment composed almost entirely of unique assets that hold up equally well up-close as they do from afar, a waterfall and river, trees with individual leaves, and grass with individual blades. All of this is to be lit with only dynamic lighting and include a full day-night cycle with an animated skydome and dynamically lit clouds. Everything done from scratch and by hand, with no photograph textures used. That last part is a preference, I just very much prefer the look of hand-made textures.
To begin, I knew I could at least make the land as intended, since the scope of the project was limited to this one scene. The first thing I set about doing was making a very basic proxy for the tower, the stairs, and the surrounding land. I then sculpted every large rock so each would be completely unique. I then used Mudbox's “reduce mesh” function to make the game-model of the land. Why an automatically generated model? Because static meshes don't really need edge-flow and everything is triangulated in unreal anyway. This turned out to be successful enough that I employed the same workflow for the majority of the larger assets, like the stairs and the stone arch over the door.
After the land had been sculpted and reduced, the tedious task of arranging the Uvs consumed my next two nights. I divided the land into 22 sections and partitioned each to its own UV tile, until I had what would have to be a 5x5 tile grid on which to bake my maps from the high-res model. Thankfully, Xnormal had recently removed its limitation on map sizes, so I was able to bake my various normal, AO, cavity, and curvature maps without having to split up the mesh prematurely.
Using the maps for texturing was another matter entirely. I would end up with a 10K map that would need to be split into 22 (25 with 3 discarded blank) maps. The bottom row would eventually be 2K maps while the sections further away from the player's view would be saved in progressively reduced resolutions, until the top row is 256x256 maps. But for the sake of using just one photoshop file, for now they would ALL have to be 2K! This exceeded the size limit on photoshop's “Save For Web” function which meant I would have to use recorded photoshop actions – canvas size, filter/offset, save, repeat – to save all my tiles out in one command. Recording that action took a while but once it was done, saving 22 maps from a single file was quick and painless. I made the tower's overall texture the same way but that was only a 2x3 grid!
To get the land working in-engine, I then assigned a different material to each of the land's sections and made one master material from which the other 21 materials would be instanced, with only their normal and diffuse maps changed. This ensured that only the textures being seen would be called.
I used a few tricks to make the textures work better up-close. For the land, I had an ordinary tiling detail normal map over the regular normals, and a pretty neat tiling pebbles texture, controlled by the red channel of the vertex colors, that didn't fade out at the edges. Instead, the individual pebbles got smaller and futher apart, a much more convincing effect! The wetness on the rocks near the water is also controlled with vertex color.
Click HERE to check out the land material's node tree!
The tower's material has editable brick density, allowing me to chose the size of the bricks without increasing or decreasing the resolution of the bricks' textures. I did this by creating 3 different tiling brick materials with variations built in, and then using 3-channel mask to divide the bricks between the three textures. The mask's UV tiling controls the density of the bricks, independently of the other three textures.
Click HERE to check out the tower material's node tree!
The water is all one mesh, with one material on it. The material uses a vertex world-position offset animated with a timer controlled by the blue channel of the mesh's vertex color. I made a white texture that only shows up when the water's surface is a certain degree away from facing straight up (dot product of world normal), so anywhere the water bulges around a rock or falls straight down, the white breakup makes it look more turbulent and realistic.
The particles of water are unlit and additive, but they use the scene color behind them to determine how bright to be, letting the water avoid glowing bright white when night-time comes and everything goes dark. The caustics under the bridge are light functions, which I found out do NOT work well with decals(!!).
Click HERE to check out the water material's node tree!
The hanging moss is just a static mesh, but the moss on the rocks and bridge are all decals. I used a variation on the world-normal interpolator from the water to blend between 3 of the same texture mapped to different coordinates in world-space. This way, the moss could be any size and be on any surface and it would always have the same resolution.
The trees are single meshes with several instanced branch meshes stuck onto them, each with 5 LODs, going from a 7800 triangle high res with individual leaves, to a 6 triangle LOD4 thats just textured cards. Like the water, the leaves are also animated by vertex world-position offset on a timer, but every channel of the branch's vertex color is used to control different animations, all added onto each other. The blue channel controls the motion of the entire branch, while the red and green channel control the movement of the individual leaves when you're up-close. The grass is done the exact same way.
This entire sequence is controlled in matinee. I use animated post-process volumes with different color lookup-tables for the change in color-grading, and a single dominant directional light for the sun. The sky uses custom lighting setup whereby the inverse of the reflection vector of that directional light determines the place of the sun. The night sky is a 4K (!) emissive texture I painted in photoshop that just fades in via matinee. The clouds are a separate material that was a nightmare to set up and I still dont fully understand why it suddenly started working. I suspect gnomes.
Check out the DEMO section to see the environment running in UE3!