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)
cross(A,B)
mul(M, N)
mul(M, v)
mul(v, M)
abs(x)
saturate(x)
clamp(x,a,b)
sqrt(x)
rsqrt(x)
all(x)
any(x)
lerp(a, b, f)
ceil(x)
floor(x)
round(x)
step(a, x)
sign(x)
exp(x)
exp2(x)
fmod(x,y)
modf(x, out ip)
max(a, b)
min(a,b)
determinant(m)
transpose(M)
degrees(x)
radians(x)
log(x)
log2(x)
log10(x)
frac(x)
frexp(x, out i)
isfinite(x)
isinf(x)
isnan(x)
lit(NdotL, NdotH, m)
noise(x)
ldexp(x, n)
smoothstep(min, max, x)
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
sinh(x)
cosh(x)
tanh(x)
sincos(float x, out s, out c)
3. 几何函数
normalize(v)
reflect(I, N)
length(v)
distance(pt1, pt2)
faceforward(N,I,Ng)
refract(I,N,eta)
4. 纹理映射函数
tex1D(sampler1D tex, float s)
tex1D(sampler1D tex, float s, float dsdx, float dsdy)
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)
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy)
texRECT (samplerRECT tex, float3 sz)
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy)
texRECT proj(samplerRECT tex, float3 sq)
texRECT proj(samplerRECT tex, float3 szq)
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)