I’m writing a shader from scratch to try and understand all the underlying math, but this is stumping me; shouldn’t converting the _WorldCameraPos to object space produce the same result as converting the vertex to world space?

o.ps = mul((float3x3)_World2Object, _WorldSpaceCameraPos - mul(_Object2World, v.vertex).xyz);

o.ps = mul((float3x3)_World2Object, _WorldSpaceCameraPos) - v.vertex.xyz;

I don’t think World2Object and Object2World are inverses (i.e. mul(_Object2World, _World2Object) is not the identity matrix), and this is suggested at Unity Shader World/Object Matrix - Unity Answers

To get the inverse of Object2World you need to multiply World2Object by unity_Scale.w, *except* for the bottom-right element. Try using this:

```
float4x4 obj2WorldInverse = _World2Object * unity_Scale.w;
obj2WorldInverse[3][3] = 1.0;
```