HLSL(Unity特定的确定,没有必要)结合Stencil和世界空间“反向”剪辑

时间:2017-02-17 09:50:47

标签: unity3d hlsl shaderlab

我已经构建了一个工作表面着色器(称之为“仙境”),除非伴侣“lookingGlass”着色器与相机的视点相交,否则呈现为不可见。简单的模板着色器布置。

轻松自负。

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

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

现在,在Unity中我可以将两个材质附加到MeshRenderer组件(一个带有模板着色器,一个带有“平面截止”着色器) - 工作正常。实际上,它至少在视觉上非常棒。但是,虽然我还没有对它进行基准测试,但我本能地认为,如果存在许多物体,相当复杂的几何形状等,则会严重影响帧速率。

(我也可以在代码中管理着色器附件,并且只在我希望转换时才执行此操作,但我真的希望从中获得统一的着色器以避免不必要的绘制调用。)

1 个答案:

答案 0 :(得分:1)

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

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

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

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

其他套装也可提供类似的解决方案。