结合 Stencil 和世界空间 "reverse" 裁剪的 HLSL(特定于 Unity 的 ok,不是必需的)
HLSL (Unity-specific ok, not necessary) combining Stencil and worldspace "reverse" clipping
我已经构建了一个工作表面着色器(称之为 "wonderland"),它呈现为不可见,除非伴随 "lookingGlass" 着色器从相机的角度与其相交。简单的模板着色器排列。
简单易行。
我可以添加着色器设置来指定一个平面,或者甚至只是一个最小的世界空间 Z 值,并使用 clip() 只渲染该平面一侧的像素...(换句话说,我可以使用trim Stencil 允许的内容。)
我想做的是在表面 "through the looking glass" 上使用模板(以显示镜子内部的几何体)并始终在这些表面位于 "our" 一侧时渲染这些表面窥镜(如果他们在窥镜门户的这一侧,总是向他们展示)。例如,如果 z<0,则在满足 Stencil Ref 值时进行渲染。如果 z>=0,无论如何渲染。
现在,在 Unity 中,我 可以 将两种材质附加到 MeshRenderer 组件(一种带有模板着色器,一种带有 "plane cutoff" 着色器)- 效果很好。实际上,它非常棒,至少在视觉上如此。但是,虽然我还没有对它进行基准测试,但我本能地相信,如果有许多对象、相当复杂的几何体等,用这种排列设置,它会极大地影响帧率。
(我也可以在代码中管理着色器附件,并且仅在我希望某些东西过渡时才这样做,但我真的希望从中得到一个统一的着色器以避免不必要的绘制调用。)
事实证明,我想做的事是不可能的。
我想合并的两个着色器都是表面着色器。虽然您可以将多个表面着色器组合成一个多通道着色器,但您不能将多个表面着色器与一个模板和一个 clip() 组合在一起,其中剪辑应用于通道,而模板不是,反之亦然。
有些组合可以实现部分目标,或者可以使用表面和垂直(或其他非冲浪)着色器实现整个目标,但不支持此问题规定的要求组合。
虽然这不能回答问题,但 Unity 中的解决方法是创建两种材质来提供每项功能。它们可以同时存在于需要这两个部分的项目上,并且代码可以以其他方式管理是否一个或另一个或两个都在使用中。
类似的解决方案将在其他软件包中提供。
我已经构建了一个工作表面着色器(称之为 "wonderland"),它呈现为不可见,除非伴随 "lookingGlass" 着色器从相机的角度与其相交。简单的模板着色器排列。
简单易行。
我可以添加着色器设置来指定一个平面,或者甚至只是一个最小的世界空间 Z 值,并使用 clip() 只渲染该平面一侧的像素...(换句话说,我可以使用trim Stencil 允许的内容。)
我想做的是在表面 "through the looking glass" 上使用模板(以显示镜子内部的几何体)并始终在这些表面位于 "our" 一侧时渲染这些表面窥镜(如果他们在窥镜门户的这一侧,总是向他们展示)。例如,如果 z<0,则在满足 Stencil Ref 值时进行渲染。如果 z>=0,无论如何渲染。
现在,在 Unity 中,我 可以 将两种材质附加到 MeshRenderer 组件(一种带有模板着色器,一种带有 "plane cutoff" 着色器)- 效果很好。实际上,它非常棒,至少在视觉上如此。但是,虽然我还没有对它进行基准测试,但我本能地相信,如果有许多对象、相当复杂的几何体等,用这种排列设置,它会极大地影响帧率。
(我也可以在代码中管理着色器附件,并且仅在我希望某些东西过渡时才这样做,但我真的希望从中得到一个统一的着色器以避免不必要的绘制调用。)
事实证明,我想做的事是不可能的。
我想合并的两个着色器都是表面着色器。虽然您可以将多个表面着色器组合成一个多通道着色器,但您不能将多个表面着色器与一个模板和一个 clip() 组合在一起,其中剪辑应用于通道,而模板不是,反之亦然。
有些组合可以实现部分目标,或者可以使用表面和垂直(或其他非冲浪)着色器实现整个目标,但不支持此问题规定的要求组合。
虽然这不能回答问题,但 Unity 中的解决方法是创建两种材质来提供每项功能。它们可以同时存在于需要这两个部分的项目上,并且代码可以以其他方式管理是否一个或另一个或两个都在使用中。
类似的解决方案将在其他软件包中提供。