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

时间:2023-03-08 16:48:59

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, , );
}
ENDCG
}
}
}

其中,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, , );
}
ENDCG
}
}
}

详细参考《Unity shader入门精要》 91页。

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

渲染结果如下:

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