Properties属性支持类型
属性类型 | 默认值的定义语法 | 例子 |
---|---|---|
Int | number | _Int(“Int”,Int)=2 |
Float | number | _Float(“Float”,Float)=1.5 |
Range(min,max) | number | _Range(“Range”,Range(0.0,5.0))=3.0 |
Color | (number,number,number,number) | _Color("“Color”,Color)=(1,1,1,1) |
Vector | (number,number,number,number) | _Vector(“Vector”,Vector)=(2,3,6,1) |
2D | “defaulttexture”{} | _2D(“2D”,2D)=""{} |
Cube | “defaulttexture”{} | _Cube(“Cube”,Cube)=“white”{} |
3D | “defaulttexture”{} | _3D(“3D”,3D)=“black”{} |
常见渲染设置
状态名称 | 设置指令 | 解释 |
---|---|---|
Cull | Cull Back 或 Front 或 Off | 剔除背面/正面/关闭剔除 |
ZTest | ZTest Less Greater 或 LEqual 或 GEqual 或 Equal 或 NotEqual 或 Always | 设置深度测试函数 |
ZWrite | Zwrite On 或 Off | 开关深度写入 |
Blend | Blend SrcFactor DstFactor | 开启并设置混合模式 |
SubShader标签类型
标签类型 | 说明 | 例子 |
---|---|---|
Queue | 控制渲染顺序 | Tags{“Queue”=“Transparent”} |
RenderType | 对着色器进行分类,例如这是一个不透明着色器或是一个透明着色器 | Tags{“RenderType”=“Opaque”} |
DisableBatching | 指明是否对SubShader进行批处理 | Tags{“DisableBatching”=“True”} |
ForceNoShadowCasting | 是否会投射阴影 | Tags{“ForceNoShadowCasting”=“True”} |
IgnoreProjector | 如果为True则不接受投影影响 | Tags{"IgnoreProjector "=“True”} |
CanUseSpriteAtlas | 当该SubShader是用于精灵(Sprites)时 ,将该标签设置为False | Tags{"CanUseSpriteAtlas "=“False”} |
PreviewType | 指明材质面板将如何预览材质,默认为一个球,可以设置为Plane、SkyBox | Tags{“PreviewType”=“Plane”} |
ShaderLab属性和Cg变量类型的匹配关系
ShaderLab属性 | Cg变量 |
---|---|
Color,Vector | float4,half4, fixed4 |
Range,Float | float,half,fixed |
2D | sampler2D |
Cube | samplerCube |
3D | sampler3D |
常用的包含文件
文件名 | 描述 |
---|---|
UnityCG.cginc | 包含了最常用的帮助函数、宏和结构 |
UnityShaderVeriables.cginc | 自动包含,有许多内置的全局变量,如UNITY_MATRIX_MVP |
Lighting.cginc | 自动包含,各种光照模型 |
HLSLSupport.cginc | 自动包含,用于夸平台的宏 |
常用的结构体
名称 | 描述 | 包含变量 |
---|---|---|
appdata_base | 可用于顶点着色器输入 | 顶点位置、顶点法线 、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器输入 | 顶点位置、顶点切线、顶点法线、四组或更多纹理坐标 |
appdata_img | 可用于顶点着色器输入 | 顶点位置、第一组纹理坐标 |
v2f_img | 可用于顶点着色器输出 | 裁剪空间中的位置、纹理坐标 |
应用阶段传递给顶点着色器时Unity支持的常用语义
语义 | 描述 |
---|---|
POSITION | 模型空间中的顶点位置,通常是float4 |
NORMAL | 顶点法线,通常是float3 |
TANGENT | 顶点切线,通常是float4 |
TEXCOORD0、TEXCOORD1… | 该顶点的纹理坐标通常是float2或float4 |
COLOR | 顶点颜色,通常是fixed4、float4类型 |
顶点着色器传给片元着色常用语义
语义 | 描述 |
---|---|
SV_POSITION | 裁剪空间中顶点坐标 |
COLOR0 | 通常用于输出第一组顶点色,非必须 |
COLOR1 | 通常用于输出第二组顶点色,非必须 |
TEXCOORD0~7 | 通常用于输出纹理坐标,但不是必需的 |
片元着色器输出时Unity支持的常用语义
语义 | 描述 |
---|---|
SV_Target | 输出值将会存储到渲染目标中 |
3种精度数值
类型 | 精度 |
---|---|
float | 高精度,32位 |
half | 中精度,16位,-60000~+60000 |
fixed | 底精度,11位,-2.0~2.0 |
Unity支持的Shader Target
指令 | 描述 |
---|---|
#pragma target2.0 | 默认,相当于Direc3d 9上的ShaderModel 2.0,不支持对顶点纹理采样,不支持显示 的LOD文理采样 |
#pragma target3.0 | 相当于Direc3d 9上的ShaderModel 3.0,支持对顶点纹理的采样等 |
#pragma target4.0 | 相当于Direc3d 10上的ShaderModel 4.0,支持几何着色器等 |
#pragma target5.0 | 相当于Direc3d 11上的ShaderModel 5.0 |
UnityCG.cginc中一些常用的帮助函数
函数名 | 描述 |
---|---|
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 dir) | 把方向失量从模型空间转到世界空间中 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向失量从世界空间转到模型空间中 |
ShaderLab的Blend命令
名称 | 意义 |
---|---|
Blend Off | 关闭混合 |
Blend SrcFactor DstFactor | 开启混合源色会乘以SrcFactior而目标色会乘以DstFactor |
Blend SrcFactor DstFactor, SrcFactorA DstFactorA | 和上面几乎一样,只是使用不同的因子混合 |
BlendOp BlendOperation | 并非排源色和目标色相加混合,而是使用BlendOperation对它们进行其他操作 |
ShaderLab中的混合因子
参数 | 描述 |
---|---|
One | 因为了1 |
Zero | 0 |
SrcColor | 源因子为色值 ,当为RGB通道时返回rgb,当为A通道时返回a值 |
SrcAlpha | 源因子的A通道值 |
DstColor | 目标因子色值,当RGB通道时返回rgb,当为A通道时返回a值 |
DstAlpha | 目标色值为A通道值 |
OneMinusSrcColor | 因子为1-源颜色。当为RBG则用rgb作为分量,为A通道时则以a作业值 |
OneMinusSrcAlpha | 因子为1-源颜色的a |
OneMinusDstColor | 因子为1-目标颜色。当为RBG则用rgb作为分量,为A通道时则以a作业值 |
OneMinusDstAlpha | 因子为1-目标颜色a |
LightMode支持的渲染路径设置
标签名 | 描述 |
---|---|
Always | 会被渲染,但不计算光照 |
ForwardBase | 用于前向渲染。会计算环境光,最重要的平行光,逐顶点/SH光i源和Lightmaps |
ForwardAdd | 用于前向渲染。会计算有外的逐像素光源,每个Pass对应一个光源 |
Deferred | 用于延迟渲染。该Pass会渲染G缓冲 |
ShadowCaster | 把物体的深度信息渲染到阴影映射纹理中 |
PrepassBase | 用于遗留的。该Pass会渲染法线和高光反射的指数部分 |
PrepassFinal | 用于遗留延迟渲染。该Pass通过合并纹理、光照和自发光来渲染得到最后的颜色 |
Vertex、VertexLMRGBM、VertexLM | 用于遗留的顶点照明渲染 |
前向渲染内置灯光变量
名称 | 类弄 | 描述 |
---|---|---|
_LightColor0 | float4 | 该 Pass处理的逐像素光源的颜色 |
_WorldSpaceLightPos0 | float4 | 该 Pass处理的逐像素光源的位置,如果是平行光,则是0 |
_LightMatrix0 | float4X4 | 世界空间到光源空间的变换矩阵 |
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0 | float4 | 仅用于Base Pass前四个重要点光源在世界的位置 |
unity_4LightAtten | float4 | 仅用于Base Pass前四个重要点光源的衰减引子 |
unity_LightColor | half4[4] | 仅用于Base Pass前四个重要点光源的颜色 |
前向渲染内置灯光函数
函数名 | 描述 |
---|---|
float3 WorldSpaceLightDir(float4 v) | 仅用于前向渲染,给一个模型空间顶点,返回世界空间该点到到光源的方向,没有归一化 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅用于前向渲染,给一个世界空间顶点,返回世界空间该点到到光源的方向,没有归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅用于前向渲染,给一个模型空间顶点,返回模型空间该点到到光i源的方向,没有归一化 |
float3 Shader4PointLights(float4 v) | 仅用于前向渲染,计算四个点光源的光照,参数是打包进失量的光照数据 ,用常用这个计算逐点光照 |
RenderType的参数
参数 | 说明 |
---|---|
Opaque | 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。 |
Transparent | 用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。 |
TransparentCutout | 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。 |
Background | Skybox shaders. 天空盒着色器。 |
Overlay | GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。 |
TreeOpaque | terrain engine tree bark. 地形引擎中的树皮。 |
TreeTransparentCutout | terrain engine tree leaves. 地形引擎中的树叶。 |
TreeBillboard | terrain engine billboarded trees. 地形引擎中的广告牌树。 |
Grass | terrain engine grass. 地形引擎中的草。 |
数据函数:
函数 | 含义 |
---|---|
abs(x) | 返回输入参数的绝对值 |
acos(x) | 反余切函数,输入参数范围为[-1,1],返回[0,π]区间的角度值 |
all(x) | 如果输入参数均不为0,则返回 ture;否则返回 flase。&&运算 |
any(x) | 输入参数只要有其中一个不为0,则返回 true。 |
asin(x) | 反正弦函数,输入参数取值区间为[−1,1],返回角度值范围为[−π/2 ,π/2 ] |
atan(x) | 反正切函数,返回角度值范围为⎡−π/2 ,π/2⎤ |
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 的余弦值。返回值范围为[−1,1] |
cross(A,B) | 返回两个三元向量的叉积(cross product)。注意,输入参数必须是三元向量 |
degrees(x) | 输入参数为弧度值(radians),函数将其转换为角度值(degrees) |
determinant(m) | 计算矩阵的行列式因子 |
dot(A,B) | 返回A 和 B的点积(dot product)。参数A 和 B 可以是标量,也可以是向量(输入参数方面,点积和叉积函数有很大不同) |
exp(x) | 计算ex的值,e= 2.71828182845904523536 |
exp2(x) | 计算2x的值 |
floor(x) | 对输入参数向下取整。例如floor(float(1.3)) 返回的值为1.0;但是 floor(float(-1.3))返回的值为-2.0。 |
fmod(x,y) | 返回x/y 的余数。如果 y 为 0,结果不可预料 |
frexp(x, out exp) | 将浮点数 x 分解为尾数和指数,即x = m* 2^exp,返回m,并将指数存入 exp 中;如果 x 为 0,则尾数和指数都返回0 |
frac(x) | 返回一个标量或矢量的小数部分组件 |
isfinite(x) | 判断标量或者向量中的每个数据是否是有限数,如果是返回true;否则返回false;无限的或者非数据(not-a-number NaN) |
isinf(x) | 判断标量或者向量中的每个数据是否是无限,如果是返回 true;否则返回 false; |
isnan(x) | 判断标量或者向量中的每个数据是否是非数据(not-a-number NaN),如果是返回true;否则返回false; |
ldexp(x, n) | 计算x∗2n的值 |
lerp(a, b, f) | 计算(1−f )∗ + ∗a b f或者a+f ∗ −(b a)的值。即在下限a 和上限 b 之间进行插值,f表示权值。注意,如果 a和 b 是向量,则权值 f必须是标量或者等长的向量。 |
lit(NdotL,NdotH, m) | N表示法向量;L 表示入射光向量;H表示半角向量;m 表示高光系数。函数计算环境光、散射光、镜面光的贡献,返回的 4元向量: 1.位表示环境光的贡献,总是 1.0;2.位代表镜面光的贡献,如果 N •L<0,则为0;否则为 N •L;3.位代表镜面光的贡献,如果N •L<0或者 N •H <0 ,则位 0;否则为(N •H)m; |
log(x) | 返回以e为底的对数。 |
log2(x) | 计算log(2x)的值,x 必须大于 0 |
log10(x) | 计算log10(x)的值,x必须大于 0 |
max(a, b) | 比较两个标量或等长向量元素,返回 大值 |
min(a,b) | 比较两个标量或等长向量元素,返回 小值 |
step(a, x) | 如果 x<a,返回0;否则,返回1。 |
sqrt(x) | 求 x的平方根, x ,x必须大于 0。 |
tan(x) | 输入参数为弧度,计算正切值 |
transpose(M) | M 为矩阵,计算其转置矩阵 |
几何函数:
函数名 | 含义 |
---|---|
distance( pt1, pt2) | 两点之间的欧几里德距离(Euclidean distance) |
faceforward(N,I,Ng) | 如果Ng I• <0 ,返回N;否则返回-N。 |
length(v) | 返回一个向量的模,即 sqrt(dot(v,v)) |
normalize( v) | 归一化向量 |
reflect(I, N) | 根据入射光方向向量 I,和顶点法向量N,计算反射光方向向量。其中I和N 必须被归一化,需要非常注意的是,这个I 是指向顶点的;函数只对三元向量有效。 |
refract(I,N,eta) | 计算折射向量,I为入射光线,N为法向量,eta为折射系数;其中 I 和N必须被归一化,如果I 和N 之间的夹角太大,则返回(0,0,0),也就是没有折射光线;I是指向顶点的;函数只对三元向量有效。 |
mul(M, N) | 计算两个矩阵相乘,如果 M 为 AxB 阶矩阵,N 为 BxC阶矩阵,则返回 AxC 阶矩阵。下面两个函数为其重载函数。 |
noise( x) | 噪声函数,返回值始终在 0,1 之间;对于同样的输入,始终返回相同的值(也就是说,并不是真正意义上的随机噪声)。 |
pow(x, y) | 幕运算 |
radians(x) | 函数将角度值转换为弧度值 |
round(x) | Round-to-nearest,或 closest integer to x 即四舍五入 |
rsqrt(x) | X 的反平方根,x 必须大于 0 |
saturate(x) | 如果 x 小于 0,返回 0;如果 x 大于 1,返回1;否则,返回 x |
sign(x) | 如果 x 大于 0,返回 1;如果 x 小于 0,返回-1;否则返回 0。 |
sincos(float x, out s, out c) | 该函数是同时计算 x 的 sin 值和 cos 值,其中s=sin(x),c=cos(x)。该函数用于“同时需要计算 sin 值和 cos 值的情况”,比分别运算要快很多! |
sinh(x) | 计算双曲正弦(hyperbolic sine)值。 |
smoothstep(min, max, x) | 值 x 位于 min、max 区间中。如果 x=min,返回 0;如果 x=max,返回 1;如果 x 在两者之间, 返回平平滑差值; |
step(a, x) | 如果 x<a,返回 0;否则,返回 1。 |
sqrt(x) | 求 x 的平方根, x ,x 必须大于 0。 |
tan(x) | 输入参数为弧度,计算正切值 |
tanh(x) | 计算双曲正切值 |
transpose(M) | M 为矩阵,计算其转置矩阵 |
纹理映射函数
函数 | 含义 |
---|---|
tex1D(sampler1D tex, float s) | 一维纹理查询 |
Tex2D(sampler2D tex, float2 s) | 二维纹理查询 |
Tex2Dproj(sampler2D tex, float4 s) | tex2Dproj(v) = tex2D(v.x/v.w, v.y/v.w); |
Tex2Dlod(sampler2D tex, float4 s) | s.xy是UV坐标 s.w是细节层次 例:float2 aa = tex2Dlod(_MainTex, float4(v.texcoord.xy, 0, 0)) (target3.0 版本 可用于在顶点着色器中获取图片颜色) |
Tex3D(sampler3D tex, float s) | 三维纹理查询 |
偏导函数
函数 | 含义 |
---|---|
ddx(a) | 参数 a 对应一个像素位置,返回该像素值在 X 轴上的偏导数 |
ddy(a) | 参数 a 对应一个像素位置,返回该像素值在 X 轴上的偏导数 |