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