常用变量解释
unity官方shader库里面有比较多常用的函数, 要用到的时候可以去查找,必要的时候也可以去看相关实现,关于unity官方shader库可以到官网登录后下载
Releases
点击上图红框按钮,在弹出的页面中选择下图红框即可。
常用的函数还可以参考
Unity学习shader笔记[五]常用shader变量和函数
常用函数
- 摄像机转换函数
float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标 得到世界空间从这个点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标 得到世界空间从这个点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) 根据模型空间中的顶点坐标 得到模型空间从这个点到摄像机的观察方向
- 光源方向函数
float3 WorldSpaceLightDir(float4 v) 根据模型空间中的顶点坐标 得到世界空间从这个点到光源的方向
float3 UnityWorldSpaceLightDir(float4 v) 根据世界空间中的顶点坐标 得到世界空间从这个点到光源的方向
float3 ObjSpaceLightDir(float4 v) 根据模型空间中的顶点坐标 得到模型空间从这个点到光源的方向
- 方向转换函数
float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 从模型空间转到世界空间
float3 UnityObjectToWorldDir(float3 di'r) 把方向 从模型空间 转到世界空间
float3 UnityWorldToObjectDir(float3 dir) 把方向 从世界空间 转到模型空间
- 系统传递给顶点函数可以使用的语义
POSITION 模型空间下的顶点坐标
NORMAL 模型空间下的法线
TANGENT 模型空间下的切线
TEXCOORD 0-n 纹理坐标
COLOR 顶点颜色
- 从顶点函数传递给片源函数的时候可以使用的语义
SV_POSITION 剪裁空间中的顶点坐标
COLOR0 可以给代码编写者传递一组值 4个
COLOR1 可以给代码编写者传递一组值 4个
TEXCOORD 0-7 传递纹理坐标
- 常用矩阵
unity_ObjectToWorld
一个矩阵用于正乘将顶点从物体空间转换到世界空间或者反乘将顶点从世界空间转换到物体空间
- 常用数学函数
abs(x) 返回输入参数的绝对值
acos(x) 反余切函数,输入参数范围为[-1,1], 返回[0,π]区间的角度值
all(x) 如果输入参数均不为0,则返回ture; 否则返回flase。&&运算
any(x) 输入参数只要有其中一个不为0,则返回true。
asin(x) 反正弦函数,输入参数取值区间为,返回角度值范围为,
atan(x) 反正切函数,返回角度值范围为
atan2(y,x) 计算y/x的反正切值。实际上和atan(x)函数功能完全一样,至少输入参数不同。atan(x) = atan2(x, float(1))。
ceil(x) 对输入参数向上取整。例如: ceil(float(1.3)) ,其返回值为2.0
clamp(x,a,b) 如果x值小于a,则返回a;
如果x值大于b,返回b;
否则,返回x。
cos(x) 返回弧度x的余弦值。返回值范围为
cosh(x) 双曲余弦(hyperbolic cosine)函数,计算x的双曲余弦值。
cross(A,B) 返回两个三元向量的叉积(cross product)。注意,输入参数必须是三元向量!
degrees(x) 输入参数为弧度值(radians),函数将其转换为角度值(degrees)
determinant(m) 计算矩阵的行列式因子。
dot(A,B) 返回A和B的点积(dot product)。参数A和B可以是标量,也可以是向量(输入参数方面,点积和叉积函数有很大不同)。
exp(x) 计算的值,e=2.71828182845904523536
exp2(x) 计算的值
floor(x) 对输入参数向下取整。例如floor(float(1.3))返回的值为1.0;但是floor(float(-1.3))返回的值为-2.0。该函数与ceil(x)函数相对应。
fmod(x,y) 返回x/y的余数。如果y为0,结果不可预料。
frac(x) 返回标量或矢量的小数
frexp(x, out i) 将浮点数x分解为尾数和指数,即, 返回m,并将指数存入i中;如果x为0,则尾数和指数都返回0
isfinite(x) 判断标量或者向量中的每个数据是否是有限数,如果是返回true;否则返回false;
isinf(x) 判断标量或者向量中的每个数据是否是无限,如果是返回true;否则返回false;
isnan(x) 判断标量或者向量中的每个数据是否是非数据(not-a-number NaN),如果是返回true;否则返回false;
ldexp(x, n) 计算的值
lerp(a, b, f) 计算或者的值。即在下限a和上限b之间进行插值,f表示权值。注意,如果a和b是向量,则权值f必须是标量或者等长的向量。
lit(NdotL, NdotH, m) N表示法向量;L表示入射光向量;H表示半角向量;m表示高光系数。 函数计算环境光、散射光、镜面光的贡献,返回的4元向量。 X位表示环境光的贡献,总是1.0; Y位代表散射光的贡献,如果 ,则为0;否则为 Z位代表镜面光的贡献,如果 或者,则位0;否则为;W位始终位1.0
log(x) 计算的值,x必须大于0
log2(x) 计算的值,x必须大于0
log10(x) 计算的值,x必须大于0
max(a, b) 比较两个标量或等长向量元素,返回最大值。
min(a,b) 比较两个标量或等长向量元素,返回最小值。
modf(x, out ip) 把x分解成整数和分数两部分,每部分都和x有着相同的符号,整数部分被保存在ip中,分数部分由函数返回
mul(M, N) 矩阵M和矩阵N的积
mul(M, v) 矩阵M和列向量v的积
mul(v, M) 行向量v和矩阵M的积
noise(x) 根据它的参数类型,这个函数可以是一元、二元或三元噪音函数。返回的值在0和1之间,并且通常与给定的输入值一样
radians(x) 函数将角度值转换为弧度值
round(x) 返回四舍五入值。
rsqrt(x) x的平方根的倒数,x必须大于0
saturate(x) 把x限制到[0,1]之间
sign(x) 如果则返回1;否则返回0
sin(x) 输入参数为弧度,计算正弦值,返回值范围 为[-1,1]
sincos(float x, out s, out c) 该函数是同时计算x的sin值和cos值,其中s=sin(x),c=cos(x)。该函数用于“同时需要计算sin值和cos值的情况”,比分别运算要快很多!
sinh(x) 计算x的双曲正弦
smoothstep(min, max, x) 值x位于min、max区间中。如果x=min,返回0;如果x=max,返回1;如果x在两者之间,按照下列公式返回数据:
step(a, x) 如果,返回0;否则,返回1
sqrt(x) 求x的平方根,,x必须大于0
tan(x) 计算x正切值
tanh(x) 计算x的双曲线切线
transpose(M) 矩阵M的转置矩阵
distance(pt1, pt2) 两点之间的欧几里德距离(Euclidean distance)
faceforward(N,I,Ng) 如果,返回N;否则返回-N。
length(v) 返回一个向量的模,即sqrt(dot(v,v))
normalize(v) 返回v向量的单位向量
reflect(I, N) 根据入射光纤方向I和表面法向量N计算反射向量,仅对三元向量有效
refract(I,N,eta) 根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量。如果对给定的eta,I和N之间的角度太大,返回(0,0,0)。
只对三元向量有效
-
纹理映射函数
tex1D(sampler1D tex, float s) 一维纹理查询
tex1D(sampler1D tex, float s, float dsdx, float dsdy) 使用导数值(derivatives)查询一维纹理
Tex1D(sampler1D tex, float2 sz) 一维纹理查询,并进行深度值比较
Tex1D(sampler1D tex, float2 sz, float dsdx,float dsdy) 使用导数值(derivatives)查询一维纹理, 并进行深度值比较
Tex1Dproj(sampler1D tex, float2 sq) 一维投影纹理查询
Tex1Dproj(sampler1D tex, float3 szq) 一维投影纹理查询,并比较深度值
Tex2D(sampler2D tex, float2 s) 二维纹理查询
Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy) 使用导数值(derivatives)查询二维纹理
Tex2D(sampler2D tex, float3 sz) 二维纹理查询,并进行深度值比较
Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy) 使用导数值(derivatives)查询二维纹理,并进行深度值比较
Tex2Dproj(sampler2D tex, float3 sq) 二维投影纹理查询
Tex2Dproj(sampler2D tex, float4 szq) 二维投影纹理查询,并进行深度值比较
texRECT(samplerRECT tex, float2 s) 二维非投影矩形纹理查询(OpenGL独有)
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) 二维非投影使用导数的矩形纹理查询(OpenGL独有)
texRECT (samplerRECT tex, float3 sz) 二维非投影深度比较矩形纹理查询(OpenGL独有)
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) 二维非投影深度比较并使用导数的矩形纹理查询(OpenGL独有)
texRECT proj(samplerRECT tex, float3 sq) 二维投影矩形纹理查询(OpenGL独有)
texRECT proj(samplerRECT tex, float3 szq) 二维投影矩形纹理深度比较查询(OpenGL独有)
Tex3D(sampler3D tex, float s) 三维纹理查询
Tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy) 结合导数值(derivatives)查询三维纹理
Tex3Dproj(sampler3D tex, float4 szq) 查询三维投影纹理,并进行深度值比较
texCUBE(samplerCUBE tex, float3 s) 查询立方体纹理
texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy) 结合导数值(derivatives)查询立方体纹理
texCUBEproj (samplerCUBE tex, float4 sq) 查询投影立方体纹理 -
常用变量
使用UNITY_LIGHTMODEL_AMBIENT.rgb获取系统环境光的变量
使用 _LightColor0.rgb获取第一个光的颜色 Unity世界中第一个直射光的颜色,一般在场景中只有一个直射光,但是有些场景会有几个直射光,第一个直射光代表场景中最早创建的直射光
使用 _WorldSpaceLightPos0获取第一个光的位置 如果第一个光是直射光,这个位置是相对位置,即每个顶点的位置加上相同的偏移向量
- 常用unitycg.cginc内置结构体
在unity中我们经常会遇到这样的语句
细节知识点
-
数学函数图像在线绘制网站,需要使用到某些数学函数时候可以到里面看看他的y值根据x值的变化效果
-
Tags{“LightMode” = “ForwardBase”} 这个定义在CGPROGRAM上面
写这个的目的是,定义了正确的LightMode的时候 引用Unity内置文件才能得到一些Unity内置光照变量 -
在unity5.6以上版本中,shader中的UNITY_MATRIX_MVP将会被UnityObjectToClipPos替代,以后我们在写顶点函数时就是这样的
unity5.6以前的写法 o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
unity5.6以后的写法 o.vertex = UnityObjectToClipPos(v.vertex);
上述两种写法的作用都是将顶点位置从模型空间转换到剪裁空间
unity改成这样的原因是在一些设备环境下,直接用MVP矩阵相乘的方式可能并不能直接得到裁剪空间下的顶点位置,unity将各个设备环境下的这种操作封装到了一个函数里面。 -
矩阵相乘要符合一定的规律的 有时要对两个不同维度的矩阵进行相乘运算,可以将其中一个矩阵的维度转换成另一个矩阵的维度,通过下述的方式
mul(v.vertex, (float33)UNITY_MATRIX_MVP)
其中MVP矩阵是44矩阵,(float33)就表示将矩阵转换成33形式的。 -
两个颜色融合,一般两个颜色相乘;两个颜色叠加,两个颜色相加即可,注意的是两个颜色相加后,亮度会变大