【问题标题】:HLSL (Unity-specific ok, not necessary) combining Stencil and worldspace "reverse" clippingHLSL (Unity-specific ok, not necessary) 结合 Stencil 和 worldspace “reverse” clipping
【发布时间】:2017-02-23 10:38:24
【问题描述】:

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

简单易懂。

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

我想要做的是“通过镜子”在表面上使用模板(以显示镜子内部的几何图形)并始终在这些表面位于镜子的“我们”一侧时渲染这些表面(如果他们在镜子入口的这一侧,总是向他们展示)。例如,如果 z=0,则不考虑渲染。

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

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

【问题讨论】:

    标签: unity3d hlsl shaderlab


    【解决方案1】:

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

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

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

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

    类似的解决方案将在其他软件包中提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-27
      • 2012-08-25
      • 2016-02-04
      • 2011-05-29
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多