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页。
转载请注明出处:
渲染结果如下: