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

本文介绍了两种在Unity中获取屏幕坐标的Shader实现方法:一是直接使用VPOS或WPOS语义;二是通过UnityCG.cginc中的ComputeScreenPos函数。这两种方法均能将世界坐标转换为屏幕坐标。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值