XRay-ShaderLab

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时,我们将不会绘制像素。