ShaderLab-设置渲染状态
渲染状态的语法结构
渲染状态 状态类型
渲染状态是通过 渲染状态关键词+空格+状态类型 决定的
可以存在多个渲染状态 通过空格或空行隔开
ZWrite off剔除方式
设置多边形的剔除方式,有背面剔除、正面剔除、不剔除
剔除,就是不渲染,背面剔除就是背面不渲染,正面剔除就是正面不渲染,不剔除就是都渲染
| 剔除方式 | 说明 |
|---|---|
| Cull Back | 背面剔除(默认) |
| Cull Front | 正面剔除 |
| Cull Off | 不剔除 |
一般情况下,我们需要两面渲染时,会设置为不剔除
深度缓冲
是否写入深度缓冲
深度缓冲(Depth Buffer):
深度缓冲是一个与屏幕像素对应的缓冲区,用于存储每个像素的深度值(距离相机的距离)。
在渲染场景之前,深度缓冲被初始化为最大深度值,表示所有像素都在相机之外。
最后留在深度缓冲中的信息会被渲染
| 是否写入深度缓冲 | 说明 |
|---|---|
| ZWrite On | 写入深度缓冲(默认) |
| ZWrite Off | 不写入深度缓冲 |
深度测试
设置深度测试的对比方式
深度测试的主要目的是确保在渲染时,像素按照正确的深度(距离相机的距离)顺序进行绘制,
从而创建正确的遮挡关系和透视效果
在渲染场景之前,深度缓冲被初始化为最大深度值,表示所有像素都在相机之外。
在渲染过程中,对于每个像素,深度测试会将当前像素的深度值与深度缓冲中对应位置的值进行比较。
一般情况下
- 如果当前像素的深度值小于深度缓冲中的值,说明当前像素在其他物体之前,它会被绘制,并更新深度缓冲。
- 如果当前像素的深度值大于等于深度缓冲中的值,说明当前像素在其他物体之后,它会被丢弃,不会被绘制,并保持深度缓冲不变
| 深度测试方式 | 说明 |
|---|---|
| ZTest Less | 小于当前深度缓冲中的值,就通过测试,写入到深度缓冲中 |
| ZTest Greater | 大于当前深度缓冲中的值,就通过测试,写入到深度缓冲中 |
| ZTest LEqual | 小于等于当前深度缓冲中的值,就通过测试,写入到深度缓冲中(默认) |
| ZTest GEqual | 大于等于当前深度缓冲中的值,就通过测试,写入到深度缓冲中 |
| ZTest Equal | 等于当前深度缓冲中的值,就通过测试,写入到深度缓冲中 |
| ZTest NotEqual | 不等于当前深度缓冲中的值,就通过测试,写入到深度缓冲中 |
| ZTest Always | 始终通过深度测试写入深度缓冲中 |
一般情况下,我们只有在实现一些特殊效果时才会区修改深度测试方式,比如透明物体渲染会修改为Less,描边效果会修改为Greater等
混合方式
设置渲染图像的混合方式(多种颜色叠加混合,比如透明、半透明效果和遮挡的物体进行颜色混合)
| 混合方式 | 说明 |
|---|---|
| Blend One One | 线性减淡 |
| Blend SrcAlpha OneMinusSrcAlpha | 正常透明混合 |
| Blend OneMinusDstColor One | 滤色 |
| Blend DstColor Zero | 正片叠底 |
| Blend DstColor SrcColor | X光片效果 |
| Blend One OneMinusSrcAlpha | 透明度混合 |
不设置的话,默认不会进行混合
一般情况下,我们需要多种颜色叠加渲染时,就需要设置混合方式,具体情况具体处理
其他渲染状态
| 渲染状态 | 说明 |
|---|---|
| LOD | 控制LOD级别,在不同距离下使用不同的渲染方式处理 |
| ColorMask | 设置颜色通道的写入蒙版,默认蒙版为RGBA |
注意
以上这些状态不仅可以在SubShader语句块中声明也可以在Pass渲染通道中声明
如果在SubShader语句块中使用会影响之后的所有渲染通道Pass
如果在Pass语句块中使用只会影响当前Pass渲染通道,不会影响其他的Pass
总结
渲染状态可以影响最终我们看到的渲染效果
剔除方式决定了 模型正面背面是否能够被渲染
深度缓冲和深度测试 决定了景深关系的确定以及透明效果的正确表达等
混合方式 决定了透明半透明颜色的正确表现,以及一些特殊颜色效果的表现