Support Blender Core Development with a monthly contribution.
The creators who share. Access production content and knowledge from the Open Movies.
Latest news and updates on Blender development.
Join the community and help with design, development, docs and more.
A platform to collect and display the Blender Benchmark results.
Documentation on Blender's features, tools and API.
The yearly event that brings together the Blender community in one place.
Download the latest Blender version, or try the beta!
The Shader Editor
Colors, Values & Vectors
Vectors and Pixels
Geometric Dependency - Context Sensitivity
Generating PBR Maps
Blending & Masking
Walls (Chapter 2+)
Wood (Chapter 3+)
Dynamic Walls (Chapter 4+)
Wooden Boards (Chapter 5+)
Fire (Chapter 6+)
Rainy Window (Chapter 6+)
Example Scene - Simplified
Visualization (Chapter 1-4): Value Graph
Visualization (Chapter 2-5): Space Origami
Example Shader (Chapter 3-1): Rock
Example Shader (Chapter 4-1): Dilapidated Cube Scene
Example Shader (Chapter 4-3): Image Texture De-Tiling
Example Shader (Chapter 4-3): Semi-Procedural Fishbones Boards
Example Shader (Chapter 4-4): Procedural Volumetric Clouds
You can join Blender Studio for €11.50/month and get access to all of our training & film content
21st August 2020
Get the example file including the different shader variations here: floor_boards-example.blend
Join to comment publicly.
5th May 2021 - 16:12
That is being such a journey for me... spent 3 to 4 days only on this class trying to digest, apply and comprehend all the concepts here worked. Hardest part for me is mixing the height maps on the right order and positioning them correctly. Map Range Node is good but also difficult to grasp. Thank you Simon for sharing this deep knowledge with us!
24th August 2020 - 04:45
Thanks for updating and sharing!
This series helps me a lot with the understanding of not only the shader system in Blender but all the other shader principles covered in the remain 3D software such as UE, MAYA, Unity, 3DS, etc.
29th August 2020 - 04:42
"the first thing again is... i'm just deleting the material" almost gave me a heart attack :v
30th August 2020 - 13:56
For some reason at (30:25) the hide value option is missing in my node interface. Thank you for making this series, I've really struggled with understanding the node trees and this has helped a ton!
31st August 2020 - 10:49
*@Jonathan DelleCave* Thank you for pointing this out! This is a feature that is new in Blender 2.90. I did not realize this at the time of recording, but luckily Blender 2.90 is going to be released later today.
I'm glad the course is helping you!
4th September 2020 - 05:48
I found it's easier to use bump for the bolts and the variation. this tutorial cover a lot of thing, thanks again!
27th September 2020 - 16:36
Oof. This is quite complicated. I have a question though. How did you learn all that? I mean you are teaching us. But someone must've taught you in some way. Or are you reading the Blender Docs. I'm just curious on how you were able to get all this knowledge.
28th September 2020 - 10:35
*@Kevin Tatar* I mostly figured things out on my own. A lot of this comes from math education and then trying to apply it to creating patterns.
I like to figure things out myself but also when I started doing this sort of things with shader nodes the resources were really sparse. Now there is more, but as far as I know there still is no other comprehensive course for it. That's why I am making this series.
29th August 2020 - 05:24
Hello, my UV doesn't look like yours. I use the deafult cube and only scale the Z.
edit: oh it should be a plane
31st August 2020 - 10:31
*@Huân Lê-Vương* Yes, I'm using a plane, but you can also use a cube and align the UVs accordingly
31st August 2020 - 07:15
Hello, how can I see the subdivision overlay at 33:51?
31st August 2020 - 10:33
*@Huân Lê-Vương* There I simply went into edit mode. If you want to be able to see the wireframe in object mode you can also activate it as a viewport overlay.
1st September 2020 - 05:48
*@Simon Thommes* thanks.
6th September 2020 - 16:43
So I'm still playing around with this shader. Maybe off topic but at 8:49 is it possible to Snap the value to a step of 1 then 2 then 3 then 4... procedurally?
The math is "n(n+1)/2=1+2+3+...+n" but can't find a way to do that.
7th September 2020 - 03:02
Edit: what I mean is: https://photos.app.goo.gl/z93isVnLYBBMmwyT9
7th September 2020 - 11:44
*@Huân Lê-Vương* Interesting question! The problem with the math is, that you first have to define, where the coordinates are split into cells.
To be able to do that, you have to invert the equation: https://math.stackexchange.com/questions/2041988/how-to-get-inverse-of-formula-for-sum-of-integers-from-1-to-n/2041994
Then you can apply this operation to the coordinate and snap with an increment of 1: https://cloud.blender.org/p/procedural-shading/5f56001df17d08c945d84c71
8th September 2020 - 11:29
*@Simon Thommes* Thanks! I have to admit that I've been addicted to procedural shader and math stuffs since I watched your tutorials!
8th September 2020 - 15:52
*@Huân Lê-Vương* Awesome to hear!
9th September 2020 - 13:25
*@Simon Thommes* So I tried to create a cell system based on the math (1x2x3 / 2x3x4).
As we use a square root operation, the value is shifting a bit when I try to create a heigth map for the woods.
Is there anyway to "compensate" that?
9th September 2020 - 13:35
This is the X value of the vector before fraction operation:
x: the separated x from the generated coordinate.
I tried to "inverse" that.
9th September 2020 - 14:32
*@Huân Lê-Vương* You have to build your new coordinate value in a way that it is linear in each segment. For example by using the initial coordinate and shifting and scaling it for each cell accordingly:
9th September 2020 - 14:36
*@Simon Thommes* Thanks for you reply. I can't reach the link though.
9th September 2020 - 14:39
*@Huân Lê-Vương* I fixed the link, it should work now
3rd October 2020 - 19:36
I was trying to do the first part on my own, and I came up with this method to divide the floor into squares, is there a problem with doing it this way?
It's basically just the same method yes? though not quite as compact
5th October 2020 - 13:00
*@kroneborge* Awesome! That is totally valid. It is essentially the same method. I was doing it this way as well when we had very limited functionality on the vector math node.
I would recommend to still get used to the way of using vector math nodes though. Having a more compact node setup makes you node-tree much more readable and also flexible for quick changes.
13th October 2020 - 12:39
Hi Simon, this is a bit weird
It looks fine when i use material preview, but as soon as i switch to cycles this happens
Can you tell me what do i need to fix? Thank you
13th October 2020 - 18:33
*@victor p* As far as I can tell this might unfortunately be a restriction due to the complexity of the material. Can you tell me what graphics card you are using for rendering? And do you have the same issue when trying to render the resulting shader from this video that is linked in the description? I recorded the video using a GTX 1080.
14th October 2020 - 06:29
*@Simon Thommes* the floorboard example you attach on the description works fine in my computer
i also using gtx 1080. Any idea why? Here is the blendfile if you have time to take a look at it
14th October 2020 - 12:38
*@Simon Thommes* I found the problem, its in the uv map node, if i uncheck the "from instancer" then the brick pattern appear.
14th October 2020 - 14:36
*@victor p* Ah, interesting. Good to hear you figured it out!
14th October 2020 - 15:10
*@Simon Thommes* Thank you
19th October 2020 - 19:18
I tried this shader on my own , I have a qusetion. I want to edge emphasize so i made geometry pointiness and map range node(from min:0.5, from max: 0.6) what you use in example2.
but It see just black (i see in cycle) so i think displaced object can't apply pointiness. Is it correct?
20th October 2020 - 13:02
*@Aron* Correct, the calculation of the pointiness is done before the displacement and thus it does not affect it unfortunately. For emphasizing edges in the shader you would have to create a map of the edges as another pass youself.
22nd November 2020 - 04:56
Hi Simon, would it be possible for you to create a workflow example video covering the stone walls? I looked at the example file and the shader you created for the stone part of the walls is a bit overwhelming for me. I'd really appreciate it if you could explain it. Thanks!
4th January 2021 - 11:06
@tredeau It is not planned to add more workflow examples for this scene. If you take a closer look, you can see that the nodetree for the stone walls is very similar to the wooden floor boards, that I explain in this video.
In fact the only thing that is really different is the rock texture itself. The main part of the shader is the tile pattern, that is the same as what I explain in here.
20th October 2021 - 17:48
There's a point I'm still confused about and maybe you can enlighten me. I fail to understand, around 41min45 and onwards, how adding 1 prevents values from going below zero. When you say the values are "centered around 0" does this also imply they're necessarily locked between -1 and +1 (in which case I get how adding 1 centers them around 1), but if that's so I must have missed a decisive information because I don't get why they're locked between -1 and +1. Sorry for the probably very basic question.
24th October 2021 - 12:37
@L-L The 'never below 0' was a bit of a slip on my part. If the negative values are scaled up enough, adding 1 will obviously not make them positive. The main takeaway to focus on here though is not to necessarily make all values positive, but to center them around one after the multiplication. That way, multiplying with 0 will make this tilt operation have also 0 impact on the height map.
24th October 2021 - 18:16
@Simon Thommes Few I'm actually releaved because I've looked for all the possible ways that adding 1 would prevent having negative values and it took me quite a while and I still couldn't figure it out it was driving me crazy ! I totally get how centering around 1 is useful afterward, thanks for taking the time to answer.
27th January 2022 - 21:42
When a shader grows to this size, does the rendering time take a big enough hit that you would get better response by using a texture or, using a texture and baking? In Eevee or Cycles. Thanks
28th January 2022 - 12:41
@Wayne Batchelor Yea, that's a tricky question. It really depends on what you are optimizing for, your specific requirements in terms of resolution and quality, the configuration hardware you are working with.
Generally: Node-based shaders are heavier on the rendertime (CPU/GPU) and baked textures are heavier on the memory usage.
But, of course, both methods have dis-/advantages apart from that.
There is no 'fits all' solution for this.
5th September 2022 - 16:03
Something weird is happening to me...I reache dthe point where I created the high map for the boards, in the shader preview, that works like eevee if I got it correctly, look fine...but in cycles looks completely different
2nd October 2022 - 18:13
(NOTE: I'm using 3.3) When performing the Round-to-Modulo operation at about the 11-minute mark, I was experimenting with different values and, for a reason I cannot figure out, it does not work with 7 (or, it seems, any multiples of 7, or any number that rounds to a multiple of 7). Giving a value of 7 results in 8 rows being shaded with the values 0, 1, 2, 3, 4, 5, 6, 7 and then looping down to 1, 2, 3, 4, 5, 6, 7, and then again restarting at 1. It seems to me it shouldn't reach a value of 7 at all and should loop back to 0, not 1.
2nd October 2022 - 18:28
@Geoffrey T. Blackwell As I experiment with this more, it makes less and less sense. When the "Width" value is sufficiently small for there to be dozens of rows, the looping pattern eventually breaks down with EVERY value I've tried (except zero, which does return a completely black surface).
3rd October 2022 - 10:55
@Geoffrey T. Blackwell Hm, for me this is working totally fine. The behaviour you're discribing sound a lot like a floating point precission issue to me though. When I set the snapping value to not exactly 1, but 0.9999 instead, I end up with the same result.
Try using the Floor operation instead or try setting the snapping value to slightly above 1, like 1.0001