参考
may佬《技术美术百人计划》
冯乐乐《Unity Shader入门精要》
Unity Shader - 模板简单测试 - 实现镂空/遮罩、描边
图形3.1 深度与模板测试
模板测试
定义
渲染管线
-
模板测试是逐片元操作中的一部分
-
片元经过逐片元操作的各种测试之后被输出到帧缓冲区,最后输出到屏幕上
-
逐片元操作阶段高度可配置,不可编程
- Pixel Ownership Test:控制对当前屏幕的使用权限,如在unity中只对game窗口和scene窗口中的像素有权限,其他的窗口部分会被剔除掉
- Scissor Test:裁剪测试,自己定义在窗口中渲染哪些部分,默认是全部渲染
- Alpha Test:透明度测试,设定透明度阈值,大于该阈值的片元通过测试,只能实现不透明效果和全透明效果
- Stencil Test:模板测试
- Depth Test:深度测试
- Blending :透明度混合,在这里来实现半透明效果
逻辑
通过一定条件来判断对该片元或片元属性执行抛弃操作还是保留操作
概念
- 模板缓冲区为屏幕上的每个像素点保存一个无符号整数值(通常8位),这个值的具体意义视程序的具体应用而定
- 在渲染的过程中,将这个值(stencilBufferValue)与一个预先设定的参考值(referenceValue)相比较,根据比较的结果来决定是否更新相应的像素点的颜色值,通过则更新,否则不更新
- 模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前
语法表示
模板结构
ComparisonFunction 比较操作
函数 | 作用 |
---|---|
Greater | 相当于“>”,即当左边>右边,模板测试通过,渲染像素 |
GEqual | 相当于“>=”,即当左边>=右边,模板测试通过,渲染像素 |
Less | 相当于“<”,即当左边<右边,模板测试通过,渲染像素 |
LEqual | 相当于“<=”,即当左边<=右边,模板测试通过,渲染像素 |
Equal | 相当于“=”,即当左边=右边,模板测试通过,渲染像素 |
NotEqual | 相当于“!=”,即当左边!=右边,模板测试通过,渲染像素 |
Always | 不管公式两边为何值,模板测试总是通过,渲染像素 |
Never | 不管公式两边为何值,模板测试总是不通过,像素被抛弃 |
StencilOperation 更新值
函数 | 作用 |
---|---|
Keep | 保留当前缓冲里的内容,即stencilBufferValue不变 |
Zero | 将0写入缓冲,即stencilBufferValue变为0 |
Replace | 将参考值写入缓冲,即将referenceValue赋值给stencilBufferValue |
IncrSat | stencilBufferValue加1,超过255时保留为255 |
DecrSat | stencilBufferValue减1,小于0时保留为0 |
Invert | stencilBufferValue按位取反 |
IncrWrap | stencilBufferValue加1,超过255时变成0(然后继续自增) |
DecrWrap | stencilBufferValue减1,小于0时变成255(然后继续自减) |
总结
- 使用模板缓冲区最重要的两个值:当前模板缓冲值(stencilBufferValue)和模板参考值