2種方法:
1. 使用 VPOS 或 WPOS語義,如:

Shader "Test/ScreenPos1" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata { float4 pos : POSITION; }; struct v2f { float4 pos : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.pos); return o; } fixed4 frag (v2f i : WPOS) : SV_Target { fixed2 viewPos = i.pos.xy / _ScreenParams.xy; return fixed4(viewPos, 0, 1); } ENDCG } } }
其中,VPOS/WPOS 的z分量范圍為[0,1],在攝像機的近裁剪平面處,z值為0,在遠裁剪平面處,z值為1。
2. 使用 UnityCG.cginc 中的 ComputeScreenPos 方法,如:

Shader "Test/ScreenPos2" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 pos : POSITION; float4 scrPos : TEXCOORD0; }; struct v2f { float4 pos : SV_POSITION; float4 scrPos : TEXCOORD0; }; v2f vert (appdata v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.pos); o.scrPos = ComputeScreenPos(o.pos); return o; } fixed4 frag (v2f i) : SV_Target { fixed2 viewPos = i.scrPos.xy / i.scrPos.w; return fixed4(viewPos, 0, 1); } ENDCG } } }
詳細參考《Unity shader入門精要》 91頁。
轉載請注明出處:http://www.cnblogs.com/jietian331/p/7025853.html
渲染結果如下: