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);

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

posted @ 2023-01-07 10:44  孤独の巡礼  阅读(1417)  评论(0编辑  收藏  举报