文章目录
前言
Unity中Shader的屏幕坐标
一、屏幕坐标
1、屏幕像素的坐标
2、屏幕坐标归一化
屏幕归一化坐标 = 当前像素 总像素 屏幕归一化坐标 = \frac{当前像素}{总像素} 屏幕归一化坐标=总像素当前像素
二、在Unity中获取 当前屏幕像素 和 总像素
1、获取屏幕总像素,使用_ScreenParams参数
_ScreenParams
屏幕的相关参数,单位为像素。
x表示屏幕的宽度
y表示屏幕的高度
z表示1+1/屏幕宽度
w表示1+1/屏幕高度
2、获取当前片段上的像素
UNITY_VPOS_TYPE screenPos : VPOS
1.当前片断在屏幕上的位置(单位是像素,可除以_ScreenParams.xy来做归一化),此功能仅支持#pragma target 3.0及以上编译指令
2.大部分平台下VPOS返回的是一个四维向量,部分平台是二维向量,所以需要用UNITY_VPOS_TYPE来统一区分.
3.在使用VPOS时,就不能在v2f中定义SV_POSITION,这样会冲突,所以需要把顶点着色器的输入放在()的参数中,并且SV_POSITION添加out.
怎么使用:在片元着色器传入参数时使用
fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target
{
}
VPOS这个类型因为在不同平台不统一,有的是 float2 有的是 float4 ,所以使用Unity提供的类型 UNITY_VPOS_TYPE,让Unity自动处理
当使用UNITY_VPOS_TYPE screenPos : VPOS作为片元着色器的输入时,需要对顶点着色器的输入做出修改
修改后代码:
Shader "MyShader/P0_10_3"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
};
//在顶点着色器的输入处,不用appdata,直接使用用到的参数,防止 SV_POSITION 重复定义
v2f vert (
float4 vertex : POSITION,
out float4 pos : SV_POSITION
)
{
v2f o;
pos = UnityObjectToClipPos(vertex);
return o;
}
fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target
{
float2 screenUV = screenPos.xy / _ScreenParams.xy;
return fixed4(screenUV,0,0);
}
ENDCG
}
}
}
效果:
输出屏幕归一化的x的效果:return screenUV.x;
输出屏幕归一化的y的效果:return screenUV.y;