Unity渲染管线基础整理
渲染管线
管线流程图
Unity Shader中的Tags
Queue:
Tag | value |
---|---|
Background | 1000 |
Geometry | 2000 |
AlphaTest | 2450 |
Transparent | 3000 |
Overlay | 4000 |
相同Queue的物体,unity会根据物体与摄像机的距离来决定渲染顺序
RenderType:
- Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
- Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
- TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
- Background: Skybox shaders. 天空盒着色器。
- Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
- TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
- TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
- TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
- Grass: terrain engine grass. 地形引擎中的草。
- GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。
IgnoreProjector
值为”true”时,表示不接受Projector组件的投影
ForceNoShadowCasting
值为”true”时,表示不接受阴影。
LightMode
对应PlayerSetting的或Camera中设置的RenderPath使用
Deferred Lighting 会准确如实地渲染光照和阴影,移动设备是不支持的。
Forward Rendering 是一种基于shader的渲染路径。它支持每个像素的光照及平行光(directional light)的实时阴影
Vertex Lit 最低光照精确度的渲染路径,不支持实时阴影
- ForwardBase 只对1个有效灯光执行一次
- ForwardAdd 对除了ForwardBase用的那个灯光外的所有有效灯光都执行1次,所以会被执行多次
- Always 永远都渲染,但不处理光照
- ShadowCaster 渲染产生阴影的物体
- ShadowCollector 收集物体阴影到屏幕坐标Buff里
深度测试和深度缓冲区
ZBuff:深度缓冲
深度缓冲区
ZTest:深度测试
ZTest 可取值为:
- Greater
- GEqual
- Less
- LEqual
- Equal
- NotEqual
- Always
- Never
- Off
默认是 LEqual,ZTest Off 等同于 ZTest Always。
ZWrite:深度写入
ZWrite 可取值为:On , Off,
默认是 On。
Alpha测试
AlphaTest
1.顶点或片元
clip (o.Alpha - _Cutoff);
2.固定管线
AlphaTest comparison AlphaValue
- Greater
- GEqual
- Less
- LEqual
- Equal
- NotEqual
- Always
- Never
混合
Blend SrcAlpha OneMinusSrcAlpha
alpha blendingBlend One OneMinusSrcAlpha
premultiplied alpha blendingBlend One One
additiveBlend SrcAlpha One
additive blendingBlend OneMinusDstColor One
soft additiveBlend DstColor Zero
multiplicativeBlend DstColor SrcColor
2x multiplicativeBlend Zero SrcAlpha
multiplicative blending for attenuation by the fragment’s alpha
片段着色器中计算出来的颜色称之为 “源颜色”,帧缓存中对应的像素已经存在的颜色叫做“目标颜色”
混合公式
float4 result = SrcFactor * fragment_output + DstFactor * pixel_color;
Zero
0One
1SrcColor
源颜色SrcAlpha
源alphaDstColor
目标颜色DstAlpha
目标AlphaOneMinusSrcColor
(1-源颜色)OneMinusSrcAlpha
(1-源Alpha)OneMinusDstColor
(1-目标颜色)OneMinusDstAlpha
(1-目标Alpha)
模版测试和模版缓冲区
在渲染的过程中,可以用模版缓冲区中的一个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前。如果模板测试通过,则相应的像素点更新,否则不更新
stencil{
Ref referenceValue //参考值
ReadMask readMask
WriteMask writeMask
Comp comparisonFunction
Pass stencilOperation
Fail stencilOperation
ZFail stencilOperation
}
stencil完整语法
测试公式
if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask)
通过像素
else
抛弃像素
- comparisonFunction
comparisonFunction | 通过测试条件 |
---|---|
Greater | buffvalue > referenceValue |
GEqual | buffvalue >= referenceValue |
Less | buffvalue < referenceValue |
LEqual | buffvalue <= referenceValue |
Equal | buffvalue == referenceValue |
NotEqual | buffvalue != referenceValue |
Always | 总是能 |
Never | 总不能 |
* stencilOperation
stencilOperation | 功能 |
---|---|
Keep | buffvalue 不变 |
Zero | buffvalue 值变为0 |
Replace | buffvalue = referenceValue |
IncrSat | buffvalue ++ 超过255不溢出 |
DecrSat | buffvalue – 超过0不溢出 |
Invert | buffvalue 按位取反 |
IncrWrap | buffvalue ++ 超过255溢出为0 |
DecrWrap | buffvalue – 超过0溢出为255 |