Why Cycles do not displace accurately on instances?

I have a simple question regarding Cycles vertex-displacement implementation.

In most game engines, it is possible to apply the vector displacement shader on all instanced geometry. Meaning we can, for example, simulate wind on a forest of instanced trees, because the displacement is calculated after the instancing. ( Usually, this does not have a considerable impact on memory/performance, as the displacement is happening within of the GPU ).

Ex: Ghost of Tsushima

Currently, cycles do not support accurate shader displacement per instance, it seems that the displacement shader calculation is done “before” the instancing? why is so?
is this a known or intentional limitation?

PS: My knowledge of computer graphics is fairly limited, please let me know if i missed something obvious


It’s a rasterization shader effect. It happens on the GPU when drawing the buffers. Cycles is offline path tracer, so it can’t do such a trick, and therefore each animated instance would have to become unique geometry with unique vertex position, negating any memory savings gained by instancing.

There’s no such thing as doing the shader calculation “after” the instancing in offline ray tracers. There’s no rasterization.


Okay thanks a lot that explains it,
i didn’t knew this shader effect was exclusive to rasterization :slightly_smiling_face:

Unfortunately it is. That’s why Epic, despite their resources they have to spend on UE, still haven’t cracked this either. When you try to use this shader effect with ray tracing, it works, but there is sever performance cost, and it only works on small amount of instances, usually those closest to the camera.