Unity3d 剪裁到网格的统一深度

Unity3d 剪裁到网格的统一深度,unity3d,shader,Unity3d,Shader,我正在为一个VR游戏编写Unity中的门户渲染器。其思想是,一个复杂的网格可以用作进入另一个世界的“窗口”。目前,我已经设置了使用三个有序着色器渲染门户: 第一个着色器将门户渲染到模具缓冲区 第二个着色器是修改后的标准着色器,用于渲染模具遮罩内的世界 第三个着色器将门户渲染到深度缓冲区,以便“外部”世界不会在稍后的过程中渲染门户内部 问题是门户中的对象偶尔会出现在门户前面,而它们本不应该出现在门户前面。我想不出任何方法可以轻松地将它们剪辑到门户。如果入口是平的,我可以使用倾斜的近平面剪裁。但是,

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

  • 第一个着色器将门户渲染到模具缓冲区
  • 第二个着色器是修改后的标准着色器,用于渲染模具遮罩内的世界
  • 第三个着色器将门户渲染到深度缓冲区,以便“外部”世界不会在稍后的过程中渲染门户内部
  • 问题是门户中的对象偶尔会出现在门户前面,而它们本不应该出现在门户前面。我想不出任何方法可以轻松地将它们剪辑到门户。如果入口是平的,我可以使用倾斜的近平面剪裁。但是,对于复杂的网格,我想也许我可以利用第二个深度缓冲区,只在门户后面的世界中使用z-fail

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


    有什么想法吗?

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

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

  • 对门户内的对象执行深度预传递
  • 使用
    ZTest Greater
    呈现门户本身。这会将深度缓冲区剪裁到入口
  • 为修改后的标准着色器将
    ZTest Equal
    添加到
    Forward
    Forward_Delta
    过程中。这将确保门户前面的片段不会被渲染
  • 结合问题中的三个步骤,从端到端的总管道为:

  • 将门户渲染到模具缓冲区
  • 对门户内的对象执行深度预传递
  • 使用
    ZTest Greater
    呈现门户本身。这会将深度缓冲区剪裁到入口
  • 使用修改后的标准着色器渲染模具遮罩内的世界。为修改后的标准着色器将
    ZTest Equal
    添加到
    Forward
    Forward_Delta
    过程中。这将确保门户前面的片段不会被渲染
  • 再次将门户渲染到深度缓冲区,但使用
    ZTest-LEqual
    ,以便“外部”世界不会在稍后的过程中渲染门户内部
  • 注意:每个步骤都需要一个单独的物料,每个物料的
    Queue
    值都会增加,以确保一切都按正确的顺序进行


    您还需要使用不同的摄影机/图层剔除遮罩渲染每个入口,以便来自不同世界的对象不会相互阴影。

    是否可以在纹理中使用第二个摄影机渲染您希望通过入口看到的内容。然后将此纹理应用于门户对象。这将允许您不使用自定义着色器。我不知道你的用例是否可以接受,谢谢你的评论!我认为剪辑可能是个问题,对吧?(对于模具与渲染纹理,对于VR,我认为模具缓冲区可能更有效,因为它将使用单遍立体。)