Unity之fragment shader中如何获得视口空间中的坐标

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
        }
    }
}
View Code

其中,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
        }
    }
}
View Code

详细参考《Unity shader入门精要》 91页。

转载请注明出处:http://www.cnblogs.com/jietian331/p/7025853.html

渲染结果如下:

原文地址:https://www.cnblogs.com/jietian331/p/7025853.html