NAKAGIN PHOTOREAL ROAD TUTORIAL

Nakagin Capsule Tower

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:

RoadMesh

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.

RoadGeometry

Now let’s take a look at the shader network:

ShaderNetwork

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.

Diffuse1

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:

Road_JustDiffuse

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:

ShaderNetworkDiffuse1

And this is how it looks like in the render:

Road_DiffuseMixedNoise

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:

Road_DiffuseMixedNoise_CompositeDistance

This is then plugged into a V-Ray Distance Texture as follows:

Road_DiffuseMixedNoise_WithDistance

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:

ShaderNetworkDiffuse2

And the result:

Road_DiffuseMixedNoise_Composite2

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):

UVWunwrap_Channel2

This is the part of the shader network we are now looking at:

ShaderNetworkDiffuse3

The final Composite Map looks like this (I’ll get to the markings maps in a moment):

Road_DiffuseMixedNoise_FinalComposite

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:

Road_DiffuseMixedNoise_GrungeLayer1

And the second grunge layer mixed in:

Road_DiffuseMixedNoise_GrungeLayer1and2

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:

UVWunwrap_Channel3

This is Layer 5 in the final diffuse composite map and it looks like this in the render:

Road_DiffuseMixedNoise_GrungeLayer1and2_markings1

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:

Road_DiffuseMixedNoise_GrungeLayer1and2_markings1to4

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.

Road_DiffuseMixedNoise_FinalComposite

These are the four markings maps I use:

Markings

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:

ShaderNetworkReflect

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:

TarmacSeams

And this is the UV coordinate set it uses (a UVW Unwrap modifier using Map Layer 7):

UVWunwrap_Channel7

This is how the reflectance/glossiness/bump composite map looks like with these four elements plugged in (note the blending modes and opacity values):

ReflectGlossyBump

Here is a render showing just diffuse, reflectance and glossiness:

Road_Reflection

And the final version with bump added, a subtle but perceivable difference:

Road_Final

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.

Leave a Comment

    • Scott Waddell
    • January 11, 2016

    Great tutorial! Did you create the diffuse base texture? If you put it in your store I’d love to purchase it!

    • carlocki
    • March 10, 2016

    Hi Betrand, great rendering 🙂
    I have some problem onto the definition of the last composite…
    screem mode seems not to give me the right results

    • carlocki
    • March 10, 2016

    everything solved
    for every uvwmap I use a channel more and I can control everything in an easy way

    thank you Bertrand

  1. Glad you could solve it ans sorry for not reacting.

    • Dream Fyrir John
    • April 21, 2016

    Thanks for this great tutoial!

    • J.R.McCulloch
    • May 24, 2016

    It’s not very clear how all of the different UV maps are set up. Would it be possible to have this area explained a bit more?

    • tomdarch
    • September 2, 2016

    Best road material I’ve seen. How difficult do you think it would be to reproduce this in mental ray? I get to the part where you use V-ray Distance Texture and fall off the train.

    • souzagiovanne
    • January 16, 2017

    Hi Bertrand! Love that render! (and everyone else) 😀
    I have some problem, with texturing of a large road network, with straight and curved streets, roundabouts …
    In short, problems with mapping! I think that painting such a large area would have a texture with an absurd size, and I think Composite is the solution! But, is there a better way to map this type of situation? I’m making an external scene here, and with one street or another, I can easily solve it, but on a large scale, things get complicated.
    I look forward to an answer, and thank you very much for sharing your knowledge with us!

    • Christian A.
    • February 13, 2017

    Hello Bertrand,
    amazing project as always and a great tutorial as well.
    Only one thing I was wondering about, how do you create the road geometry to achieve the curvature?
    I first thought you use a spline outline of the road and than do offset, cross-section, linear connecting and finally a surface.
    But this seems to result in a different topology than what you are showing, so I guess you have a different approach.
    Would you be so kind to enlighten me?

    Thanks
    Christian