Just a quick summary of what Unity does provide in Shader code.
- UNITY_MATRIX_MVP - Current model * view * project matrix
- UNITY_MATRIX_MV - Current mode * view matrix
- UNITY_MATRIX_P - Current project matrix
- _Object2World - Current model matrix
- _World2Object - Inverse of current world matrix
Very occasionally I wish there was a UNITY_MATRIX_M and UNITY_MATRIX_V but there isn't - at least - not yet. (Same limitation in GLSL)
In C# we can get the view matrix from Camera.mainCamera.worldToCameraMatrix and for GameObjects the model matrix can be generated by using Matrix4x4.TRS( transform.position, transform.rotation, transform.localScale).
If we wanted to pass in our own modelView matrix we could do
Matrix4x4 modelViewMatrix = Camera.mainCamera.worldToCameraMatrix * Matrix4x4.TRS( transform.position, transform.rotation, transform.localScale);
Then at the appropriate point we can do
material.SetMatrix("modelView", modelViewMatrix);
To pass this model view matrix into our shader.
In our shader, presumably in the vertex shader we can then use this value like so
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul( mul(UNITY_MATRIX_P, modelView), v.vertex );
return o;
}
The result of the above code is exactly the same as
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
So now knowing this you can manipulate and/or use the model and view matrices separately in your shaders if you so choose, by first passing them in from script code.