Workflow Q - Different Color/ Texture variations

What is your workflow on projects where Clients want to test different color / shader variation.
For example you have a room with different views and the client want to have variations of the fabric used on furniture, the wood on the floor, the metal of decoration elements etc.
So basically lets say your table has now Wood1 applied but you want it to switch to Wood2 or Metal etc.
As in such projects you often have to go back and forth, splitting the scene is not an option. Same objects.
What I look for is more like an overwrite for shaders. Like the Take/Pass system in other software.

Sometimes I’ll keyframe in the variations in the shader (rgb values for pure color, or mix factors for textures), then render out a mini animation with those variations. When/if the client makes up their mind, then you can remove the keyframes.

1 Like

Guess you could use #frame and math/compare to select between different material setups within the same shader. Some of my assets have different material options built into them, i.e. black with white accents, white with black accent, brown leather, being fabric and so on. The same method could be use to drive selection of different color scheme outputs; i.e. you have a selection of 4 colors that work well together, then drive what color is outputted for use further down the node chain.

3 Likes

More or less a switch shader based on a global attribute. Well, that can break eevee, as it can only display two mixed shaders.
Yeah thats sad, Blenders pass system, view layers, is just about viewing and include shaders.
I do not really get how to animate the shader switch, I do not see any value that could be keyed.

I don’t use Eevee, but isn’t it in that case only Shader blending that is broken? I can’t see a reason why full 0/1 values aren’t adhered to. Animate a shader mix if you don’t want to do it all prior to the shader (can get complex) and set its interpolation to constant. You could group several shader mixes (selectors) inside a group and have several shader inputs into that group. Then add the group to world shader for easy access without hunting for objects and global control of it. Duplicate it if you need sofas to have different controls than chairs i.e. Doesn’t seem impossible to get around.

Yeah, I’m still testing. Found that ShotManger add on has a rule system to overwrite individual shaders per shot. Not a bad thing, just had an error on 3.2 hope on an update.

I tested a global attribute under scene, to do a switch for 0-1 value. It didn’t work. If I use an object based attribute it does work. It seems Blender wants me to have the attribute always under the object, even if I try the full path it doesn’t want to. Need to google for global attributes.

Beside this 0-1 is just on off. But I have some switch nodes, where I have a longer range of values. Again, this works well on objects, just not on the scene.

Ok solved it. partly using shot managers rules system for materials and its view layers support, which all work very smooth, you need it just to switch between the variations, not even choose different cameras or view layers. Also very fast.

The second thing I use is the material overwrite on objects. You can have two materials for every slot of your object and switch between them. On data level it derives it from the mesh and on object it pulls it object based. Very useful.

Do you need to switch the materials per object or globally on all objects that use the shader in question?

I had both cases. Normally I do that with colorboard, a group node with all colors and just switch the colors or even textures inside there, linked to all shaders. But in this project, to much had to change and I wanted am easy single switch.

It’s not easy to handle all that at least in blender…

You can alt-D some objects and apply materials on object level rather than mesh data level.

For color variation you may access object color inside shaders, same trick with alt-D so you keep different versions.

If variations are because the client didn’t make up his mind I try to organize these in different step so I don’t end up with many variations each time.

If it’s part of the project specifics that you’ll need some variations of the same stuff, I’d probably try to automate stuff. You can change colors by exporting pass in compositing .
Or you can parent some object to an empty and move the empty each frame, so each frame show a instance of objects with different materials.

I didn’t do much of projects like these but from experience they always end up being a bit messy, a strong entropy affect these projects, no matter what clever solution you end up with , it’s always messy.

I don’t know how other software handle these, probably render engines like guerilla or tools like katana or gaffer can handle these changes in a more simple fashion, but I’m not sure it’s worth the added complexity for one man army projects.

1 Like

Well, thats where the passes or takes system come into action, or layers. Blender is different in these aspects. It has ignored many classic ways doing this.
For example in another software I would overwrite materials with a top material, or would animate the materials colors based on global inputs. Blender is very limited on what you can animate and it doesn’t allow global attributes in shaders. At least not as user.
Also blender layer system is quite different and split into collection and view layers. A true pass system, where you can animate the state of nearly every property does not exist at all.

For example, you can’t animate visibility of objects, materials alpha, etc. You can’t do a multi selection and change all the properties at once in all cases. Like keying visibility of all objects in a hierarchy. But you have to do that via collection, but then they all need to be in that specific collection. And Blender doesn‘t even support inheriting properties by parent child hierarchy. So animate the visibility of an empty, won‘t affect children items.

Hence things get messy mainly because you do not have on place to control it all.

For example in C4D, you open the takes sections and see all the properties channel you changed per take, you can even layer takes etc. This done using an animation system above the standard system, but then other software the Blender allows a lot more to be animated. I actually can’t remember anything being not animated able in Modo,C4D or 3dsmax.

You can use custom properties as global attributes and use those as drivers for shaders, if you don’t want to do any scripting, or you can very simply set global attributes from a script

Yes. but you can’t easily do that in an existing scene with hundreds of items… well at least I haven’t found a way to copy all driven attributes to selected objects, have to check if that works. Anyway, I wish that worked simpler. I have the same issue in my riggs. Blender needs a better integration of attributes driven by HUD elememts.

1 Like

It seems you have found a solution but I will list a couple of things which might or might not work for you that do not require addons.

So for simple changing materials globally:
You can use a linked file containing your materials. By renaming your materials in your material file you can switch the materials in your scene file.

  • Make a separate file and place all your materials into this materials.blend file
  • Make master.blend file which contains your scene.
  • link all your materials form the material.blend into your master file and put them on to your objects.
  • Let’s say your objects have wood_1 but your client wants to see a version with wood_2
  • The only thing you have to do is rename wood_2 to wood_1, save your materials.blend and reload your master.blend

You can create variation sets:
You can make variation sets by using several linked material files. The materials in your material files need the same names. Then you simply switch the linked material file

  • create a materials_1.blend
  • lets say it contains the materials wood_1, metal_1 and wall_3
  • duplicate materials_1.blend and call it materials_2.blend
  • change wood_1, metal_1 and wall_3 to different version but do not change the name
  • Now in your master file where you currently have materials_1 linked, go to outliner → blender file and use “relocate” to switch materials_1.blend to meterials_2.blend
  • all your materials are now replaced with the versions from the other file

Obviously you can combine the two methods mentioned above.
This is useful for creating variants to check with the customer. The disadvantage is that it won’t work if you need it to be animatable.

If you need a method to switch materials per object and need to animate it it is trivial to set this up in geometry nodes. A set Materials Node combined with a series of swtiches will allow that.

If you need an animatable method to swich all objects globally and perhaps override individual ones you can do that easily with geo nodes as well Here is an image explaining the setup and a file attached with the geonodes:
MASTER.blend (1.1 MB)

1 Like

Hey that threat gets more and more to a resource of ideas. Thats fantastic.

I used the method of replacing the linked data before. Not with Blender, but whit a references scene file. Its a good trick. And I think Blender has some really nice features to make that even easier to use. Remember I had to reload the scene to make it work, Blender is so much faster and better on linked content.

The down point is, that you need to update things in the reference scene and you can’t do quick changes. I’m not sure, but maybe you can export things to a library too… read something about that.

The geometry trick is something I already use. However I prefer if Blender would get a full instance object, that is a complete clone of the original. As material switching doesn’t work well on instances. Gets really complicate to do that in a scene.

Anyway, my trick in Modo. Simple pack the object to a layer then use the layer as shader mask, and overwrite properties there. Oh how I miss that ease of workflow.

Yes, the layer as shader mask in Modo sound great.

I am not aware of a method to do this kind of thing without file hopping or geo nodes. There is an addon to ease the pain of file hopping - Edit Linked Library - which comes with Blender by default but it still is what it is.

As for changing materials on instance collections: Not sure if this is widely known but it is possible to use an attribute node in the shader set to “from instancer” and then call a custom property in the instance collection to control aspects of the shader.

Now, just to dump some more information on this topic which might be interesting for some people reading this, Johnny Matthews has a nice video on utilizing linked libraries in combination with the asset browser and library overrides: