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

 

渲染結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM