赞
踩
学习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 | 判断是否使用平行光 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。