1
$\begingroup$

so TL;DR is: How to have obj A geo-node attribute influence obj B's shader parameters?

I have two objects A and B.

A is a curve circle and uses geo-nodes to store its radius as a named attribute. This works so far, as I can see the correct value in the spreadsheet window.

curve circles Object A

You can see the value changes when the size changes, this works as intended.

radii change with circle size

B is a simple cube with a volumetric shader material, it is a material for an afterburner effect.

volumetric shader object B

Right now it just shows a cylindrical shape with a certain radius.

I want the radius of curve A to influence the radius of object B's volumetric shader.

The volumetric shader has a simple float number as input that controls the radius of the volumetric shape.

Now if I try to use the attribute node in the shader editor and use the named attribute, nothing happens, the value it gives is always 0. Seen by the fact that the entire volume is empty when I plug it into the emission strength.

I have tried storing the attribute in the curve circle and referencing it in the shader editor:

circle geo-nodes Node setup for the curve Circle - this stores the named attribute: Radius.ThroatA

attribute in shader editor Doesn't work.

Then I've tried getting the attribute while in object B which is the shader object. Using the object node in geo-nodes to store the attribute of curve A as Radius.ThroatB. It gives me the correct attribute values, but again if I use it in the attribute node in the shader with that named attribute... still nothing:

get attribute in shader object

I tried passing the attribute just into the group output. Still correct value in the spreadsheet, but no effect in the shader.

attribute into group output

Frankly, I have run out of ideas on how get this working.

Am I using the geo-nodes too naively?

I have not found anything in my searches that is similar to what I want to do. Usually it is all contained within one geo-node setup or within one object alone. I realize it is perhaps a very niche issue, but solving this would mean I can make my shader massively more user friendly. Instead of juggling numbers, you can just place some curve circle, animate those and have the shader follow that. Much better than animating and keyframing numerical input values.

I hope this is solvable. Any help is greatly apprechiated!

$\endgroup$

1 Answer 1

0
$\begingroup$

(Using Blender 3.6.8)

Object A - Driver

Object A GN

1. For the demo, the attribute Counter is controlled from the GeometryNodes modifier input panel.
2. It is stored in the Spline domain of object A, here a BezierCircle.

Object B - Driven

Object B GN

1. The attribute Counter is recovered from object A using a Sample Curve node. The Factor value is irrelevant as this attribute is in the spline domain, so its value is the same whatever the sampled position.
2. To keep this concept of "global" variable, i.e. not specific to a point, an edge or a face, the attribute Counter is stored in the Instance domain of object B, here a Cylinder.
3. To do so, the input geometry has to be converted to an instance, using a Geometry to Instance node.
4. To visualize the transfer from object A to object B, the position of object B vertices is shifted along X axis.

Shader

1. The attribute Counter is recovered from object B using an Attribute node set in Instancer domain.
2. For the demo, this attribute is divided by 4, such that 0 is coloured in yellow, 1 in red, 2 in green and 3 in blue. Higher values are in white.

In the Layout workspace, by selecting the BezierCircle and by incrementing the Counter value, the cylinder is moving 1 m at a time while its colour goes from yellow to white.

Resources:

$\endgroup$
3
  • $\begingroup$ Thank you! It works. Even when I adjust it to my usecase ... it just works. Thank you very much. $\endgroup$
    – VentZer0
    Commented Apr 22 at 22:32
  • $\begingroup$ @VentZer0 Just for clarification: you can use other geometry to store the named attribute as well, you are not limited to curves. For example, take a simple plane object and use the Store Named Attribute to store a value in the Point domain. Then you can retrieve the data in the driven object with a Sample Index set to Point instead of a Sample Curve node. As with the factor there, the index is irrelevant when you store the attribute on all points. However, with a specific value stored on a specific index you could even transfer multiple values per attribute and sample them by index. $\endgroup$ Commented Apr 23 at 7:34
  • 1
    $\begingroup$ @Gordon Thanks for the clarification. This could come in handy as well at some point. $\endgroup$
    – VentZer0
    Commented Apr 25 at 19:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .