Unity Shader 常见指令,标签,函数,变量,语义

前言

学习Shader的过程中,经常见到一些不明其意的指令或标签或常量,本文记录下供以后参考,因ShaderLab语言也是不断发展的,而学习中看到的Shader很可能已过时,所以本文记录的内容也可能过时。

正文

一、Properties块中的特殊命令

命令 参数 说明
[Header(test)] 括号内即为头标题的显示文字 不要加引号,不支持中文
[NoScaleOffset]   隐藏贴图的Tilling和Offset选项
[Toggle]   模拟开关,0为假,1为真,同[MaterialToggle]

二、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相似,只是把透明通道分离出来了

二、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 预览形状

三、Pass块中的指令 
1.Name “MYPASSNAME” 
为该Pass命名,用于在其他Shader中通过UsePass命令调用该Pass,即使使用小写字母命名,Unity也会自动转为大写字母,所以UsePass命令中也需写成大写字母 
2.GrabPass { “TextureName”} 
抓取屏幕并生成纹理,TextureName为自定义纹理名称,默认为_GrabTexture

四、Pass块中的Tag标签

标签类型 说明
LightMode Always/ForwardBase/ForwardAdd/Deferred/ShadowCaster/
MotionVectors/PrepassBase/PrepassFinal/Vertex/VertexLMRGBM/VertexLM
详见官方文档
PassFlags OnlyDirectional 仅传送主平行光、环境光和LightProbe的光照数据
RequireOptions SoftVegetation 满足给定条件才渲染该Pass

五、#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,保证光照衰减等光照变量被正确获取

六、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解码视图空间法线

七、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)
   

八、语义

语义 说明
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

九、宏定义

说明
UNITY_UV_STARTS_AT_TOP 判断当前平台是否DirectX,一半配合_MainTex_TexelSize.y(负数说明开启了抗锯齿)进行uv反转
USING_DIRECTIONAL_LIGHT 判断是否使用平行光
http://blog.csdn.net/qq_34469717/article/details/78427241

前言

学习Shader的过程中,经常见到一些不明其意的指令或标签或常量,本文记录下供以后参考,因ShaderLab语言也是不断发展的,而学习中看到的Shader很可能已过时,所以本文记录的内容也可能过时。

正文

一、Properties块中的特殊命令

命令 参数 说明
[Header(test)] 括号内即为头标题的显示文字 不要加引号,不支持中文
[NoScaleOffset]   隐藏贴图的Tilling和Offset选项
[Toggle]   模拟开关,0为假,1为真,同[MaterialToggle]

二、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相似,只是把透明通道分离出来了

二、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 预览形状

三、Pass块中的指令 
1.Name “MYPASSNAME” 
为该Pass命名,用于在其他Shader中通过UsePass命令调用该Pass,即使使用小写字母命名,Unity也会自动转为大写字母,所以UsePass命令中也需写成大写字母 
2.GrabPass { “TextureName”} 
抓取屏幕并生成纹理,TextureName为自定义纹理名称,默认为_GrabTexture

四、Pass块中的Tag标签

标签类型 说明
LightMode Always/ForwardBase/ForwardAdd/Deferred/ShadowCaster/
MotionVectors/PrepassBase/PrepassFinal/Vertex/VertexLMRGBM/VertexLM
详见官方文档
PassFlags OnlyDirectional 仅传送主平行光、环境光和LightProbe的光照数据
RequireOptions SoftVegetation 满足给定条件才渲染该Pass

五、#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,保证光照衰减等光照变量被正确获取

六、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解码视图空间法线

七、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)
   

八、语义

语义 说明
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

九、宏定义

说明
UNITY_UV_STARTS_AT_TOP 判断当前平台是否DirectX,一半配合_MainTex_TexelSize.y(负数说明开启了抗锯齿)进行uv反转
USING_DIRECTIONAL_LIGHT 判断是否使用平行光

猜你喜欢

转载自blog.csdn.net/zhaoguanghui2012/article/details/79601005