Unity URP Shader之如何获取屏幕坐标
方法一
获取屏幕坐标,可使用Unity提供的内置函数 float4 ComputeScreenPos(float4 positionCS); 来获取,该方法定义如下:
float4 ComputeScreenPos(float4 positionCS)
{
float4 o = positionCS * 0.5f;
o.xy = float2(o.x, o.y * _ProjectionParams.x) + o.w;
o.zw = positionCS.zw;
return o;
}
通常做法是,首先在顶点shader中计算ComputeScreenPos,将结果保存到输出结构体中。
然后在片元shader中做一次齐次除法,即可得到视口空间下的坐标,该坐标左下角是(0,0),右上角是(1,1),如下图:
HLSL代码如下:
1 struct v2f 2 { 3 float4 pos : SV_POSITION; 4 float4 screenPos : TEXCOORD0; 5 }; 6 7 v2f vert (appdata v) 8 { 9 v2f o; 10 o.pos = TransformObjectToHClip(v.vertex.xyz); 11 // 第一步,计算ComputeScreenPos,并保存到 screenPos 中 12 o.screenPos = ComputeScreenPos(o.pos); 13 return o; 14 } 15 16 half4 frag (v2f i) : SV_Target 17 { 18 // 第二步,除以screenPos.w得到视口空间中的坐标 19 half2 screen_uv = i.screenPos.xy / i.screenPos.w; 20 return half4(screen_uv, 0, 0); 21 }
方法二
直接在片元shader里获取,如下:
half2 screenUV = GetNormalizedScreenSpaceUV(i.pos);