1.Properties块中的特殊命令
命令 |
参数 |
说明 |
[Header(test)] |
括号内即为头标题的显示文字 |
不要加引号,不支持中文 |
[NoScaleOffset] |
|
隐藏贴图的Tilling和Offset选项 |
[Toggle] |
|
模拟开关,0为假,1为真,同[MaterialToggle] |
## 2.SubShader块中的渲染状态设置指令
指令 |
参数 |
说明 |
Cull |
Cull Back/Front/Off |
剔除模式 |
ZTest |
ZTest Less/Greater/Equal/LEqual/GEqual/NotEqual/Always |
深度测试 |
ZWrite |
ZWrite On/Off |
深度写入 |
Blend |
Blend xx |
颜色混合模式 |
Blend比较复杂,包含以下几种形式: 1. Blend Off 关闭颜色混合模式,默认值
2. Blend SrcFactor DstFactor
最终颜色 = SrcFactor*源颜色(即计算出来的片元颜色值) + DstFactor*目标颜色(即颜色缓冲区中的颜色值)
3. Blend SrcFactor DstFactor,SrcFactorA DstFactorA
与2相似,只是把Alpha通道分离出来了
上述SrcFactor和DstFactor的值可以为以下任一值:
指令 |
值 |
One |
1 |
Zero |
0 |
SrcColor |
源颜色 |
SrcAlpha |
源透明度 |
DstColor |
目标颜色 |
DstAlpha |
目标透明度 |
OneMinusSrcColor |
1 - 源颜色 |
OneMinusSrcAlpha |
1 - 源透明度 |
OneMinusDstColor |
1 - 目标颜色 |
OneMinusDstAlpha |
1 - 目标透明度 |
|
|
4. Blend Op
采用操作符进行计算
指令 |
值 |
Add |
源颜色 + 目标颜色 |
Sub |
源颜色 - 目标颜色 |
RevSub |
目标颜色 - 源颜色 |
Min |
取源颜色和目标颜色中的较小者 |
Max |
取源颜色和目标颜色中的较大者 |
5. Blend OpColor,OpAlpha
与4相似,只是把透明通道分离出来了 ## 3.SubShader块中的Tag标签
标签类型 |
值 |
说明 |
Queue |
Background/Geometry/AlphaTest/Transparent/Overlay |
对应值为1000/2000/2450/3000/4000 |
RenderType |
Opaque/Transparent/TransparentCutout/ Background/Overlay/TreeOpaque/TreeTransparentCutout/ TreeBillboard/Grass/GrassBillboard |
用于替代渲染和获取场景深度和法线信息 |
DisableBatching |
true/false |
禁用批处理 |
ForceNoShadowCasting |
true/false |
禁止投射阴影 |
IgnoreProjector |
true/false |
忽略Projector,通常用于半透明物体 |
CanUseSpriteAtlas |
true/false |
当该SubShader用于Sprite时用false |
PreviewType |
Plane/SkyBox |
预览形状 |
|
|
|
4.三、Pass块中的指令
1.Name “MYPASSNAME”
为该Pass命名,用于在其他Shader中通过UsePass命令调用该Pass,即使使用小写字母命名,Unity也会自动转为大写字母,所以UsePass命令中也需写成大写字母
2.GrabPass { “TextureName”}
抓取屏幕并生成纹理,TextureName为自定义纹理名称,默认为_GrabTexture
5.Pass块中的Tag标签
标签类型 |
值 |
说明 |
LightMode |
Always/ForwardBase/ForwardAdd/Deferred/ShadowCaster/ MotionVectors/PrepassBase/PrepassFinal/Vertex/VertexLMRGBM/VertexLM |
详见官方文档 |
PassFlags |
OnlyDirectional |
仅传送主平行光、环境光和LightProbe的光照数据 |
RequireOptions |
SoftVegetation |
满足给定条件才渲染该Pass |
6.#prama指令
指令 |
值 |
说明 |
target |
2.0/2.5(default)/3.0/3.5(es3.0)/ 4.0/4.5(es3.1)/4.6(gl4.1)/5.0 |
|
geometry |
|
用于geometry shader,编译目标自动设为4.0 |
hull |
|
用于tessellation shader,编译目标自动设为4.6 |
domain |
|
同hull |
vertex |
顶点函数名 |
定义顶点函数入口 |
fragment |
片元函数名 |
定义片元函数入口 |
only_renderers |
d3d9/d3d11/opengl/gles/xbox360/p3/flash |
指定渲染平台 |
exclude_renderers |
同only_renderers |
排除指定平台 |
multi_compile_fwdadd_fullshadows |
|
开启ForwardAdd中的阴影效果 |
multi_compile_fwdbase |
|
用于ForwardBase,保证光照衰减等光照变量被正确赋值 |
multi_compile_fwdadd |
|
用于ForwardAdd,保证光照衰减等光照变量被正确获取 |
7.Unity内置函数
函数 |
说明 |
float4 UnityObjectToClipPos(float3 pos) |
将顶点坐标从模型空间转换到裁剪空间 |
float3 UnityObjectToViewPos(float3 pos) |
将顶点坐标从模型空间转换到观察空间 |
TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw) |
根据贴图的tilling和offset值计算uv,需要定义变量“贴图名称_ST”,例:_MainTex_ST |
ComputeScreenPos(float4 pos) |
计算顶点在屏幕空间的位置 |
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(in float3 dir) |
将方向从模型空间转换到世界空间 |
float3 UnityWorldToObjectDir(float3 dir) |
将方向从世界空间转换到模型空间 |
SHADOW_COORDS(i) |
放在FrowardBase渲染路径下顶点函数的输出结构体中,需引用”AutoLight.cginc”,i是可用寄存器索引 用于声明阴影纹理的坐标 |
TRANSFER_SHADOW(o) |
计算结果即为阴影纹理的坐标,o为输出结构体,需放在顶点函数中 |
SHADOW_ATTENUATION(i) |
计算阴影衰减值,需放在片元函数中,i为片元函数的输入结构体,即上式中的o 注意:以上三个函数使用时,需保证顶点函数的输入结构体变量为v,结构体的顶点坐标为vertex,输出结构体中的顶点坐标为pos |
float2 ParallaxOffset (half h, half height, half3 viewDir) |
为视差法线贴图计算UV偏移 |
fixed Luminance (fixed3 c) |
将颜色转换为亮度(灰度) |
fixed3 DecodeLightmap (fixed4 color) |
从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR) |
float4 EncodeFloatRGBA (float v) |
为储存低精度的渲染目标,编码[0..1)范围的浮点数到RGBA颜色 |
float DecodeFloatRGBA (float4 enc) |
解码RGBA颜色到float |
float2 EncodeFloatRG (float v) |
类似EncodeFloatRGBA |
float DecodeFloatRG (float2 enc) |
类似DecodeFloatRGBA |
float2 EncodeViewNormalStereo (float3 n) |
编码视图空间法线到在0到1范围的两个数 |
float3 DecodeViewNormalStereo (float4 enc4) |
从enc4.xy解码视图空间法线 |
8.Unity内置变量
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_MATRIX_MV的逆转置矩阵,可将法线从模型空间转换到观察空间 |
_Object2World |
将顶点/方向从模型空间转换到世界空间,已修改为unity_ObjectToWorld |
_World2Object |
将顶点/方向从世界空间转换到模型空间,已修改为unity_WorldToObject |
_WorldSpaceCameraPos |
当前渲染的相机在世界空间中的位置 |
_ProjectionParams |
x=1(-1),y=near,z=far,w=1+1/far,near和far是近远裁屏幕到相机的距离 |
_ScreenParams |
x=width,y=height,z=1+1/width,w=1+1/height |
_ZBufferParams |
x=1-far/near,y=far/near,z=x/far,w=y/far |
unity_OrthoParams |
x=正交投影相机的宽度,y=正交投影相机的高度,z未定义,w=1(正交相机)/0(透视相机) |
unity_CameraProjection |
该相机的投影矩阵 |
unity_CameraInvProjection |
该相机的投影矩阵的逆矩阵 |
unity_CameraWorldClipPlanes[6] |
该相机的6个裁剪屏幕在世界空间下的等式,存储顺序:左右下上近远 |
UNITY_LIGHTMODEL_AMBIENT |
前向渲染下的环境光信息 |
_LightColor0 |
光源颜色 |
_WorldSpaceLightPos0 |
光源方向 |
_LightMatrix0 |
世界空间到光源空间的变换矩阵 |
unity_4LightPosX0 |
仅用于ForwardBase,前4个非重要光源的世界空间下的x坐标 |
unity_4LightPosY0 |
仅用于ForwardBase,前4个非重要光源的世界空间下的y坐标 |
unity_4LightPosZ0 |
仅用于ForwardBase,前4个非重要光源的世界空间下的z坐标 |
unity_4LightAtten0 |
仅用于ForwardBase,前4个非重要光源的衰减因子 |
unity_LightColor |
数组,仅用于ForwardBase,前4个非重要光源的颜色 |
_Time |
t/20,t,2t,3t) |
_SinTime |
(t/8,t/4,t/2,t) |
_CosTime |
(t/8,t/4,t/2,t) |
unity_DeltaTime |
(dt, 1/dt, smoothDt, 1/smoothDt) |
_CameraDepthTexture |
深度纹理,使用SAMPLE_DEPTH_TEXTURE函数获取深度值,使用Linear01Depth线性化深度值 |
_CameraDepthNormalsTexture |
深度法线纹理,使用DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture,i.uv).xy)获取[-1,1]之间的法线值 |
unity_SpecCube0 |
天空盒贴图 |
unity_SpecCube0_HDR |
用来解码天空盒颜色:DecodeHDR(UNITY_SAMPLE_TEXCUBE(unity_SpecCube0,i.worldRefl),unity_SpecCube0_HDR) |
|
|
9.语义
语义 |
说明 |
VPOS |
屏幕坐标,x=ScreenWidth+0.5,y=ScreenHeight+0.5, z=[0(near),1(far)],w=1(正交投影)/[1/near,1/far](透视投影) |
WPOS |
同VPOS 注:使用这两个语义定义的输入input可得到视口空间坐标:input.xy/_ScreenParams.xy 另一种等价方法:顶点函数中用ComputeScreenPos计算屏幕空间坐标,再在片元函数中用结果srcPos.xy/srcPos.w |
10.宏定义
宏 |
说明 |
UNITY_UV_STARTS_AT_TOP |
判断当前平台是否DirectX,一半配合_MainTex_TexelSize.y(负数说明开启了抗锯齿)进行uv反转 |
USING_DIRECTIONAL_LIGHT |
判断是否使用平行光 |