Unity Shader基础

矩阵

内置矩阵

名称说明
UNITY_MATRIX_MVP当前模型视图投影矩阵,通常用于把顶点/方向矢量从模型空间转换到裁剪空间
UNITY_MATRIX_MV当前模型视图矩阵,通常用于把顶点/方向矢量从模型空间转换到视角(相机)空间
UNITY_MATRIX_V当前视图矩阵,通常用于把顶点/方向矢量从世界空间转换到视角(相机)空间
UNITY_MATRIX_P当前的投影矩阵,通常用于把顶点/方向矢量从视角(相机)空间转换到裁剪空间
UNITY_MATRIX_VP当前视图投影矩阵,通常用于把顶点/方向矢量从世界空间转换到裁剪空间
UNITY_MATRIX_T_MVUNITY_MATRIX_MV模型视图矩阵的转置
UNITY_MATRIX_IT_MV模型视图矩阵的逆转置,通常用于把法线从模型空间转换到视角(相机)空间
unity_ObjectToWorld当前模型转空间矩阵,通常用于把顶点/方向矢量从模型空间转换到世界空间
unity_WorldToObject当前世界转模型矩阵,通常用于把顶点/方向矢量从世界空间转换到模型空间

相机

名称格式说明
_WorldSpaceCameraPosfloat3世界空间相机的位置
_ProjectionParamsfloat4x = 1.0(或如果当前使用翻转投影矩阵渲染则为-1.0),y是相机的近平面,z是相机的远平面,w是1 / FarPlane
_ScreenParamsfloat4x是相机的渲染目标在像素里的宽度,y是相机的渲染目标在像素里的高度,z是1.0 + 1.0 /宽度和w是1.0 + 1.0 /高度
_ZBufferParamsfloat4用于线性化Z缓冲区的值。x(1-far /near),y(far/near)、z(x /far)和w(y /far)
unity_OrthoParamsfloat4x是正交的相机的宽度,y是正交的相机的高度,z是未使用的,为正交的相机时w为1.0,透视相机时w为0.0
unity_CameraProjectionfloat4x4摄像机的投影矩阵
unity_CameraInvProjectionfloat4x4摄像机的投影矩阵的逆矩阵
unity_CameraWorldClipPlanes[6]float4相机锥平面世界空间方程,按顺序为:左、右、底部、顶部、近、远

##光照

名称格式说明
_LightColor0(Lighting.cginc中声明)fixed4光照颜色
_worldspacelightpos0float4方向光:(世界空间方向,0)。其他光:(世界空间位置,1)
_LightMatrix0(AutoLight.cginc声明)float4x4world-to-light矩阵。用于样品cookie 和衰减纹理
unity_4LightPosX0、unity_4LightPosY0、unity_4lightposz0float4(仅ForwardBase通道)前四个不重要的点光源的世界空间坐标
unity_4lightatten0float4(仅ForwardBase通道)前四个不重要的点光源的衰减系数
unity_lightcolorhalf4[4](仅ForwardBase通过)前四个不重要的点光源的颜色数组

在Shader的光照通道里的延迟着色和延迟光照(在unitydeferredlibrary.cginc):

名称格式说明
_LightColorfloat4光照颜色
_LightMatrix0float4x4world-to-light矩阵。用于样品cookie 和衰减纹理

多光源下,最多8个光源在顶点通道,排序为从最亮的开始

名称格式说明
unity_LightColorhalf4[8]光照颜色数组
unity_LightPositionfloat4[8]视图空间光源的位置。方向光源的坐标是(-方向,0);(位置,1)用于点/点指示灯,点光源,聚光灯的坐标是(位置,1)
unity_LightAttenhalf4[8]光源衰减的系数。X是cos(spotAngle/2)或非聚光灯为-1;Y为1/COS(spotangle / 4)或非聚光灯为-1;Z是衰减的二次方;W是正方形光源的范围
unity_SpotDirectionfloat4[8]视图空间聚光灯的位置;(0,0,1,0)则非聚光灯。

函数

1. 内置shader辅助函数

定义在UnityCG.cginc文件中

名称说明
float4 UnityObjectToClipPos(float3 pos)等价于:mul(UNITY_MATRIX_MVP, float4(pos, 1.0)) 把方向矢量从模型空间变化到世界空间中
float3 UnityObjectToViewPos(float3 pos)等价于:mul(UNITY_MATRIX_MV, float4(pos, 1.0))
float3 WorldSpaceViewDir (float4 v)参数是object space下的顶点坐标,取得world space下指向摄像机的方向,即视角方向
float3 ObjSpaceViewDir (float4 v)同上,不过取到的视角方向是在object space上的
float2 ParallaxOffset (half h, half height, half3 viewDir)为视差法线贴图计算UV偏移
fixed Luminance (fixed3 c)将颜色转换为亮度(灰度)
fixed3 DecodeLightmap (fixed4 color)从烘焙贴图解码,烘焙贴图生成的是EXR格式的HDR贴图,根据不同平台返回RGBM或dLDR
float4 EncodeFloatRGBA (float v)把float编码到RGBA8
float3 WorldSpaceLightDir(float4 v)输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。内部使用了UnityWorldSpaceLightDir,没有被归一化
float3 UnityObjectToWorldDir(float3 dir)把方向矢量从模型空间变化到世界空间中
float3 UnityObjectToWorldNormal(float3 dir)把法线方向从模型空间转换到世界空间中
float3 UnityWorldToObjectDir(float3 dir)把方向矢量从世界空间变化到模型空间
float3 WorldSpaceViewDir(float4 v)输入一个模型空间中的顶点位置,返回世界空间中从该顶点到摄像机的观察空间方向。 内部使用了UnityWorldSpaceViewDir函数
float3 UnityWorldSpaceViewDir(float4 v)输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v)输入一个模型空间中的顶点位置,返回模型空间中从改点到摄像机的观察方向
float3 WorldSpaceLightDir(float4 v)输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。内部使用了UnityWorldSpaceLightDir,没有被归一化
float3 UnityWorldSpaceLightDir(float4 v)输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化
float3 ObjSpaceLightDir(float4 v)输入一个模型空间中的顶点位置,返回模型空间从该点到光源的光照方向。没有被归一化

仅用于前向渲染

名称说明
float3 WorldSpaceLightDir (float4 v)参数是object space下的顶点坐标,取得world space下指向光源的方向
float3 ObjSpaceLightDir (float4 v)参数是object space下的顶点坐标,取得object space下指向光源的方向
float3 Shade4PointLights (…)正向渲染中,最多有4个点光源会以逐顶点渲染的方式被计算。

仅用于per-vertex lit shaders

名称说明
float3 ShadeVertexLights (float4 vertex, float3 normal)参数为顶点跟法线,根据四个逐顶点光源跟环境光计算光照

2. 数学函数

dot(A,B)	//点积
//点积结果为标量,主要用于求向量的夹角或b向量在a向量上的投影。
cross(A,B)	//叉积
//叉积结果为向量,结果与这两个向量组成的平面垂直。主要用于3D图形学
 
mul(M, N)	//矩阵M和矩阵N的积
mul(M, v)	//矩阵M和列向量v的积
mul(v, M)	//行向量v和矩阵M的积
 
abs(x)	//返回绝对值
saturate(x)	//把x限制到[0,1]之间
clamp(x,a,b)	//把x限制到[a,b]之间
 
sqrt(x)	//求x的平方根,,x必须大于0
rsqrt(x)	//x的平方根的倒数,x必须大于0
 
all(x)	//如果输入参数均不为0,则返回ture; 否则返回flase。&&运算
any(x)	//输入参数只要有其中一个不为0,则返回true。||运算
 
lerp(a, b, f)	//计算(1-f)a + b*f 。即在下限a和上限b之间进行插值,f表示权值。注意,如果a和b是向量,则权值f必须是标量或者等长的向量。
 	 
ceil(x)   //对x向上取整。
floor(x)   //对x向下取整。
round(x)	//返回四舍五入值。
 
step(a, x)	//如果x< a,返回0;否则,返回1
sign(x)	//如果x大于0,返回1;如果小于0,返回-1;否则返回0;
 
exp(x)	//计算e^x,e=2.71828
exp2(x)	//计算2^x
 
fmod(x,y)	//返回x/y的余数。如果y为0,结果不可预料。
modf(x, out ip)	//把x分解成整数和分数两部分,每部分都和x有着相同的符号,整数部分被保存在ip中,分数部分由函数返回
 
max(a, b)	//比较两个标量或等长向量元素,返回最大值。
min(a,b)	//比较两个标量或等长向量元素,返回最小值。
 
determinant(m)	//计算矩阵的行列式因子。
transpose(M)	//矩阵M的转置矩阵
 
degrees(x)	//函数将弧度值转换为角度值
radians(x)	//函数将角度值转换为弧度值
 
log(x)	//计算ln(x)的值,x必须大于0
log2(x)	//计算log2^x的值,x必须大于0
log10(x)	//计算log10^x的值,x必须大于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;
lit(NdotL, NdotH, m)	//N表示法向量。L表示入射光向量。H表示半角向量。m表示高光向量。函数计算环境
						//光,散射光,镜面光的贡献,返回四元向量: X表示环境光的贡献,总是1;
						//Y表示散射光的贡献,如果N.L<0,则为0,否则为N.L; Z表示镜面光的贡献,
						//如果N.L<0或者N.H<0,则为0;否则为(N.H)^m;W始终为1
noise(x)	//根据它的参数类型,这个函数可以是一元、二元或三元噪音函数。
			//返回的值在0和1之间,并且通常与给定的输入值一样	
ldexp(x, n)	//计算x*(2^n)的值
smoothstep(min, max, x)	 //x位于min和max之间,若x=min,返回0;若x=max,返回1;
		//若x在两者之间,按下列公式返回数据:-2*((x-min)/(max-min))^3+3*((x-min)/(max-min))^2
 	 
sin(x)	//返回弧度x的正弦值,返回值范围为[-1,1]
cos(x)	//返回弧度x的余弦值。返回值范围为[-1,1]
tan(x)	//计算x正切值
 
asin(x)	//反正弦函数,输入参数取值区间为[-1,1],返回角度值范围为[-π/2,π/2]
acos(x)	//反余切函数,输入参数范围为[-1,1], 返回[0,π]区间的角度值
atan(x)	//反正切函数
 
sinh(x)	//计算x的双曲正弦
cosh(x)	//计算x的双曲余弦值。
tanh(x)	//计算x的双曲线切线
sincos(float x, out s, out c)	//同时计算x的sin值和cos值,其中s=sin(x),c=cos(x)。该函数比分别运算要快很多!

3. 几何函数

normalize(v)	//返回v向量的单位向量
reflect(I, N)	//根据入射光纤方向I和表面法向量N计算反射向量,仅对三元向量有效
 
length(v)	//返回v向量的模,即sqrt(dot(v,v))
distance(pt1, pt2)	//两点之间的欧几里德距离
 
faceforward(N,I,Ng)	//如果dot(I,Ng)<0,返回N;否则返回-N。
refract(I,N,eta)	//根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量。
				//如果对给定的eta,I和N之间的角度太大,返回(0,0,0)。只对三元向量有效
 

4. 纹理映射函数

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)	//使用导数值查询一维纹理, 并进行深度值比较
Tex1Dproj(sampler1D tex, float2 sq)	//一维投影纹理查询
Tex1Dproj(sampler1D tex, float3 szq)	//一维投影纹理查询,并比较深度值
  
Tex2D(sampler2D tex, float2 s)	//二维纹理查询
Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy)	///使用导数值查询二维纹理
Tex2D(sampler2D tex, float3 sz)	//二维纹理查询,并进行深度值比较
Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy)	//使用导数值查询二维纹理,并进行深度值比较
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)	//结合导数值查询三维纹理
Tex3Dproj(sampler3D tex, float4 szq)	//查询三维投影纹理,并进行深度值比较
texCUBE(samplerCUBE tex, float3 s)	//查询立方体纹理
texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy)	//结合导数值查询立方体纹理
texCUBEproj (samplerCUBE tex, float4 sq)	//查询投影立方体纹理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值