In Unity, I use the following shader to calculate 2D viewport coordinates :
Shader "Foo"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct vertInput {
float4 pos : POSITION;
};
struct vertOutput {
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
};
vertOutput vert (vertInput input)
{
vertOutput o;
o.pos = mul(UNITY_MATRIX_MVP, input.pos);
o.uv = mul(UNITY_MATRIX_MVP, input.pos);
return o;
}
fixed4 frag (vertOutput output) : SV_Target
{
float2 viewport = output.uv.xy / output.uv.z;
return float4(sin(viewport.x*10.0), sin(viewport.y*10.0), 0.0, 1.0);
}
ENDCG
}
}
}
At first, it seems to work great. Here is results :
However if I move camera very close to the surface, the following unexpected glitch occurs :