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

 

渲染结果如下:

posted @ 2017-06-16 09:23  孤独の巡礼  阅读(1970)  评论(0编辑  收藏  举报