♪♪♪ Zak Parrish: Greetings and welcome back. In this video, we are going to take a look at material instancing, which is a very powerful and useful feature when working with materials in UE4. First, what is material instancing? Instancing is where you take a single parent material and you make copies of it that have variations. Here is the copy, which would be referred to as a child or an instance. You can call it either one. Here is another one. Here is another child. Why is this useful? It is useful for a lot of reasons. For instance, let's say your parent material is the perfect basic metal. Your children that you create from that material will start off with all of the features that made this a perfect metal. Then, you can turn them into specific variations such as copper, or aluminum, or aluminium if you are from that part of the world. Essentially, what you are doing is starting off with the exact same properties and you are making changes to them. These properties are going to be referred to as parameters. A parameter is just a value that can change once you instance off a material. Let's go ahead and take a look inside of UE4. I will admit I was going to make an instance out of this material we were creating in the previous videos, but it is complex enough I feel I would just scare people. We won't actually do that. We are going to make something much simpler. For starters, let's begin in the Content Browser. Notice I am in the Materials folder. Right-click and select Material to create a new material. I am going to call this, "Parent". You might want to call yours something a bit more descriptive; maybe put your name on it. We will call it Parent. Let's start off by defining Parent. The first thing you are always going to do is create a parent material just like any other regular material. However, what makes this different from the materials we have made before is that we are going to parameters instead of regular constant values. For example, one of the first things I showed you how to do when creating a material is to create a 3 vector. I held down the 3 key and left-clicked. We can double-click on its color swatch and assign any color we like. Plug that into Base Color. That is fine; this would work. The problem is that this is a constant value and can never change. Once this Material is compiled, that is it. I want to make a quick note about compiling as well. I will jump back to my chalkboard. One of the more important things about instancing is when it comes to compiling, only your parent material is actually compiled. Essentially, the children are free. They don't actually cost anything in terms of compiling. It does speed things up a bit in terms of performance. Let's jump back over to UE4. We are not going to use a constant value this time. Instead, we are going to create a vector parameter. Right-click, type and select, "Vector Parameter". The first thing you will notice when you create a vector parameter is it wants you to give it a name. That is what we are going to do. We are going to call this, "Base Color". We will plug the output right into Base Color. Let's give it a default value. Double-click inside Base Color. We will make this a very pale gray for starters. It essentially looks white when you look at it. The difference between these nodes is when we instance this off, we will have access to this Base Color node and we can make changes. I want to get just a little bit fancy straight away because I think it will help you understand more of how things work in terms of material instancing. We are going to bring in a texture. I am going to go back to the Content Browser and click on the Textures folder. Let's grab something that is kind of metal-like. We have T_Base_Metal_D and T_Base_Metal_N. Let's grab both of these. Select both of the base metal textures. I can select them both by holding CTRL and clicking on the second one. I can drag them together into my Material and you will see they both appear. This is how I was adding textures before. Technically, this works but the problem is these are not parameters. These would be constant and they would always remain the same for our object. It is not entirely useful. I am going to delete both Texture Samples. I wanted to show you there is a difference to adding those textures in. With T_Base_Metal_D selected in the Content Browser, right-click in the Material Editor and type, "Parameter". Here is our list of parameters. You will see TextureSampleParameter2D. Click on that. This is asking for a name. You will see the base name it gives is really long and not particularly useful. Let's call this "Base Color Texture". I would like to rename this Base Color node because we are calling this Base Color Texture. I can rename it in the Details panel by clicking on the Parameter Name property. We are going to call this "Base Color Tint". We have Base Color Tint and Base Color Texture. All we are going to do is multiply them together. Drag a wire off of Base Color Tint and type, "Multiply". Press Enter. Drag a wire off of Base Color Texture and plug it into B of the Multiply. Plug the result of the Multiply into Base Color. Already, we have a much more interesting material than we had a moment ago. Now, we want the ability to control Metallic as well. Drag a wire off of Metallic and type, "ScalarParameter". You can just type "Scalar" and press Enter. We will call this "Metallic". I want to show how this value is different. Normally I would call it Metallic, just to point that out, but I am going to call it "Metallic Z" just to show you that it is different than the actual Metallic value. We will call it Metallic Z, which is probably a really terrible cover band. If that really is a cover band, I am just kidding. I have never heard of that cover band, just to make sure everybody understands that. Let's use Roughness as well. Drag a wire off Roughness, type and select, "ScalarParameter". Let's call this "MyRoughness". We know it is a custom value. Call this "Custom Roughness". That is better. That is cleaner and makes more sense. Let's use "Custom Metallic" as well. That is all much more concise. Now, we need to bring in our Normal map. In the Content Browser, click on T_BaseMetal_N. Right-click in the Material Graph, type "Parameter" and select TextureSampleParameter2D. We will call this "Normal Texture". We will plug the Normal Texutre into Normal on the Parent node. We have all of these parameters plugged into our surface. That is working well. Is there anything else I want to do? I think this is probably enough for getting people warmed up. Let's go ahead and click Apply. Click Save. Then, we can close the Material Editor entirely. Let's go back to the Materials folder in the Content Browser. At the very bottom, we will see Parent. I am not going to apply Parent to the surface. Instead, I am going to right-click on Parent and select Create Material Instance. The instance was created down at the bottom. You will notice it is called Parent_Instance. Let's right-click and select Rename. For our purposes, we will call this "Instance _1". That will appear at the very top because of alphabetical order. Select the object in the viewport and drag Instance_1 onto Element 0 to apply this to our surface. Here is what we get by default. Let me point something out. Notice the thumbnails between a regular material and a material instance. You will see the material instance has a slightly darker green border. That is just something to point out. If I double-click on this material instance, I get the Material Instance Editor. This is a bit different than the actual Material Editor. You have a toolbar, you have a Details panel, you have some Instance Parents to show you who your parent material is, and then you have a great big preview. The important thing to show off here is in the Parameter Groups, you will see all of those parameters you have created. Here are our Texture Parameter Values. Here are our Scalar Parameter Values, or our single numbers. Then, here are our Vector Parameter Values. Now, let's go ahead and make a few edits. I will leave the preview nice and big for now. Let's start off by saying we want to change the Base Color Tint. All we need to do is check the checkbox next to the property. This basically says we would like to override this with our own color. Click and start sliding around to choose a different color. We get instantaneous feedback. I will pull Alpha up. It won't make any changes as far as we are concerned; I just feel better about it being up. You see the feedback is very fast. We can click OK. If I slide the Material Instance Editor off to the side, watch this. Watch in the viewport as I change values. We get instant feedback in the viewport as well. This is a very handy way to work. In fact, it is so handy that our artists will quickly put together their materials with some parameters in place. Then, they will make an instance of that material and use the instance to tweak values in a scene. This allows you to get something perfected very quickly with this real-time feedback. We will choose this pale shade of blue. Go over to the Scalar Parameter Values in the Details panel. Let me slide this bar over. Select Custom Metallic and slide it up towards 1.0. You can see the surface now looks very metallic. We can tweak the Custom Roughness value as well. Now we start to get a very metal-like surface. Let's go ahead and set Metallic all the way to 1.0 so it is a true metal. We can also replace textures as well. Go down to the Textures folder. Let's say we want to turn this into a brick surface. You will notice I made those Texture Parameter Values. We can check Base Color Texture and Normal Texture. Checking those boxes means we want to be able to override what is already there. Drag T_Bricks_D onto the Base Color Texture. Drag the T_Bricks_N on top of the Normal Texture. We are already done. Now we have brick. It probably makes more sense now to change the color. The nice thing is that we can start making multiple copies of this material. Go back to the Materials folder. Scroll up to our Instance_1. Right-click Instance_1 and choose Create Copy. We will call this "Instance_2". In the viewport, I am going to hold down Alt and right-click to drag and push back a little bit. Slide the object to the side. Hold down Alt, and drag out a second copy. I am going to move the Material Instance Editor out of the way. Select the second copy, apply Instance_2 to Element 0. I just want to show this to you. If I double-click on Instance_2, notice we have two (2) panels now. Here is Instance_1 and Instance_2. They can both be entirely different things. Again, I am using my screen space as best as I can. This is one more reason why it is nice to have two (2) monitors if you can manage. Let's take Instance_2 and expand its Texture Parameters. Let's use some different textures. Instead of brick, let's say we want this one to actually look like copper. Drag T_Metal_Copper onto the Base Color Texture. Drag T_Metal_Copper_N onto the Normal map. Leave Base Color Texture unchecked. Suddenly, this looks just like copper. Let's go back to Instance_1. Select the Base Color Tint. We are going to pull the actual color value down really low so it is just using a little bit of that color. Then, we will uncheck the Metallic value. We won't override the Metallic value anymore. Now it is just a non-metal. Select the Custom Roughness and make that pretty high, about 8. Now as you can see, we have two (2) very different materials but they both come from the same parent. Only that parent material would actually be compiled if this were a game. Both of these very different materials would essentially be free. There is only one more thing I want to show off. Right now you will notice our Parameter Groups are just called Texture Parameter Values and Scalar Parameter Values. They are not particularly useful. The last thing I would like to do is go into the Materials folder and open up Parent one more time. I want to show you on each one of these parameters, you have a Group you can edit as well. Select Base Color Tint and set its Group Value. We are going to type a value and call this "Color Adjustment". Then for Custom Metallic, let's call this "Surface Definition". To drive home this is a physically-based system, let's call this "Physical Surface". This is where we define the physical surface. I can click on Roughness, and you will notice this is also a drop down menu. I can reassign any of the groups I have typed in here very quickly. Let's set this to Physical Surface. Select the Base Color Texture, and call this Group "Texture Overrides". Select the Texture Normal map and assign this to Texture Overrides as well. Click Apply. Click Save. If I go back into the Material Instance Editor, take a look at my new Parameter Groups. We have Color Adjustment, which has my Base Color Tint. We have Physical Surface, which has Metallic and Roughness. We have Texture Overrides, where you can see my Base Color Texture and my Normal Texture. It is a really nice way to keep things organized. That is a look at creating material instances and controlling them in UE4. That is going to wrap things up for this video. Thanks a lot.
♪♪♪ ♪♪♪