18 March 2022

Wooden Floor – Material Breakdown – Christian Tammekänd

christian-tammekand-2-scaled

My name is Christian Tammekand also known as Karmah in the esports/game industry. I have been a Texture Artist for over 4 years working for AAA games such as Rocket League, Division 2, Assassin’s Creed Valhalla and Godfall.

I am also part of the E-Sports community and have been working with FaZe Clan, NMBRS, Activision and Riot Games.
Achieving realism within textures and environments is something I always try to aim for.

References

references

Reference gathering is a very important stage when it comes to anything I create. It’s great especially for textures to know how the roughness feels on certain surfaces to achieve the correct detail.

For this instance, I used a couple of references of patterns and how the surface looks close up. I already have a strong understanding of how wood surfaces look so, therefore, I didn’t gather too many references for this texture.

Startup

startup

Whenever I create a new texture I start off with a ready-made template to kick off the project. I always set my normal map intensity to around 10-15 and AO to 1 with 16 bits. I place it through Invert Grayscale so everything I now plug into this node will apply to all of my maps at once which speeds up my workflow by not having to connect them one by one to each map. It’s honestly a big time saver.

Base pattern

This floor pattern is pretty straightforward. I started by using a square shape and tile sampler set X to 6 and Y at 1 and rotated it 25 degrees and blended them into the square using Multiply.
I then used a tile generator to achieve a checker pattern by clicking “true” on the Checker Mask in the tile generator settings. I rotated it 45 degrees and blended them together using Max Lighten to create it into a diamond-shaped floor pattern.

Pattern variation

patternvariation

Flood fill is probably one of my favorite nodes in Designer. It gives so much more variation and
storytelling about your texture. I started off with using a histogram scan with full contrast to get a mask and then Flood fill > Flood

Fill to Grayscale and Flood Fill > Flood Fill to Gradient which I blended them both to separate blend nodes using multiply with a low value to have some of the planks higher and some lower.

Flood fill to gradient is great to get some angular shapes.

Now I use clouds 2 with blur hq grayscale to blur some of the sharp detail and run it through a slope blur grayscale to get some warp distortion in the planks and blend it using “Min Darken” with opacity set to 0.6.

Edge chipping

edgechipping

I start by using Clouds 2 with a Histogram Scan with high contrast, then run it through a Directional Warp with the floor pattern to randomize it. I used Blur HQ Grayscale to blur some of the sharp areas and placed it through a Slope Blur Grayscale with our floor pattern mask set to a low value of 0.23 intensity and 32 samples and mode set to “Min”. (This gives wood the nice chipping effect)

I ran it through a Blend with mode set to “Divide” so it only focuses on the edges of the planks. I inverted it and added auto levels to correct the grayscale values and placed it through a Non-Uniform Blur Grayscale to get some of the softness in there with having the floor pattern mask in the grayscale input.
Non Uniform Blur Intensity set to 4.13, samples at 4 and blades set to 9. Lastly, I blended the original pattern with this edge chipping and set the blending mode to “Copy” and played around with opacity to my liking. I created the same exact blend after, and set it to “copy” with a little lower amount of opacity.


Wood Grain

I used Directional Noise 4 through a Directional Blur with the intensity of “135” and angle -15 degrees. I made 2 for more control. I ran it through auto levels to bring out the whites a lot more and I inverted the shape to blend them using Multiply.

wood-grain

This is where I start to get the wood grain shape. I created a gradient linear 1 and placed it through a tile generator with Y set to 10 and Image Input Filtering set to Bilinear which removes unnecessary edge gaps. I plugged them into a Vector Warp Grayscale and achieved the wood grain pattern. I also used a gradient node for the “vector map” and plugged the auto levels into that. Now I can use the directional blur angles and intensities to achieve different types of wood grain patterns.

directioanlblurs

I now started using directional warp’s and slope blur grayscales with a very low value to give it a more natural look to the wood. Main nodes I used for this are:

● Directional Noise 2
● Directional Noise 3
● Clouds 2
● Perlin Noise

Using these nodes with low values we start to break up the wood grain and get some sharp splinters in there.

Wood Grain Detail

woodgraindetail

For the wood grain detail, I am blending together directional noise 1 and 2 with just “copy” and opacity set to 0.73. I am using a directional warp with a value of 120 to push out the wood grain to get the grainy feel. I am now using a level node to push the white areas out. I made another levels node to pull out some dark areas too and blend both together using multiply with opacity set to 0.55. Now I blend the wood pattern and the grain together using Min Darken with opacity set to 0.8.

anistorpoicnoise

Now I’m adding more wood detail. I used Anisotropic noise with Y amount set to 256 and “Y amount by resolution” set to True. I then ran it through a Directional Warp with a Directional Noise 3 to get some choppiness in there with intensity set to 5. As you can tell I’m constantly using Directional Warps to achieve randomness within these noises which makes the texture more realistic and adds a lot more information.

I created a “gaussian Noise” and ran it through a standard Warp node with low intensity to get some variation and used sharpness to bring the values out a little more. I rotated it 45 degrees and blended them together using “Max Lighten” and the Opacity set to 0.35.

blendingtogetherwoodgrian

Wood hole pattern

woodholepatterrn

I simply added a Perlin noise with Histogram Scan to only bring out a couple of white circles from the noise. I ran it through Histogram Range (Range: 0.22 / Position 0.19) and used Directional Warp with intensity set to 200+ with the angle at -166 so now the holes are following our wood pattern.

Masks

masks

I created 2 masks for the pattern. I used the original tile generator followed by a 2D Transformation node to rotate it 90 degrees. I made Histogram scans with contrast set to 1 and position set to 1. This allows us to mask exactly where we want our wood grain to be with the correct angle.

Blending it all together

blendingittogether2D

Before I blended it all together, I made 2 “2D Transformation” nodes and rotated the wood grain with the same angle as our planks.

blendingitalltogether

I now use the masks created with wood grain and plug them into a blend using a very low opacity of 0.007. I only want to have slight normal map detail in the wood grain. The main grain effect will take place in the albedo and roughness otherwise things become very noisy and unrealistic.

Albedo

albedoWoodDetail

Before I jump into doing albedo, we need to make sure our masks are in place. I duplicated the angled masks I created before and the angled wood grain. I blended them the same way as before using the wood grain and mask with a Multiply. I’m keeping the intensity at 1 as we want to get as much information we can from our wood grain therefore I also run it through auto levels to bring more detail out.

albedo

I then also took our main wood floor pattern without the grain and ran it through a flood fill > flood fill to grayscale. With this mask, we can get some really good color variation for our texture.

With albedo creation, it really comes to finding good references of the texture online. Once I found a high-quality wooden floor texture I used a gradient node and picked the gradient from the picture by dragging the cursor across the image.

I wanna get some bright colors alongside dark and started to blend them together using our “Flood fill to grayscale” mask. With the grayscale mask, we get a really awesome variation of colors.
I keep picking different gradients from the pictures and playing around with blending them together using just “copy” and lowering the intensity. I’m also duplicating our flood fill to grayscale node and randomizing the seed to get different variations.

albedoFloodFillGrayscale

Great nodes to use when creating albedo are:

● HSL
● Contrast/Luminosity
● Different Grunges
● Dirt/Dust nodes
● Metal Edge Wear

curavturesmoothAndDirt

One thing I do to almost every texture is I create edge highlights. It adds a lot to the material and makes it look more aged. I made a curvature smooth node and plugged it into the Normal Map. Ran it through a histogram scan, position set to 0.38 and contrast 0.66. I just want the edges to be visible. I blend them using “Add linear dodge” with a low opacity. I don’t want it to overpower because it can give bad results.

Once I was happy with the base color, I added some dirt. I used a “Dirt” node and plugged it into an ambient occlusion map. I played around with the intensity, placed it through another gradient map with a brownish color and blended it with a copy. I used the dirt node as the mask for it too.

I also used a scratch generator to add some finer detail to the surface.

scrathchgenerator

I made a flood fill to gradient node and ran it through a gradient map so we can use it as color just to darken out some of the planks.

finalendalbedo

Finally, in the end, once I’m happy with my Albedo I add a “sharpen” node to boost the realism but be careful not to set it too high as it may get really noisy.

Roughness

roughness1sentence

I started off by creating Curvature Smooth and plugging it into the Normal. I’m using the flood fill to grayscale to get some variation and blending them together using a copy with intensity set 0.3.

This was followed by another blend and using our wood grain pattern that we used for our albedo and lowering the intensity.

roughness2sentence

I used the dirt node I created earlier for albedo and blended it with “Add linear dodge” with intensity set pretty high so the dirt will have no glossiness to it.
I added a grunge map and blended it with low opacity to give variation in the roughness. I added a sharpen node at the end of the roughness to boost up the quality. A good thing to keep in mind is to have some shininess to the roughness, even if it doesn’t exist on a certain real-life texture, having some fine reflections will definitely boost your texture.

Lighting setup and rendering

Before I begin with the light setup I always make sure my plane/sphere model has enough geometry to play with otherwise there will be choppiness in our tessellation/heightmap.

geo

I begin by having our capture settings in place. For this instance, I’m using 2560 x 1440, sampling 16x and format as PNG.

capturesettings

I go ahead and create new material and add our texture inputs to the material.

I set the subdivision to PN Triangles and I flip the Y on the normal so we have the correct angle for the light to hit (depending if your normal map is DirectX or OpenGL). I also added my AO map into Cavity Map which boosts the AO even more.

For the scene, I started by making a new camera by clicking the icon on the top toolbar and changing the field of view to 26mm as I wanted to go for more close-up shots.
I always use Tone Mapping as “ACES” and Linear depending on the texture. ACES gives a more contrasted feel to the scene while Linear feels more washed out which does also works for certain textures. Lastly, I used slight Sharpness and Grain to boost the texture.

hdri-scaled

I used a preset HDRI for the sky which was “Grace Cathedral” which worked great with this scene. I modified the HDRI brightness so it was not overpowering as I want to make sure the main light source are the custom lights that I will be adding but having the HDRI in the back helps to bring in some good reflections.

1light-scaled

Now it’s time to add the lights. I created a light and changed it to smooth blue and rotated it to an angle that shows off all the nice detail of our roughness map and our normal. By going into the Light Menu > Shape > and increasing the Width, we get a more realistic falloff/bounce and also check on the “Contact Refinement”.
Holding shift and holding down the right mouse button we can rotate our lights accordingly or we can directly use the Axis on the screen to rotate the lights.

liught2-scaled

Once I was happy with the first light placement, I added another one for the right side but this time with a lower brightness intensity. If we have both lights with strong intensities it starts to overkill the scene and becomes unrealistic so we need to always find the correct balance between them.

Usually, 2-3 lights work great for scenes, the more lights you end up having the more the detail starts to fade from your texture.

rendersettings

In render settings, I changed the resolution to 2:1 (Double) and Anti-aliasing to 4x Temporal. I ticked on High DPI, Local Reflections and Internal Refraction.
These settings are the highest we can achieve and if Marmoset happens to slow down, you can always click on the little spaceship icon which reduces the quality so we can move around in the scene without any lag.

Now we render!

By clicking F10 on the keyboard it will render out the scene.

Final Words

Thank you for reading this article, I hope you learned something useful and hopefully you can use some of these tips for your future projects. Do not be afraid to reach out if you have any questions or you would like to receive any sort of feedback.

My Twitter is @KarmahArts & discord is Karmah#9967