文章目录
- 1. Queue(渲染队列)
- **常见渲染队列**
- **示例**
- 2. `Blend`(混合模式)
- **常见混合模式**
- **混合因子(SrcFactor 和 DstFactor)**
- **源因子(SrcFactor)**
- **目标因子(DstFactor)**
- **混合模式示例**
- 3. `Cull`(剔除模式)
- **常见剔除模式**
- **剔除模式示例**
- 4. `ColorMask`(颜色通道控制)
- **常见的 `ColorMask` 设置**
- **`ColorMask` 示例**
- 5. `Offset`(深度偏移)
- **总结**
- **`Offset` 示例**
- 6. `ZWrite`(深度写入)
- **常见设置**
- **`ZWrite` 示例**
- 7.`ZTest`(深度测试)
- **常见设置**
- **`ZTest` 示例**
- 8.`Stencil`(模板测试)
- 常见的 `Stencil` 设置
- 常见的模板比较函数(`CompFunc`)
- 常见的模板操作(`PassOp`, `FailOp`, `ZFailOp`)
- `Stencil` 示例
- 9.`Fog`(雾效支持)
- **常见的雾效类型**
- **启用雾效的设置**
1. Queue(渲染队列)
Queue
决定了物体的渲染顺序,数值越小,越先渲染。
常见渲染队列
渲染队列 | 值 | 说明 |
---|---|---|
Background | 1000 | 最早渲染,通常用于天空盒。 |
Geometry | 2000 | 默认的,不透明物体。 |
AlphaTest | 2450 | 透明测试(clip() 剪裁)物体。 |
Transparent | 3000 | 透明物体(需要 ZWrite Off )。 |
Overlay | 4000 | UI、特效,最晚渲染。 |
示例
Tags { "Queue"="Transparent" }
2. Blend
(混合模式)
Blend
控制源颜色和目标颜色的混合方式,常用于透明、特效等材质。源颜色是当前片元颜色,目标颜色是帧缓冲中的颜色。
常见混合模式
源因子(SrcFactor) | 目标因子(DstFactor) | 说明 |
---|---|---|
One | Zero | 直接覆盖(不透明)。 |
SrcAlpha | OneMinusSrcAlpha | 标准透明混合,适用于透明物体。 |
One | One | 叠加效果(加法混合,适用于光效)。 |
SrcAlpha | One | 半透明混合,常用于粒子系统。 |
DstColor | Zero | 乘法混合(适用于阴影、暗角)。 |
混合因子(SrcFactor 和 DstFactor)
源因子(SrcFactor)
One
:源颜色的全部(1)。Zero
:源颜色的零(0)。SrcAlpha
:源颜色的透明度值。OneMinusSrcAlpha
:1减去源颜色的透明度值。DstAlpha
:目标颜色的透明度值。OneMinusDstAlpha
:1减去目标颜色的透明度值。
目标因子(DstFactor)
One
:目标颜色的全部(1)。Zero
:目标颜色的零(0)。SrcAlpha
:源颜色的透明度值。OneMinusSrcAlpha
:1减去源颜色的透明度值。DstAlpha
:目标颜色的透明度值。OneMinusDstAlpha
:1减去目标颜色的透明度值。
混合模式示例
Blend SrcAlpha OneMinusSrcAlpha // 标准透明混合
总结
混合模式是透明和特效渲染的核心,选择合适的混合模式能够优化性能并实现所需效果。
3. Cull
(剔除模式)
Cull
控制是否剔除物体的背面或正面,以提高渲染效率。剔除决定了哪些面会被渲染,哪些面会被忽略。
常见剔除模式
值 | 说明 |
---|---|
Cull Back | 默认,仅渲染 正面,剔除背面。 |
Cull Front | 仅渲染 背面,剔除正面。 |
Cull Off | 不剔除任何面,渲染 双面。 |
剔除模式示例
Cull Off // 双面渲染
总结
Cull
是提升渲染效率的一个重要参数,通常情况下,渲染 正面 面可以减少渲染负担,但有时需要根据效果需求渲染 双面 或 反面。
4. ColorMask
(颜色通道控制)
ColorMask
控制片元输出到颜色缓冲区的颜色通道。可以用来禁用某些颜色通道的写入,常用于一些特殊效果,如只修改某个颜色通道或进行调色等操作。
常见的 ColorMask
设置
值 | 描述 |
---|---|
ColorMask RGB | 仅写入 RGB 颜色通道,不写入 Alpha。 |
ColorMask A | 仅写入 Alpha 颜色通道,不写入 RGB。 |
ColorMask 0 | 不写入任何颜色通道(通常只进行深度或模板测试)。 |
ColorMask RGBA | 默认,写入所有颜色通道(包括 RGB 和 Alpha)。 |
ColorMask
示例
ColorMask RGB // 只写入颜色,不修改 Alpha 通道
总结
ColorMask
允许细粒度地控制哪些颜色信息可以被写入,从而对颜色输出进行灵活的管理,通常用于特效和调色。
5. Offset
(深度偏移)
Offset
用于在渲染时调整片元的深度值,防止深度冲突或“Z-fighting”现象。通过在片元的深度值上添加一个偏移量,可以确保物体的深度顺序正确,尤其是在多个物体在相同的深度值上渲染时。
总结
设置 | 描述 |
---|---|
Offset 0, 0 | 无深度偏移,适用于普通渲染。 |
Offset 1, 1 | 轻微的深度偏移,减少闪烁。 |
Offset -1, -1 | 轻微向前偏移,适用于描边和避免自遮挡。 |
Offset
主要用于处理 Z-fighting 问题,常见于需要确保物体层次分明的场景,如描边、特效等。
Offset
示例
Offset -1, -1 // 适用于描边,确保描边不被自身遮挡
6. ZWrite
(深度写入)
ZWrite
控制是否将片元的深度值写入深度缓冲区。开启深度写入时,片元的深度值会被更新到深度缓冲区,这对于正确处理物体的前后关系至关重要。关闭深度写入时,片元的深度不会被更新,但依然可以进行深度测试,用于一些特殊效果,如透明物体的渲染。
常见设置
值 | 描述 |
---|---|
ZWrite On | 启用深度写入,通常用于不透明物体。 |
ZWrite Off | 禁用深度写入,通常用于透明物体或特效。 |
ZWrite
示例
ZWrite On // 启用深度写入,物体深度会更新
7.ZTest
(深度测试)
ZTest
控制深度测试的方式,决定当前片元是否会被渲染。深度测试比较片元的深度值和深度缓冲中的已有值,以确定该片元是否在当前视图的前面。常见的深度测试有:Less
、Greater
、Equal
等。
常见设置
值 | 描述 |
---|---|
ZTest Less | 仅当片元的深度值小于当前深度缓冲中的值时,才通过深度测试并渲染。 |
ZTest LEqual | 仅当片元的深度值小于或等于当前深度缓冲中的值时,才通过深度测试并渲染。 |
ZTest Greater | 仅当片元的深度值大于当前深度缓冲中的值时,才通过深度测试并渲染。 |
ZTest GEqual | 仅当片元的深度值大于或等于当前深度缓冲中的值时,才通过深度测试并渲染。 |
ZTest Equal | 仅当片元的深度值与当前深度缓冲中的值相等时,才通过深度测试并渲染。 |
ZTest Never | 从不通过深度测试,所有片元都会被丢弃。 |
ZTest Always | 总是通过深度测试,所有片元都会被渲染。 |
ZTest
示例
ZTest LEqual // 允许深度值小于或等于当前深度缓冲的值时通过深度测试
综合示例
ZWrite Off:禁用深度写入,防止遮挡其他物体。
ZTest Always:让此物体无视深度缓冲,始终通过深度测试。
Queue = Overlay:让该对象的渲染顺序在 Transparent 之后,确保最前渲染。
这样就可以让物体一直显示在最上方
8.Stencil
(模板测试)
Stencil
用于控制模板缓冲区的测试和操作,它允许基于某些条件对像素进行选择性渲染。通过模板测试,可以在渲染过程中对不同区域进行掩蔽,或者仅在满足特定条件时渲染物体。这对于复杂的渲染效果,如镜像、轮廓、特殊区域遮罩等非常有用。
常见的 Stencil
设置
操作 | 描述 |
---|---|
Stencil CompFunc | 控制模板测试的条件,决定何时进行模板测试。 |
Stencil PassOp | 控制模板测试通过后的操作。 |
Stencil FailOp | 控制模板测试失败时的操作。 |
Stencil ZFailOp | 控制深度测试失败时的模板操作。 |
常见的模板比较函数(CompFunc
)
值 | 描述 |
---|---|
Always | 总是通过测试。 |
Equal | 仅当当前模板值与给定值相等时通过测试。 |
NotEqual | 仅当当前模板值与给定值不相等时通过测试。 |
Less | 仅当当前模板值小于给定值时通过测试。 |
LessEqual | 仅当当前模板值小于或等于给定值时通过测试。 |
Greater | 仅当当前模板值大于给定值时通过测试。 |
GreaterEqual | 仅当当前模板值大于或等于给定值时通过测试。 |
Never | 永远不通过模板测试。 |
常见的模板操作(PassOp
, FailOp
, ZFailOp
)
值 | 描述 |
---|---|
Keep | 保持模板值不变。 |
Zero | 将模板值设置为 0。 |
Replace | 用新值替换模板值。 |
Increment | 增加模板值。 |
Decrement | 减少模板值。 |
Invert | 反转模板值。 |
Stencil
示例
Stencil {
CompFunc Always // 始终通过模板测试
PassOp Replace // 测试通过时替换模板值
FailOp Keep // 测试失败时保持当前模板值
ZFailOp Keep // 深度测试失败时保持模板值
}
Stencil 逻辑可以配合 UI 做高级遮罩。
9.Fog
(雾效支持)
Fog
是一种视觉效果,用于模拟远处物体被雾气遮挡的效果,使得场景看起来更有深度。雾效通常用于大规模场景中,帮助模拟环境中的大气散射效应,增加真实感,或者创造某种氛围。Unity 支持在材质中启用雾效,通过着色器中的 Fog
设置来控制雾的外观。
常见的雾效类型
-
线性雾(Linear Fog)
FOG_LINEAR
根据物体与相机的距离,逐渐增加雾的强度,近处较清晰,远处逐渐被雾气遮挡。 -
指数雾(Exponential Fog)
FOG_EXP
雾气随着距离的增加而指数增长,距离越远,雾气越浓,通常用于模拟更加浓烈的雾霾效果。 -
指数平方雾(Exponential Squared Fog)
FOG_EXP2
与指数雾相似,但雾气的增长更为快速,适用于极端的雾霾环境。
启用雾效的设置
在 Shader 中启用雾效,通常使用 Fog
关键字和雾类型相关的设置。
#pragma multi_compile_fog // 启用雾效相关的编译