VPOS

Unity中的一个语义,表示像素在屏幕的位置。

HLSL
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,将结果输出到片元着色器,然后在片元着色器中做一次齐次除法,即可得到屏幕空间下的坐标。

HLSL
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

HLSL
float2 GetNormalizedScreenSpaceUV(float2 positionCS)
float2 GetNormalizedScreenSpaceUV(float4 positionCS)
点击展开查看更多

裁剪空间位置法

在Unity中,裁剪空间位置,即是经过函数UnityObjectToClipPos处理后的、输出寓意为SV_POSITION的位置坐标。该坐标在顶点着色器时是正常的裁剪空间坐标,但传入片段着色器后,其XY取值范围为屏幕空间坐标宽高,故可以直接通过该坐标XY除以屏幕分辨率XY得到屏幕纹理坐标。

HLSL
float4 vert(float4 positionOS : POSITION)
{
	return UnityObjectToClipPos(positionOS);
}

half4 frag(float4 positionCS) : SV_Target
{
	float2 screen_uv = positionCS.xy / _ScreenParams.xy; // 屏幕纹理坐标
}
点击展开查看更多

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/%E5%B1%8F%E5%B9%95%E7%BA%B9%E7%90%86%E5%9D%90%E6%A0%87%E5%B1%8F%E5%B9%95%E7%A9%BA%E9%97%B4%E5%9D%90%E6%A0%87/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键