我在Unity中编写门户渲染器,用于VR游戏。这个想法是一个复杂的网格可以用作一个窗口'进入另一个世界。我已经设置了目前使用三个有序着色器渲染门户网站:
问题是门户网站内的对象偶尔会出现在门户网站前面。我无法想到任何方式可以轻松地将它们剪辑到门户网站。如果门户是扁平的,我可以使用倾斜的近平面剪裁。但是对于复杂的网格,我想也许我可以利用第二个深度缓冲区,并且只为门户网站背后的世界绘制z-fail?
我不确定如何创建第二个深度缓冲区,或者是否有更好的方法。
有什么想法吗?
答案 0 :(得分:1)
可以在Unity 2018.1中使用新的可编写脚本的渲染管道创建第二个深度缓冲区。
同时,您可以通过添加两个额外着色器并稍微调整修改后的标准着色器来剪切到网格:
ZTest Greater
呈现门户网站。这会将深度缓冲区剪切到门户网站。ZTest Equal
添加到修改后的标准着色器的Forward
和Forward_Delta
次传递中。这将确保门户前面的碎片不会被渲染。结合问题中的三个步骤,端到端的总管道是:
ZTest Greater
呈现门户网站。这会将深度缓冲区剪切到门户网站。ZTest Equal
添加到修改后的标准着色器的Forward
和Forward_Delta
遍。这将确保门户前面的碎片不会被渲染。ZTest LEqual
,以便后面的传递中“外部”世界不会在门户内部渲染。 注意:每个步骤都需要一个单独的材料,每种材料的值增加Queue
,以确保所有内容都以正确的顺序发生。
您还希望使用不同的相机/图层剔除蒙版渲染每个门户网站,以便来自不同世界的对象不会相互遮挡。