Unity中的所有Shader都是使用ShaderLab的声明性语言编写的。而ShaderLab是Unity对CG/HLSL/GLSL的一层封装,重点支持的是Cg着色器语言。
目前面向GPU的编程有三种高级图像语言:HLSL语言,GLSL语言,Cg语言。
HLSL语言:High Level Shading Language,由Microsoft公司提供,通过Direct3D图形软件库来编写的着色器语言。
GLSL语言:OpenGL Shading Language,由OpenGL安委会提供,在OpenGL中进行着色器编程的语言。
Cg语言:C for Graphics,由NVIDIA公司和Microsoft公司合作提供,有自己的一套关键字和函数库,独立于三维编程接口,在Direct3D和OpenGL上都可工作。
语法格式:
Shader "name"
{
[Properties]
SubShaders
[FallBack]
[CustomEditor]
}
tips:在[和]内的内容可以不实现,例如[properties]在实际书写shader过程中,可能不会用到属性
Shader:
Shader 是着色器文件的根命令,每个文件必须定义一个(且只有一个)。“name”定义了shader的名称以及在选择列表中的路径。
Properties:
Properties定义了在材质属性面板中可进行设置以及修改的参数列表,语法格式为:
Properties
{
Name("Show Name",Type) = default value
...
}
ShaderLab 提供的Properties类型有:
类型 | 描述 | 语法 |
---|---|---|
Range(min,max) | 在(min,max)范围内的浮点数 | name(“display name”,Range(min,max)) =number |
Float | 浮点数 | name(“display name”,Float) =number |
Int | 整数 | name(“display name”,Int) =number |
Color | 颜色(RGBA,显示颜色选择器,可以根据需要调整颜色空间) | name (“display name”, Color) = (number,number,number,number) |
Vector | 矢量(显示为四个数字字段) | name (“display name”, Vector) = (number,number,number,number) |
2D | 2D纹理(如果默认没有纹理可以设置“defaulttexture”为“”) | name (“display name”, 2D) = “defaulttexture” {} |
Cube | 立方体贴图(如果默认没有纹理可以设置“defaulttexture”为“”) | name (“display name”, Cube) = “defaulttexture” {} |
3D | 3D纹理(如果默认没有纹理可以设置“defaulttexture”为“”) | name (“display name”, 3D) = “defaulttexture” {} |
注意:
着色器内的每个属性都由名称进行引用,通常 使用下划线(_)作为起始字符。
"display name" 是指在材质属性面板中显示的名字。
对于2D纹理,默认值为空字符串("")或内置纹理,内置纹理包括:“white”(1,1,1,1)、"black"(0,0,0,0)、"gray"(0.5,0.5,0.5,0.5)、"bump"(0.5,0.5,1,0.5)、"red"(1,0,0,0)。
非2D纹理,默认值使用空字符串(“”),当未指定纹理时,会使用gray(0.5,0.5,0.5,0.5)纹理
在着色器的固定函数中,可以使用[name]的方式,访问属性值
Properties中的数据参数会被序列化为材质的数据,而在subshader中定义的参数值,如果不是Properties的一部分,是不会进行保存的,但是可以使用代码进行设置(Material.SetFloat)
在Properties中定义的属性前,可以指定其他可选属性
Properties的可选属性:
属性 | 描述 |
---|---|
[HideInInspector | 不在材质属性面板中显示该属性 |
[NoScaleOffset] | 在材质显示面板中不会显示此纹理的平铺/偏移字段 |
[Normal] | 表示纹理属性需要法线贴图 |
[HDR] | 表示纹理属性需要高动态范围(HDR)纹理 |
[Gamma] | 将float/vector属性指定为sRGB值,可根据需要进行颜色空间转换 |
[PerRendererData] | 会将该物体的其他材质上的纹理加载进来 |
[Toggle] | 在面板上显示一个可勾选项 |
SubShader:
Untiy中的每个着色器都包含一个子着色器列表,当Unity需要显示一个网格时,它获取需要使用的着色器,并提取第一个能运行在当前用户显卡上的子着色器。
语法格式:
SubShader
{
[Tags]
[CommonState]
Passdef
[Passdef...]
}
Tips:中括号([])表示可选
SubShader Tags:
自着色器使用标签来告诉渲染引擎何时以及如何进行对象渲染。
语法格式:
Tags{"TagName1" = "Value1" "TagName2"="Value2"...}
标签基本上都是键值对,标签的数量是没有任何限制的。
SubShader的标签用来确定渲染顺序以及其他参数。
标签分为Unity识别标签以及自定义标签,自定义标签可以使用Material.GetTag函数进行查询,Unity识别标签必须位于SubShader内部,而不是Pass内部。
Unity识别标签:
标签 | 描述 |
---|---|
Queue | 确定对象的绘制顺序,决定其对象属于哪个渲染队列,这样任何透明着色器都可以确保他们在所有不透明对象之后绘制,每个渲染队列由整数索引表示,Unity中有五个预定义的渲染队列: |
Background:渲染队列:1000,此渲染队列在其他任何队列之前绘制,通常用于天空和或背景等 | |
Geometry:渲染队列:2000,在不指定队列的情况下,为默认渲染队列。用于大多数对象,不透明的几何对象使用此队列 | |
AlphaTest:渲染队列:2450,alpha测试几何对象使用此队列,他是一个独立队列,Geometry因为在绘制完所有实体之后渲染经过alpha测试的对象会更有效 | |
Transparent:渲染队列:3000,此渲染队列在Geometry和AlphaTest之后进行渲染,并按照从后到前的顺序渲染,任何alpha混合(即不写入深度缓冲区的着色器)都应该在此队列进行渲染(如:玻璃,例子) | |
Overlay:渲染队列:4000,此队列用于叠加效果,最后渲染的对象应放在此队列进行渲染(如镜头光晕) | |
在Unity中,高达2500(Geomery+500)的队列,被认为是不透明的,并且会优化对象的绘制顺序以获得最佳性能。而更高的渲染队列被认为是透明的,并按距离对对象进行排序,从最远的开始进行渲染。SkyBox在所有的不透明和所有透明对象之间进行绘制 |
|
RenderType | 将着色器分类为若干定义组,例如,Opaque(不透明)着色器,Alpha-test着色器等。可以在使用替换着色器进行渲染时,或者在某些情况下生成相机的深度纹理进行使用,内置的RenderType有: |
Opaque:不透明着色器,如Normal,Self illuminated,Reflective,terrain着色器等 | |
Transparent:大多数半透明着色器,如Transparent,Particle,Font,terrain additive pass着色器等 | |
TransparentCutout:蒙版透明着色器,如Transparent Cutout two pass vegetation着色器 | |
Background:Skybox着色器 | |
Overlay:GUITexture,Halo,Flare着色器 | |
TreeOpaque:树皮 | |
TreeTransparentCutout:树叶 | |
TreeBillboard:广告牌树 | |
Grass:草 | |
GrassBillboard:广告牌草 | |
DisableBatching | 在使用批处理时,某些着色器会不起做(主要是进行对象空间顶点边形的着色器),这是因为批处理将所有几何体转换为世界空间,因此对象空间会丢失,DisableBatching用来表示该着色器是否支持批处理。 |
true:始终禁止此着色器的批处理 | |
false:不禁用批处理,默认值 | |
LODFading:当LOD fading 激活时,禁用批处理,主要用于树 | |
ForceNoShadowCasting | 为true时,那么使用此着色器的对象将永远不会投射阴影。例如,当使用着色器特换功能时 |
IgnoreProjector | 如果为true时,那么使用此着色器的对象不会受到投影(Projectors)影响 |
CanUserSpriteAtlas | 如果为false时,将着色器用于Sprite时,将会导致将他们打入atlases时无法工作 |
PreviewType | 设置材质属性面板中预览窗口显示什么模型,默认为球体 |
Passdef:
SubShader可以拥有多个Pass,并且可以设置所有通过共同拥有的任何状态(语法中的[CommonState]部分)以及Pass特有的标签。
当Unity选择要渲染的子着色器时,会为每个定义的Pass传递一次对象(可能多次,根据光的交互来确定)。
Unity 提供了三种Pass,即Pass、UsePass、和GrabPass。
每个Pass都可以使用在SubShader中定义的任何语句,也就是说,可以将多个Pass使用的公共方法或属性定义在SubShader中。
Pass:
每个Pass块会导致对象渲染一次,也就是说,如果有两个pass都执行了,那么这个物体会被渲染两次。
语法格式:
Pass
{
[Name and Tags]
[RenderSetup]
}
[Name and Tags]:Pass可以定义name和任意数量的Tags,用于将pass的意图传递给渲染引擎。
Pass Tag:
语法:
Tags{"TagName1" ="Value1" "TagName2" = "Value2"}
Pass 内部的标签用于控制此通道在照明管道中的角色(环境光,顶点照明,像素点亮等)以及其他一些选项,注意Pass Tag必须位于Pass块内,与SubShader Tags 区分开。
Pass Tags 有以下内容:
标签 | 描述 |
---|---|
LightMode | 定义了Pass在照明管道中的角色,LightMode标记值可以能为: |
Always:始终渲染,没有灯光 | |
ForwardBase:用于正向渲染,环境光,主方向光,顶点/SH灯和光照贴图 | |
ForwardAdd:用于向前渲染,应用添加的每像素光,每个光通过一次 | |
Deferred:用于延迟渲染,g-buffer渲染。 | |
ShadowCaster:将对象深度渲染到阴影贴图或深度纹理中。 | |
MotionVectors:用于计算每个对象的运动矢量。 | |
PrepassBase:用于旧版延迟光照,渲染法线和镜面反射指数。 | |
PrepassFinal:用于传统延迟光照,通过组合纹理,光照和发射来渲染最终颜色。 | |
Vertex:当对象未进行光照贴图时,用于传统的顶点渲染,应用所有顶点灯 | |
VertexLMRGBM:在,在当lighttmap是在RGBM编码平台上时,对象进行光照贴图时用于旧版VertexLit渲染(PC和控制台) | |
VertexLM:在光照贴图采用双LDR编码平台上时,对象进行光照贴图时用于旧版Vertex Lit渲染 | |
PassFlags | 渲染管道传递什么数据给Pass,可以使用这个标签来进行控制,值未空格分隔的标志名称,目前支持的标志有: |
OnlyDirectional:在ForwardBase传递类型中使用时,只有主方向和ambient/lightprobe数据才会传递到着色器,意味着非重要关源的数据不会传递到当点光或球面谐波着色器变量中 | |
RequireOptions | 只有在满足某些外部条件时,才会被渲染,值时一个空格分隔选项的字符串,目前有: |
ShoftVegetation:在Quality Settings中设置Soft Vegetation 时才会渲染 |
[RenderSetup]:
设置图形硬件的各种状态,例如,是否打开Alpha混合,是否使用深度测试等。
剔除和深度测试:
剔除时一种优化操作,它会将观察者看不到的面不进行渲染。
深度测试确保仅渲染在场景中绘制最近的面。
Cull:设置多边形剔除模式,用于控制多边形的哪一边应该被剔除。
语法 | Cull Back|Front|Off |
---|---|
Back | 背面剔除(默认) |
Front | 正面剔除 |
OFF | 禁用剔除,绘制所有面 |
ZTEST:设置深度缓冲测试模式,就是如何进行深度测试,默认为LEqual。
语法 | ZTest Less|Greater|LEqual|GEqual|Equal|NotEqual|Always |
---|---|
Less | 小于 |
Greater | 大于 |
LEqual | 小于等于 |
GEqual | 大于等于 |
Equal | 等于 |
NotEqual | 不等于 |
Always | 总是写入 |
ZWrite:设置深度缓冲区写入模式,用于控制是否将此对象的像素写入深度缓冲区,如果绘制不透明对象,应该设置为On,如果绘制半透明效果,应该设置为Off。
语法 | ZWrite On|Off |
---|---|
On | 开启深度写入(默认) |
Off | 关闭深度写入 |
Offset:设置Z缓冲深度偏移。
语法 | Offset Factor,Units |
---|---|
Factor | 因子,相对于多边形的x、y缩放最大z斜率 |
Units | 单位,缩放最小可分辨深度缓冲值 |
每一个Fragment的深度值都会增加 offset=(mfactor)+(runits)的偏移量,m是多边形的深度斜率中最大值,r是能产生在窗口坐标系的深度值中可分辨的差异最小值,一个大于0的offset会把模型往后推,小于0的offset会把模型拉近。资料 |
深度:该像素点在3D世界中距离摄像机的距离,离摄像机越远值(Z值)越大。
深度缓存:存储者准备要绘制在屏幕上的像素点的深度值。开启深度写入后,在绘制每个像素之前,会把该像素的深度值和深度缓存中的值进行比较,如果新像素深度值<=(根据设置的ZTest模式进行比较,默认为<=)深度缓存深度值,则新像素会替换原像素,否则会丢弃颜色值和深度(未通过深度测试)。
深度测试:默认就是将要绘制的新像素与深度缓冲区中对应位置的z值根据设置的模式进行比较,默认为<=,结果为true,则替换原有深度,并在颜色缓冲中替换颜色,否则丢弃该像素的颜色和深度。
Blending(混合):
在所有着色器执行完并且所有纹理都已应用之后,像素将被写入到屏幕,Blend命令会控制他们如何与已存在内容进行组合
语法 | |
---|---|
Blend Off | 关闭混合(默认) |
Blend SrcFactor DstFactor | 配置并启用混合,生成的颜色乘以ScrFactor,屏幕上已有的颜色乘以DstFactor,两者相加 |
Blend SrcFactor DstFactor,ScrFactorA DstFactorA | 与上面相同,但使用不同的因子来混合alpha通道 |
BlendOp Op | 不将混合颜色添加到一起,对它们执行不同的操作 |
BlendOp OpColor,OpAlpha | 与上面相同,但对颜色(RGB)和aplha(A)使用不同的混合操作 |
在使用多渲染目标(MRT)进行渲染时,上面的语法为所有的渲染目标设置相同的混合模式,下面的语法可以为各个渲染目标设置不同的混合模式。其中N为渲染目标索引(0-7)。此功能适用于大多数现代API/GPU(DX11/12,GLCORE,METAL,PS4)
语法 |
---|
Blend N SrcFactor DstFactor |
Blend N SrcFactor DstFactor,ScrFactorA DstFactorA |
BlendOp N Op |
BlendOp N OpColor,OpAlpha |
混合操作 | |
---|---|
Add | 原+目标 |
Sub | 原-目标 |
RevSub | 目标-原 |
Min | 从原和目标中选择最小的 |
Max | 从原和目标中选择最大的 |
LogicalClear | 逻辑运算:清除(0) 仅限DX11.1 |
LogicalSet | 逻辑运算:设置(1) 仅限DX11.1 |
LogicalCopy | 逻辑运算:复制 仅限DX11.1 |
LogicalCopyInverted | 逻辑运算:复制并反转(!s) 仅限DX11.1 |
LogicalNoop | 逻辑运算:Noop(d) 仅限DX11.1 |
Logicalnvert | 逻辑运算:反转(!d) 仅限DX11.1 |
LogicalAnd | 逻辑运算:和(s&d) 仅限DX11.1 |
LogicalNand | 逻辑运算:Nand(s&d) 仅限DX11.1 |
LogicalOr | 逻辑运算:或(s竖d) 仅限DX11.1 |
LogicalNor | 逻辑运算:Nor(sd)仅限DX11.1 |
LogicalXor | 逻辑运算:Xor(s^d) 仅限DX11.1 |
LogicalEquiv | 逻辑运算:等价!(s^D) 仅限DX11.1 仅限DX11.1 |
LogicalAndReverse | 逻辑运算:反转和(s&!d) 仅限DX11.1 |
LogicalAndInverted | 逻辑运算:反转和(! s&d) 仅限DX11.1 |
LogicalOrReverse | 逻辑运算:反转或(s竖!d) 仅限DX11.1 |
LogicalOrInverted | 逻辑运算:反转或(! s竖d) 仅限DX11.1 |
竖 代表 | |
Blend Factors(混合因素)
以下所有属性对Blend命令中的SrcFactor和DstFactor都有效,Source指的时计算除的颜色,Destination是屏幕上已有的颜色。如果BlendOp使用逻辑运算,则忽略混合因子
One | 乘以颜色值(1.0,1.0,1.0,1.0) |
Zero | 乘以颜色值(0,0,0,0) |
SrcColor | 乘以Source颜色值 |
SrcAlpha | 乘以Source的alpha值 |
DstColro | 乘以Destination颜色值 |
DstAlpha | 乘以Destination的alpha值 |
OneMinusSrcColor | 乘以(1-Source颜色的值) |
OneMinusSrcAlpha | 乘以(1-Source的alpha值) |
OneMinusDstColor | 乘以(1-Destination的颜色值) |
OneMinusDstAlpha | 乘以(1-Destination的alpha值) |
常见的混合类型:
传统透明度 | Blend SrcAlpha OneMinusSrcAlpha |
预乘透明度 | Blend One OneMinusSrcAlpha |
叠加 | Blend One One |
软叠加 | Blend OneMinusDstColor One |
正片叠底 | Blend DstColor Zero |
Blend DstColor SrcColor |
AlphaToMask On:打开alpha-to-coverage,在使用MSAA(多重采样反走样)时,alpha-to-coverage会根据像素Shader结果alpha值修改多重采样覆盖率。通常用于比常规alpah-test更小的轮廓,例如,对植被和其他经过alpha测试的着色器非常有用。
Stencil Test(模板测试):
模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值(通常是每像素8位整数),通过一些比较来改变当前像素区域模板缓冲的值,从而改变深度关系。
语法格式:
Stencil
{
[Command]
[Command...]
}
Command 内容包含:
Ref:参考值,当参数允许赋值时,会把参考值赋给当前像素。
语法:
Ref value
ReadMask:8位掩码,取值范围0-255,对当前参考值和已有值进行mask操作,默认值255,一般不用。
语法:
ReadMask readMask
WriteMask:8位掩码,取值0-255,写入Mask时使用,与其他写掩码一样,它指定模板缓冲区的哪些位将受写入影响(0不会影响任何位,也不会写入0),默认值255.
语法:
WriteMask writeMask
Comp:比较方法,那Ref值与当前像素缓存上的值进行比较,默认值always
语法 | Comp Greater|GEqual|Less|LEqual|Equal|NotEqual|Aways|Never |
---|---|
Greater | 大于 |
GEqual | 大于等于 |
Less | 小于 |
LEqual | 小于等于 |
Equal | 等于 |
NotEqual | 不等于 |
Always | 永远通过 |
Never | 永远不通过 |
Pass:当模板测试与深度测试都通过时,如何进行处理
Fail:当模板测试与深度测试都失败时,如何进行处理
ZFail:当模板测试通过而深度测试失败时,如何进行处理
Pass,Fail,ZFail 都属于Stencil操作,参数一样。
语法:Pass | Pass stencilOperation |
---|
语法:Fail | Fail stencilOperation |
---|
语法:ZFail | ZFail stencilOperation |
---|---|
Keep | 保持(不把参考值赋值上去,直接不管) |
Zero | 归零 |
Replace | 替换(参考值替代原有值) |
IncrSat | 值增加1,如果到255,就不再增加 |
DecrSat | 值减少1,如果到0,就不再减 |
Invert | 反转所有位,如1就会变成254 |
IncrWrap | 值增加1,如果到255,则变为0 |
DecrWrap | 值减少1,如果到0,则变为255 |
Comp,Pass,Fail和ZFail将用于前面的几何体,除非指定了Cull Front,这种情况下,它时面向后面的几何体,可以通过定义CompFront,PassFront,
FailFront,ZFailFront以及CompBack,PassBack,FailBack,ZFailBack来明确指定双面模板状态。
在延迟渲染路径中,模板功能在某种程度上受到限制,因为在基本传递和光照传递期间,模板缓冲区在用于其他目的,在这两个阶段中,着色器中定义的模块状
态将本忽略,并且仅在最终传递期间考虑。因此,不可能基于模板测试来屏蔽这些对象,但他们仍然可以修改缓冲区内容,以边在后续帧中呈现的对象使用。在
延迟路径之后的向前渲染路径中渲染的对象将再次正常设置其模板状态。
延迟渲染路径使用模板缓冲区的三个最高为,最多四个最高为,取决于场景中使用的光淹模层数,可以使用WriteMask Clear 或使用
Camera.clearStencilAfterLightingPass情节模板缓冲区(光照通过后)。
Name(Pass名称):
设置当前Pass的名称,以便UsePass命令引用。注意,在Unity内部会将name变为大写
语法:
Name “PassName”
Legacy Lighting(遗留照明):
顶点光照是为每个顶点计算的标准Direct3D/OpenGL光照模型,使用Lighting On 指令可以打开,受Material,ColorMaterial和SeparateSpecular命令的影响。
在顶点/片段着色器中,Materal和Lighting 命令是不起作用的。
任何几何体渲染的第一个效果就是"顶点着色和光照",在顶点级别上进行运算,并计算在应用纹理之前使用的基色。
Color:将对象设置为纯色。可以是括号中的4个RGBA颜色值,或方括号中的颜色属性名称。
语法:
Color (r,g,b,a)|[att name]
Linght:开启或关闭照明,如果关闭了照明会直接从Color中获取颜色。
语法:
LightingOn|Off
Material:定义对象的材质属性。如果未开启Lighting,则此模块是不生效的(Lighting On 此模块才会其作用)。
语法: | Material {Material Block} |
---|---|
Diffuse | 漫反射颜色,也是对象的基本色 |
Ambient | 环境色,对象在Lighting Window中设置的环境光照射时所具有的颜色 |
Specular | 高光颜色 |
Shininess | 高管锐度,介于0-1之间,达到1时,会得到一个微小的亮点 |
Emission | 自发颜色 |
计算公式 | Ambient*Ambient Intensity+(Light Color * Diffuse + Light Color * Specular)+emission |
Ambient Intensity 值获取的是在Lighting Window中设置的值 |
SeparateSpecular:开启后,光高不受纹理影响,仅在Lighting On时生效。
语法:
SeparateSpecular On|Off
ColorMaterial:使用顶点颜色体态设置中的颜色
语法 | ColorMaterial AmbientAndDiffuse|Emission |
---|---|
AmbientAndDiffuse | 替换漫反射值和环境光 |
Emission | 替换自发光 |
Legacy Texture(遗留纹理):
在计算顶点灯光之后,就会应用纹理。
在使用顶点/片段着色器时,SetTexture 命令无法使用
在Pass中,可以使用多个SetTexture命令,所有的命令将按照顺序的方式进行应用,就像图层一样。注意,SetTexture命令必须放在Pass的末尾处。
语法 | SetTexture [AttributeName] {Texture Block} |
---|---|
AttributeName | 必须时定义的纹理属性名称 |
Texture Block | 控制纹理的应用方式,主要有combine和constantcolor两个命令 |
combine | 合并控制 |
combine src1*src2:src1与src2相乘,结果比任以输入更暗 | |
combine src1+src2:src1加上src2,结果更亮 | |
combine src1 - src2:src1减去src2 | |
combine src1 lerp(src2) src3:使用src2的alpha在src3和src1之间进行插值,当alpha为1时使用src1,当alpha为0时,使用src3 | |
combine src1*src2+src3:将src1和src2的alpha分量相乘,然后添加src3 | |
所有的src属性都可以是previous,constant,primary或texutre之一,Previous:前一个SetTexture的结果,Primary:光照计算的结果或绑定的顶点颜色,texture:SetTexture中指定的纹理,Constant:使用ConstantColor指定的颜色 | |
ConstantColor | 定义在combine中使用的常量颜色,可以设置4位数得颜色(例如:(1,1,1,1))或者方括号内得颜色属性名(例如:[name]) |
如果SeparateSpecular镜面颜色的计算将在组合后进行计算,同时也是VertexLit着色的默认行为。
执行顶点/片段着色器的现代显卡(shader model2.0或移动端OpenGL ES 2.0),通常支持所有的SetTexutre模式和至少4个纹理阶段(其中许多支持8个),如果是非常就得硬件(2003年之前PC,或移动设备使用iphone3GS之前),可能只支持两个。
Legacy Alpha(遗留 透明度测试):
alpha测试是拒绝像素写入屏幕得最后机会。在计算出最终输出颜色之后,颜色可以选择性得将alpha值与固定值进行比较,如果测试失败,则不会将像素写入显示器(仅渲染alpha值在特定范围内得像素)。
使用顶点/片段着色器时,AlphaTest命令无效,大多数平台可以使用HLSL clip()函数完成alpha测试。
语法:
AlphaTest Off
或
语法 | AlphaTest comparison AlphaValue |
---|---|
AlphaValue | 测试值,可以是0-1得浮点数,或float或range属性的变量应用(例如:[name]) |
comparison | 比较符,与alphavalue进行比较,通过则渲染,否则不渲染 |
Greater:大于 | |
GEqual:大于等于 | |
Less:小于 | |
LEqual:小于等于 | |
Equal:等于 | |
NotEqual:不等于 | |
Always:总是渲染,等价于AlphaTest Off | |
Never:不渲染任何像素 |
Legacy Fog(遗留 雾):
根据与相机的距离,雾化将产生的像素的颜色向下混合为恒定的颜色。雾化不会修改混合像素的alpha值,只会修改RGB值。
语法 | Fog {Fog Commands} |
---|---|
Commands | 包含的指令如下: |
Mode | Mode Off|Global|Linear|Exp|Exp2 |
定义雾的模式,默认为全局,根据“渲染设置”中是否启用了雾,会将其转换为“Off”或“Exp2” | |
Color | Color ColorValue |
设置雾的颜色 | |
Density | Density FloatValue |
设置雾的密度(指数) | |
Range | FloatValue,FloatValue |
设置线性雾的近距离和远距离 |
默认雾的设置基于Lighting Window中的设置。
如果使用顶点/片段着色器,Fog 指令依然有作用,当平台上没有雾功能,Untiy将在运行时修补着色器以支持所有请求的雾模式。
Legacy BingdChannels(遗留 绑定通道):
该指令可以指定顶点数据如何映射到图形硬件。默认情况下,Unity会自动计算绑定,但是在某些情况下,需要使用自定义绑定。
在顶点/片段着色器中无法使用,由顶点/片段着色器输入来进行控制。
语法 | BindChannels{Bind “source”,target} |
---|---|
source | 可以是以下之一: |
Vertex:顶点位置 | |
Normal:顶点法线 | |
Tangent:顶点切线 | |
Texcoord:主UV坐标 | |
Texcoord1:辅UV坐标 | |
Color:顶点颜色 | |
Target | 可以是以下之一: |
Vertex:顶点位置 | |
Normal:顶点法线 | |
Tangent:顶点切线 | |
Texcoord0,Texcoord1,…:相应纹理阶段的纹理坐标 | |
Texcoord:所有纹理阶段的纹理坐标 | |
Color:顶点颜色 |
Untiy对那些source可以映射到target做了一些限制,source和目标必须匹配。比如Bind “Vertex”,vertex或Bind“texcoord”,texcoord
UsePass:
使用UsePass可以使用现由的Pass通道,以减少代码重复。
语法:
UsePass "Path/NAME"
注意:Pass名称必须是大写。
GrabPass:
GrabPass 是一种特殊的渲染通道,它可以抓取屏幕中的对象绘制到纹理当中去,以便执行更高级的图像效果。
语法:
语法1 | GrabPass{} |
---|---|
将当前屏幕内容抓取到纹理中,而可以通过_GrabTexture名称进一步传递纹理。注意:这种形式的抓取过程将为每个使用它的对象执行屏幕抓取操作 |
语法2 | GrabPass{“_TextureName”} |
---|---|
将当前屏幕内容抓取到纹理中,但对于使用给定纹理名称的第一对象仅执行一次。当场景中有多个对象使用GrabPass时,这是一种更高效的方法。可使用“_TextureName”获取纹理 |
GrabPass可以使用Name和Tags命令。
FallBack:
如果没有任何SubShader可以在当前硬件上运行,会尝试使用指定的默认着色器进行渲染。
语法:
Fallback "name"
CustomEditor:
可以为着色器定义编辑显示。Unity将寻找一个使用此名称扩展的ShaderGUI类。
语法:
CustomEditor "name"
Category指令:
可以将任何命令进行逻辑分组,形成一个fen类(Category),例如,一个着色器可能有多个子着色器,并且每个着色器都需要关闭雾、设置Blend等,可使用Category:
Shader "example"
{
Fog{Mode Off}
Blend One One
SubShader
{
//...
}
SubShader
{
//...
}
//...
}