0

我已经构建了一个工作表面着色器(称为“仙境”),它呈现为不可见,除非从相机的角度来看伴随的“lookGlass”着色器与其相交。简单的模板着色器排列。

十分简单。

我可以添加着色器设置来指定一个平面,甚至只是一个最小的世界空间 Z 值,并使用 clip() 仅在该平面的一侧渲染像素......(换句话说,我可以使用它来修剪内容这是 Stencil 允许的。)

我想做的是“通过镜子”在表面上使用模板(以显示镜子内部的几何形状)并始终在它们位于镜子的“我们”一侧时渲染这些表面(始终如果他们在镜子门户的这一侧,请向他们展示)。例如,如果 z<0,则在满足 Stencil Ref 值时进行渲染。如果 z>=0,则无论如何渲染。

现在,在 Unity 中,我可以将两种材质附加到 MeshRenderer 组件(一种带有模板着色器,一种带有“平面截止”着色器)——效果很好。实际上,它非常棒,至少在视觉上是这样。但是,虽然我还没有对它进行基准测试,但我本能地相信,如果有许多对象、相当复杂的几何图形等以这种方式设置,它会极大地影响帧速率。

(我也可以在代码中管理着色器附件,并且只在我期望某些东西过渡时才这样做,但我真的希望从中获得统一的着色器以避免不必要的绘制调用。)

4

1 回答 1

1

事实证明,我想做的事情是不可能的。

我希望组合的两个着色器都是表面着色器。虽然您可以将多个表面着色器组合成一个多通道着色器,但您不能将多个表面着色器与一个 Stencil 和一个 clip() 组合在一起,其中剪辑应用于 Stencil 不是的通道,反之亦然。

有一些组合可以实现部分目标,或者可以使用表面和垂直(或其他非冲浪)着色器实现整个目标,但不支持此问题规定的要求组合。

虽然这不能回答问题,但 Unity 中的解决方法是创建两种材料来提供每种功能。它们都可以存在于需要这两个部分的项目上,并且代码可以管理其中一个或另一个或两者是否正在使用中。

类似的解决方案将在其他包中可用。

于 2017-02-23T02:38:24.923 回答