Ho scritto l'intero shader incriminato sopra.
Lo shader di esempio, in teoria, non dovrebbe far nulla:
1) scambio i vertici della mesh in coordinate globali (unity_ObjectToWorld) == world
2) passo da coordinate cartesiani a coordinate sferiche == spherical [qui potrebbe rompersi]
3) passo da coordinate sferiche a coordinate cartesiani == newWorld [anche qui potrebbe rompersi]
4) ritorno a coordinate locali della mesh (unity_WorldToObject) e aggiorno il vertice attuale
Senza 2 e 3 funziona (ovviamente), quindi c'è qualcosa che non va nelle due funzioni di cambio, come dicevo, però le stesse funzioni utilizzate direttamente in Unity con C# funzionano:
var cart = transform.position;
var spherical = CartesianToSpherical(cart);
var backCart = SphericalToCartesian(spherical);
Debug.Log((backCart - cart).magnitude);
Questo è il codice di esempio in cui uso le due funzione scritte sopra in C#, la magnitude fra le differenze della posizione iniziale e quella in cui faccio il test dal cambio è sempre approssimata a 0.