When I posted my Nakagin Capsule Tower series of images a while back, some of you asked if I could elaborate on how I created the road material. The road is a minor element of the shots, but it was also one of the trickiest. Despite the modest area of the image it occupies, it’s one of those things that can kill the realism of an image if not done right.
The challenge with these kinds of large surfaces, in general, is always the same: How to maintain a non-uniform look that remains convincing from a long distance while still maintaining micro-details that hold up at closer quarters. You want to avoid both a repetitive “tiling” effect from afar and a pixellated look in close-ups. Of course, you could paint one gigantic textures, but you don’t have to. In fact, no texture, however large, is likely to maintain its crispness seen from very close. If you look at the image above, you can perceive the individual “grains” in the tarmac up close, and yet, you don’t see any obvious tiling looking further back.
One way to achieve this is to build a complex shader that relies both on seamless and non-tileable bitmaps and and on procedural elements. By mixing everything up using composite maps and overlapping UV coordinates, you can achieve a level of complexity that will hide all tiling and maintain a non-uniform overall look while still featuring convincing micro details. And the fact that everything is done in your 3D application (as opposed to adding layers and details in the final render), means you retain complete freedom of movement when choosing your camera angle. Such a shader will look good wherever you drop your camera.
Let’s start with the geometry:
As you can see, it couldn’t be simpler. One thing to note is that the mesh is not flat. There is a slight “bulge” at the center of the road. The curbside is slightly lowered (to evacuate rainwater more easily towards the gutters). This is not very noticeable in this bird’s eye view, but it will be if your camera is close to the ground and will be particularly visible in the reflections.
Below you can see the modifier hierarchy, essentially showing the different UV layers for the various maps I’m using. There are seven in total, with a mixture of UVW planar maps and unwraps.
Now let’s take a look at the shader network:
As you can see, the material is simple: Just a single-layer V-Ray Material. The only complexity lies in the network of maps, especially in the diffuse channel. Another simple feature of this mat is that it uses the exact same network of maps for the reflectance, glossiness and bump channels.
Let’s start with the diffuse channel. It all begins with a very simple, seamlessly tileable tarmac map.
This map is so uniform that it doesn’t display any visible tiling over large distance. This one uses Map Layer 1, which is a simple planar UVW Map of 10 by 10 meters. Below is how the material looks with just this map applied:
Of course, this is incredibly boring. But what matters here is the absence of visible tiling in the distance and the fact that the tarmac grains are sharp and nice up close. If your map shows tiling, try to make it more uniform using the high-pass filter in Photoshop. If that’s not enough, load the map twice in Max and offset one copy in the U and V axes and rotate it by 90°. Then mix these two maps in a composite map using a large-scale 3ds Max noise texture as a mask. This should take care of any visible tiling.
The next step is to create some initial variations in the diffuse over large distances. For this, I plugged the map into three color correction maps, each with a small variation in the gamma. I then used two different 3ds Max noise textures (with a scale of 500 and 700 respectively), to mix all these maps in one composite map.
This is the portion of the shader we are now looking at:
And this is how it looks like in the render:
We now have some nice variations, but the overall effect is still far from subtle or realistic. The next step adds another layer of complexity by adding the slight discoloration that is always noticeable near the curb where dust tends to accumulate under the effect of rain and traffic. For this, I created a new composite texture that mixes the lighter version of the color-corrected base bitmap with a light beige V-Ray color map using “color dodge” as a blend mode and an intensity of 70% for the V-Ray color map:
This is then plugged into a V-Ray Distance Texture as follows:
My first diffuse composite map is plugged into the Far Area Texture slot, my dust layer goes into the Near Area Texture Slot, and I have a fractal Max noise texture in the Distance Texture slot to break up the coverage. The distance object is my curb mesh (hidden in the render).
This is the part of the network we are now looking at:
And the result:
Getting nicer, but still far from subtle.
Next step is to add some grunge and grime: tire marks, oil stains, etc. For this, I used two tileable grunge maps to add to the mix. Unlike the tarmac texture, these stains have to follow the slight bend in the road, so I can’t use a planar UVW Map to map them. This is where our second set of UV coordinates kicks in. In this case, I used a straightened unwrap of the road. Nothing too fancy but it will ensure the grunge maps follow the curve of the road nicely. This is how Map Channel 2 looks like in the UVW Unwrap modifier (note the road appears compressed in the UV view. This is because my grunge maps are rectangular and not square):
This is the part of the shader network we are now looking at:
The final Composite Map looks like this (I’ll get to the markings maps in a moment):
Layer one is our diffuse map so far, and layer 3 and 4 add my two grunge maps (with a Multiply blending mode), which both use Map Channel 2 (ignore Layer 2, which is empty and should have been deleted).
Here is the render–still showing just the diffuse component–with one layer of grunge:
And the second grunge layer mixed in:
This is beginning to look like a road.
Now on to the road markings. I have two types of markings. The first type is tileable and repetetive and is applied using another set of UV coordinates (Map Layer 3), which looks like this:
This is Layer 5 in the final diffuse composite map and it looks like this in the render:
Don’t worry about the sharp “cut” in the texture where the roads intersect: We’ll mask those with our next set of markings. These second type of markings are textures that are meant to be applied locally and should not tile across the surface of the road. So when you load them in Max, don’t forget to untick the U and V “tiling” boxes. These are all applied using planar UVW Maps positioned on the mesh where the markings should be. I painted them in Photoshop using a top-down orthographic screenshot of the road showing the border of the UVW Maps.
Here’s the render with our last set of markings:
Looking at the final composite map again, note that the markings use a Screen blending mode and an opacity of 80 to 90%, to make them blend nicely with the tarmac. Using 100% would make them look too white.
These are the four markings maps I use:
Now that we have achieved the realism we were aiming for in the diffuse, let’s move to the other components: One single map for reflectance, glossiness and bump:
The various elements I use here are: A contrasty version of the initial tarmac bitmap, my two grunge maps, and a new map that is supposed to mimic the kinds of “seams” where smooth tarmac has been poured to fill in cracks. Such seams are generally the same color as the rest of the tarmac (and hence not visible in the diffuse), but they affect the reflectance and bump values of the road because they do not contain the “grains” that the rest of the tarmac has. They are a lot smoother.
This is the map I used for these seams:
And this is the UV coordinate set it uses (a UVW Unwrap modifier using Map Layer 7):
This is how the reflectance/glossiness/bump composite map looks like with these four elements plugged in (note the blending modes and opacity values):
Here is a render showing just diffuse, reflectance and glossiness:
And the final version with bump added, a subtle but perceivable difference:
That’s it. Once you’ve done this, you can take your camera wherever you want and your road will look good under any angle.
I hope this was useful. Let me know in the comments below if you have any questions.