SVM states for ‘Shader Virtual Machine’, and it’s the part of Cycles that deals with shaders.

The limitation in just because when we use the bump node, Cycles (or the svm), probes the texture at least two more times to get the derivatives at the coordinate being sampled. What I suspect it does, is that it changes P a bit and sample the texture again… (at least I know that if you have an OSL texture and want to use it with a bump node, you need to use P from the geometry node and not P accessible from the OSL::Globals). This limits things a bit when we want to hack the bump node to produce other things than normal vectors. (like producing coordinates from the normal, as in the node setup I posted).

What’s going on is just a projection of the bumped normal vector into the tangent plane of the surface, and use the coordinate of that projection as a UV map. We can imagine the bumped normal is a unit vector placed on the surface, with it’s own inclination; if we Dot(Normal, Tangent) we get the cosine of the angle between the normal and the tangent vector; and we do the same to the cotangent, but because we don’t have a cotangent, we need to build one with Cross(Original Normal, Tangent) which returns a new vector perpendicular to both input vectors. We can use these cosines as U and V and use them as coordinates for other textures. I added 0.5 to them just to keep the origin of the coordinates in a corner, otherwise it would stay in the center of each voronoi cell)