XRay-ShaderLab
我们告诉它总是在东西上方绘制(使用z缓冲区),除非基本Pass已经绘制(使用模板缓冲区)。
逻辑:
- 基本Pass总会取代X光Pass
- 如果基本Pass没有遮挡,x光就会在所有事物上绘制
- X光有正反面两个半透明通道
X光Pass不与Z缓冲和模板缓冲冲突,我们可以使用ZWrite和ZTest标签在Unity中为着色器传递配置深度缓冲区设置。ZWrite允许我们配置片段是否应该写入深度缓冲区,而ZTest允许我们更改深度缓冲区测试的行为。
由于我们希望X射线Pass可以在所有内容之上绘制,因此我们的设置将是:
ZWrite Off –这意味着该Pass将不会写入深度缓冲区
ZTest Always –这意味着Passs将始终通过;意思是,它将始终在其他Pass之上
使用模板缓冲丢弃X光中已经被基本Pass绘制的内容
基本Pass:
现在,我们需要告诉X射线通到从模板缓存读取,并且当它看到一个参考值大于3不画。
Stencil {
Ref 3
Comp Greater
Fail keep
Pass replace
}
Comp Greater意味着当模板缓冲区中已有的值大于该片段的参考值(3)时,比较测试将“通过”。
Fail Keep and Pass Replace意味着比较测试失败时将不绘制该片段,而在比较测试通过时绘制。“保持”和“替换”指的是处理模板缓冲区中已有的值。
第二个Pass:
为了使X射线效果更好地模仿“守望先锋”效果,我们需要同时绘制网格的正面和背面。要做到这一点,我们需要把它收回去两遍:第一遍,我们会剔除正面; 在第二个中,我们将抽出背面。
为什么我们不能只使用一次X射线检查并关闭剔除?Welllll,因为我们将获得奇怪的伪像,这取决于人脸在z缓冲区中绘制的顺序
第二个Pass不能使用完全相同的模板缓冲区设置,否则第二次X射线扫描将完全无法进行。这是因为我们不希望第二遍替换第一遍X射线像素。
Stencil {
Ref 4
Comp NotEqual
Pass Keep
}
Ref 4表示我们的参考值为4;最重要的是,它等于基本通行证的参考值。
Comp NotEqual示当模板缓冲区中的值等于我们的参考值时,此测试将通过。
Pass Keep意味着我们将在测试通过时将任何值保留在模板缓冲区中。IE,当参考值为EQUAL时,我们将不会绘制像素。