在Unity中剪切到网格深度

时间:2018-03-15 05:51:54

标签: unity3d shader

我在Unity中编写门户渲染器,用于VR游戏。这个想法是一个复杂的网格可以用作一个窗口'进入另一个世界。我已经设置了目前使用三个有序着色器渲染门户网站:

  1. 第一个着色器将门户渲染到模板缓冲区。
  2. 第二个着色器是经过修改的标准着色器,可在模板蒙版内渲染世界。
  3. 第三个着色器将门户渲染到深度缓冲区,以便“外部”#39;世界在后来的传递中不会在门户内部呈现。
  4. 问题是门户网站内的对象偶尔会出现在门户网站前面。我无法想到任何方式可以轻松地将它们剪辑到门户网站。如果门户是扁平的,我可以使用倾斜的近平面剪裁。但是对于复杂的网格,我想也许我可以利用第二个深度缓冲区,并且只为门户网站背后的世界绘制z-fail?

    我不确定如何创建第二个深度缓冲区,或者是否有更好的方法。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

可以在Unity 2018.1中使用新的可编写脚本的渲染管道创建第二个深度缓冲区。

同时,您可以通过添加两个额外着色器并稍微调整修改后的标准着色器来剪切到网格:

  1. 对门户内的对象进行深度预传。
  2. 使用ZTest Greater呈现门户网站。这会将深度缓冲区剪切到门户网站。
  3. ZTest Equal添加到修改后的标准着色器的ForwardForward_Delta次传递中。这将确保门户前面的碎片不会被渲染。
  4. 结合问题中的三个步骤,端到端的总管道是:

    1. 将门户网站渲染到模板缓冲区。
    2. 对门户内的对象进行深度预传。
    3. 使用ZTest Greater呈现门户网站。这会将深度缓冲区剪切到门户网站。
    4. 使用修改后的标准着色器在模板蒙版中渲染世界。将ZTest Equal添加到修改后的标准着色器的ForwardForward_Delta遍。这将确保门户前面的碎片不会被渲染。
    5. 再次将门户渲染到深度缓冲区,但使用ZTest LEqual,以便后面的传递中“外部”世界不会在门户内部渲染。
    6. 注意:每个步骤都需要一个单独的材料,每种材料的值增加Queue,以确保所有内容都以正确的顺序发生。

      您还希望使用不同的相机/图层剔除蒙版渲染每个门户网站,以便来自不同世界的对象不会相互遮挡。