[Idea Disscussion] Material System

Hi, Im not sure if this is the correct Place to post this, let me know if this is not

I want to discuss on an idea call Material Instance (or whatever it is), and would like to know how others think about this

So in my Opinion, Blender Material System is nice, but it could be improved in my opinion,

Problems

Here are the problem I want to address

Messy Catagorization / Long Material Name as Identifier

  • All Materials Are Lumped together in One Giant List, there is no way to categorize them, which turn it into a Gigantic Mess of list.
  • The only way to Categorize or Identify the Material is by using Long Descriptive Name, and use search function to find them.

Duplicated Similar Material

  • To make variation of similar material, the only way to do it is to Duplicate them, which will make it really hard to manage, in terms of tweaking the material, and it makes the material list even bigger

Possible Solution Idea

There are many possible ways to solve this problem,
A way that I personally think can solve this problem is the idea of Material Instance (or whatever you call it)


There is Two Intended Problem to solve with this Idea

  • To Scope the Material so You don’t need to face the Gigantic Material List Everytime and Memorize the name for the specific Material for this object
  • To Reduce Material Duplication

Material System Proposal

Currently, The Materials in Blender is like a “Global Variable” in coding, where everything is available everywhere, To Solve this problem, the Idea is to Scope them and put into Groups

Master Material

This is just the regular material You know and love. It have Node Tree and you can do Your Node Magic in here. However, theres one addition to this, Which is making “Group Input” Work on Material Space

This is basicly Similar to Geometry Node, You make your node tree, and Choose what Property you want to Expose, using the “Group Input Node”.

Material Instance

Material Instance will be Store in Master Material (Or other places whichever works) in a List Form

The Material Instance will be the Same As Master Material, Except the Parameter that is Expose from Group Input Node will be inside of Material Instance

This way, You can do something like this

Master Material 01: Principled Shader Material
   -Instance 01: Red Shiny Material
   -Instance 02: Blue Rough Material

Master Material 02: Fancy NPR Material
   -Instance 01: Fancy NPR Style 1
   -Instance 02: Fancy NPR Style 2

Differences

What are the differences between Master Material?
So Master Material is the Material with the Node Tree, you add a Group Input to it

Material Instance is a Variation of the Master Material that have it’s own Setting (determined by Group Info)

Setting Materials

When Selecting Material, First You Select the Master Material, and then You select the Material Instance

This will Drastically Reduce the amount of Duplicated Material making things more organized, and easier to work with material variation

Think “Select a Material” and then “Select the Material Variation / Instance”

When you want to have a fundalmental change, All you need is to edit the master material, and the
instances will inherit them

Mockup

Properties Panel UI

It would be great if you can show the Group Input inside here, so the maker of material can decide which parameter to expose, (Similar to Geometry Nodes)

Perhaps a Tabs to Switch between the Old UI and the Exposed Input Group UI

Extras

This is probably Nice but I don’t think is important, which is the ability to Overwrite the “Group Input Property” on object level, a On/Off button next the the parameter would be nice. However I think this is more of a Nice to Have

How do you guys think? Agree? Disagree? More Idea to Throw in?
Would It work? Would it Create more problem than it solves?

Now, there is an asset browser allowing to categorize them.
Instead of your master material, you can create a catalog and give it same name that the one mentioned for master material. And this catalog will only contain variations you assign to it.

In 3.1 alpha, you can mark shader nodegroups as assets.

Currently, library overrides are supported for custom properties used by a material.
Overrideable setting can not be defined on the fly. The material has to be created to handle override for this specific setting.

1 Like

I think that managing materials would be a lot easier if you could edit/ create materials without them being assigned to objects. That way, you can make global material changes much more easily. Also, if materials could be categorised, the list could contain dropdowns for each of the categories (or just display the materials within one category). So I agree with you that this would be welcome.

But I also think that Blender should be able to remember material overrides. Meaning, if you import a FBX/ OBJ file with Material A, and assign Material B instead of A in Blender, the next time you import a file, Blender should automatically replace Material A instances with Material B. So you wouldn’t have to do this manually for design iterations. This single feature is what made render software such as Keyshot and Lumion popular, because, you will only have to manage materials in your source software (Architecture software, Mechanical engeneering software, Automotive software, etc.) and it is simply a matter of exporting and importing and you’ll have the next iteration ready.

1 Like

Now, there is an asset browser allowing to categorize them.
Instead of your master material, you can create a catalog and give it same name that the one mentioned for master material. And this catalog will only contain variations you assign to it.

Asset Browser’s Catagorizing is not the same as material catagorizing though, it is only catagorized inside the Asset browser. If I want to use Material that is not an asset and is a Internal Material

The one in Asset Manager is more like a list of “To be Import Material” instead of “Already Imported Material”.

In 3.1 alpha, you can mark shader nodegroups as assets.

Shader NodeGroups As Asset sounds like a good news

Currently, library overrides are supported for custom properties used by a material.
Overrideable setting can not be defined on the fly. The material has to be created to handle override for this specific setting.

Ahh

I think that managing materials would be a lot easier if you could edit/ create materials without them being assigned to objects.

Yeah, I agree. Perhaps, the way to do this is the change from editing active object’s material to just pick a material. and then add a checkbox “Use Active Object” to use the old behaviour

materials could be categorised, the list could contain dropdowns for each of the categories (or just display the materials within one category).

The idea of Material Instance I Suggested is not exactly a categorization, But it’s side effect made it sort of a type of catagorization,

Using the Material instance Idea
instead of

- Material Principled Red
- Material Principled Blue
- Material Principled Green
- Material Emission Yellow
- Material Emission Cyan

it will become like this

- Material Principled
     - Red
     - Blue
     - Green

- Material Emission
     - Yellow
     - Cyan

This will prevent super long name, and material duplication
(Alot of time you want to use same node group but slightly different settings, same material, different color for example)

But I also think that Blender should be able to remember material overrides. Meaning, if you import a FBX/ OBJ file with Material A, and assign Material B instead of A in Blender, the next time you import a file, Blender should automatically replace Material A instances with Material B. So you wouldn’t have to do this manually for design iterations.

I do not do much Importing, but that does sounds like a needed feature

In 3ds Max, it’s like this:

In Revit (also Autodesk), it’s like this:

So there either is a way to group materials based on the nodes used (Material Principled/ Material Emission) or based on custom properties or material types (Brick, metal, etc.).

But, how do you imagine this to work with a pop-up menu?
This is Hard Ops material list:

Would the items be categorised by header? Or would there be a fly-out (→) per category?

So there either is a way to group materials based on the nodes used (Material Principled/ Material Emission) or based on custom properties or material types (Brick, metal, etc.).

Master Material would hold the Node Tree

And instance will be the same, but only make Group Input Editable
Think making Multiple Geometry Node, but you can use different setting for each of it on the same node group/tree

I imagine master material → material instances (or call it variation if that make more sense)

By default, asset library displayed is current file.
So, you can use asset browser to manage data internal to file like to manage linked, appended data.

But, yes. Small ID datablock list of materials is not showing asset browser’s catalog or its search does not take into account assets tags.

1 Like

It would be great to see these changes.

I rely so much on parametrization of my geometry nodes trees that it becomes quite crippling when I’m unable to do this with shaders.

I like the “everything is a nodegroup” principle of geometry nodes. It’s so flexible.

1 Like

I agree

Materials / Shader could take note from Geometry Node

Hello, if these changes would come into effect, it would be very good that there would be something good at last for something that I have been waiting for a long time

I wonder what is the best way to let the Developer know this idea or at least check this out, Hmmm

At least it would be nice to get opportunity to discuss with the developer on this to know if this fits their vision on blender

Another issue is that not all properties of shader nodes can be exposed to nodegroups.

To fix this, all socketless properties should be given a socket. (Preferably of a different shape and wire to differentiate between textures and single values. )

You can post suggestions on rightclickselect or the Blender devs forums.

Be warned: Any mention or image posting referencing other softwares will make the idea being rejected at first sight. Also, i recommend changing your idea to be different to how the rest of the software works. (Because of lawyers.)

I did post this on rightclickselect but generally it gets no response

Even if the idea is not fit, id at least hope for a disscussion (thats why I posted here)

Please don’t mention other software. AFAIK lawyers already were involved some time ago, and that prompted BF to remove all references to other software in their dev forums. Also for anybody thinking in suggest ideas from other software, please read this: https://devtalk.blender.org/t/copyright-guidelines-for-devtalk/17331

ok I removed the mentioned on other software

This is the link to right click select
maybe if you interested you can upvote it or something, maybe that will get some attention

And BTW, nice ideas, and nice mockup. I don’t know what the UI guys would say, but maybe you can reach devs on devtalk, or even blender.chat.

Finally, there’s always matlib vx (https://docs.blender.org/manual/en/latest/addons/materials/material_library.html) but a built-in solution would be better in the long run.

(And upvoted on RCS!)

1 Like

Upvoted!

FYI My idea for remembering/ automatic material overrides is here: https://blender.community/c/rightclickselect/z6OY/?sorting=hot&page=1

Your request seems to be similar to Unreal engine’s material instancing and actually, Revit does the same thing, it uses material assets (source/ parent materials) which you bring in as a base material that you can edit. It also exposes the parameters of the parent materials, so a glass parent material has different parameters than a brick material, for instance, because they use different shaders in Revit.

These parent materials are not saved to the current file, instead, they reside in a library for reuse. So just to be clear @BlenderBoi2018 what you are after is that you could link these “parent materials” across different materials in the scene, correct? And you also want to be able to update the parent material and have its changes propagate over to the “children”?

So when thinking this through, I also imagine the parent material to be some sort of node group, perhaps with different colour scheme, wherein any adjustments of the original become highlighted to reflect the changes.

Or, the way I skim through the UE4 documentation, it looks like you have a separate node for inputs that you use for the children. So basically, you connect a child parameter node to the parent/ master material and any connection would duplicate the parameter of the parent over to the child (so the value box for Roughness appears in the child node when connected to the Roughness input for the parent material) and it would grey out the value for the parent. So by making connections with this child node, it would eventually populate the panel with all required inputs.

Furthermore, I imagine any additional nodes added to the node tree to show with a different outline colour to reflect that it is part of the child or of the parent set of nodes.

Not exactly sure what you mean but it is not really that

For My Idea, the material is in the current file, but you create “variation” of that material
Is more similar to node group or geometry node, but on the material level
However, I propose to store the instance in the master itself, this way it is organized

So think Master Material like a Machine, Group Input will be the buttons, perhaps it could be a different node call “material input” or whatever fits

when you make an instance, the everything inside stays the same, the only different is each instance button state can be different

1 Like