4
$\begingroup$

I want to create a driver for a Mix Shader in a Material that is applied to several objects, that is based on a shape key value for the particular mesh.

An example, I have several cylinders that can overheat when compressed, so the value for the shape key "canon fire" would be reference by the driver in Material "Aluminum.Tube": enter image description here

Because the Material is used by several (common) meshes that are each animated "single use", I cannot use a specific object's shape key reference like below as answered here:

enter image description here

Although I see some "Shape Key from Object" that may hint at a solution, although I don't find this node documented.

self.{$current_object}.to_mesh().shape_keys.key_blocks['cannon fire'].value

Is there some way to specify shape key "canon fire" from current object?

The workaround -- if I have several duplicate-linked objects -- is to make a single-user copy of the Material, and edit each to the animation key block for that object.


As @Nathan says, there is no way to reference some current object from material Shader node drivers.

If I have duplicate-linked objects, I'll need to make a Single User copy of the material for those objects and then change the animated Key-set reference name for each.

Me thinks I'll add a suggestion to the rightclickselect community.

$\endgroup$
2
  • 2
    $\begingroup$ I don't think materials are connected to objects; at the time of evaluation of a material, it simply doesn't know what "current object" is. You can still do things like drive object index (which is an integer, but that's not an insurmountable problem) or you can drive a per-object modifier (a driver which might modulate copying a vertex color layer from black to white, from a single vertex, which of course can be read in the material.) To my knowledge, these techniques allow a single material, but still require individual per-object drivers. $\endgroup$
    – Nathan
    Dec 31, 2022 at 21:17
  • 2
    $\begingroup$ Not sure if it helps, but you can create a custom property on each object/mesh and drive that from the shapekey value (using self if you want). Then access the custom prop in the material with an Attribute node. $\endgroup$
    – scurest
    Jan 1 at 20:47

1 Answer 1

4
$\begingroup$

As mentioned elsewhere, since materials are shared, they can't reference "self" (well they can, but self points to a node tree, not an object).

If you want a setup that you can duplicate with the references to "self" updating, you can leverage the fact modifiers are unique to an object, and so you can use a driver in a geometry nodes modifier, that set a value to an attribute, which is then accessed in a shader:

Now you can duplicate the object and each will have this interaction separate from the rest:

$\endgroup$
5
  • $\begingroup$ It's better to drive a single custom property than a geonode input. It doesn't need to be stored num_verts times. $\endgroup$
    – scurest
    Jan 2 at 13:59
  • $\begingroup$ @scurest but how will you access it from a shader? Since a material is shared, you can't make a driven field withing a node tree to point to self in this way. $\endgroup$ Jan 2 at 15:20
  • 1
    $\begingroup$ You can access an object's custom props in the material with an Attribute node set to "Object". Manual. $\endgroup$
    – scurest
    Jan 2 at 15:58
  • $\begingroup$ @scurest ah, that's indeed better, you should add it as an answer. $\endgroup$ Jan 2 at 16:52
  • $\begingroup$ A tricky workaround that should be more straightforward, but it works! Me thinks I'll add a suggestion to the rightclickselect community. $\endgroup$
    – james_t
    Jan 2 at 17:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.