Rotation problem with screen space texture projection

Hello to everyone.

I’am developing a solution that project specific texture on a screen with transformations: move, scale, rotation. Move and scale works fine.

But a have a problem with rotation. When I try to rotate uv coords they looks quite different then object rotation in Unity. My code looks like:

Matrix4x4 rot = Matrix4x4.TRS(new Vector3( 0.0f, 0.0f, 0f), Quaternion.Euler(0f, 0.0f, -angle ), Vector3.one );
gameObject.renderer.material.SetMatrix(“_Matrix0”, rot );

And UV calculations in shader looks like this:

float2 screenUV = IN.screenPos.xy / IN.screenPos.w;

float2 uv = mul(_Matrix0, float4(screenUV, 1.0, 1.0)).xy;

As result I’ve got this:

Red color - original sprite in 3D space. Yellow color: projected texture on a 2D plane.

But if I choose 2D screen everything looks ok:

So the problem is in the way how screen UV coords works.

Does anybody have same problems with uv rotation ? I belive that exists some additional calculation that take in account sreen aspect ration in UV rotation.

I am be very glad for any ideas and solutions.
Thanks in advance.

Project was done. Sources can be founded here: