VPOS
Unity中的一个语义,表示像素在屏幕的位置。
- 数据类型有平台差异,需要使用
UNITY_VPOS_TYPE作为变量类型。
half4 frag(UNITY_VPOS_TYPE screenPos: VPOS) : SV_Target {
float2 screen_uv = screenPos / _ScreenParams.xy; // 屏幕纹理坐标
}NDC法
在Unity中,裁剪空间位置,即是经过函数UnityObjectToClipPos处理后的、输出寓意为SV_POSITION的位置坐标。该坐标的XYZ除以自身的W便可得到顶点的NDC坐标,以此计算出屏幕坐标纹理。
$$
UV = \frac{PositonCS.xy}{PositionCS.w} \times 0.5 + 0.5
$$
ComputeScreenPos
一个可用于计算屏幕位置的内置函数,通常做法是,首先在顶点着色器中计算ComputeScreenPos,将结果输出到片元着色器,然后在片元着色器中做一次齐次除法,即可得到屏幕空间下的坐标。
struct Varyings
{
float4 positionCS : SV_POSITION;
float4 screenPos : TEXCOORD0;
};
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionCS = UnityObjectToClipPos(IN.positionOS);
OUT.screenPos = ComputeScreenPos(OUT.positionCS);
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
float2 screen_uv = IN.screenPos.xy / IN.screenPos.w; // 屏幕纹理坐标
}[!warning|aside-right] 仅URP
GetNormalizedScreenSpaceUV
一个可以直接获得屏幕纹理坐标的内置函数,仅URP,所在文件:ShaderVariablesFunctions.hlsl
float2 GetNormalizedScreenSpaceUV(float2 positionCS)
float2 GetNormalizedScreenSpaceUV(float4 positionCS)裁剪空间位置法
在Unity中,裁剪空间位置,即是经过函数UnityObjectToClipPos处理后的、输出寓意为SV_POSITION的位置坐标。该坐标在顶点着色器时是正常的裁剪空间坐标,但传入片段着色器后,其XY取值范围为屏幕空间坐标宽高,故可以直接通过该坐标XY除以屏幕分辨率XY得到屏幕纹理坐标。
float4 vert(float4 positionOS : POSITION)
{
return UnityObjectToClipPos(positionOS);
}
half4 frag(float4 positionCS) : SV_Target
{
float2 screen_uv = positionCS.xy / _ScreenParams.xy; // 屏幕纹理坐标
}