Unity Shader基础

Unity Shader基础

  • 矩阵
    • 内置矩阵
    • 相机
  • 函数
    • 1. 内置shader辅助函数
    • 2. 数学函数
    • 3. 几何函数
    • 4. 纹理映射函数

矩阵

内置矩阵

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

相机

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

##光照

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

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

名称 格式 说明
_LightColor float4 光照颜色
_LightMatrix0 float4x4 world-to-light矩阵。用于样品cookie 和衰减纹理

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

名称 格式 说明
unity_LightColor half4[8] 光照颜色数组
unity_LightPosition float4[8] 视图空间光源的位置。方向光源的坐标是(-方向,0);(位置,1)用于点/点指示灯,点光源,聚光灯的坐标是(位置,1)
unity_LightAtten half4[8] 光源衰减的系数。X是cos(spotAngle/2)或非聚光灯为-1;Y为1/COS(spotangle / 4)或非聚光灯为-1;Z是衰减的二次方;W是正方形光源的范围
unity_SpotDirection float4[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)	//查询投影立方体纹理

你可能感兴趣的:(Unity,图形,unity,shader)