为什么我的着色器调用 UnityObjectToClipPos() 导致我的 *other* 着色器不可见?

Why is my shader's call to UnityObjectToClipPos() causing my *other* shaders to be invisible?

我通过名为 Shadero Sprite 的基于节点的着色器工具创建了一个着色器,我正在尝试调试它的问题。由于代码是由基于节点的工具生成的,我不能完全确定着色器中每一行的目的是什么,这使得这个问题很难调试。

问题是,虽然着色器本身工作正常,但在我的 Unity 场景中有一个对象会导致我场景中的某些 other 对象根本无法渲染;他们变得不可见。

这似乎与下面对 UnityObjectToClipPos() 的调用有关:

        v2f vert(appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            UNITY_TRANSFER_FOG(o,o.vertex);
            return o;
        }

...因为,如果我替换...

            o.vertex = UnityObjectToClipPos(v.vertex);

...与...

            o.vertex = v.vertex;

然后另一个 shaders/objects 渲染正常。然而,这当然意味着这个着色器看起来不正确。

我能够推断出的唯一其他线索是其他对象(不可见的对象)是 Unity UI 元素,它们都具有自定义着色器。一个着色器正在使用对 UnityObjectToClipPos() 的调用。另一个似乎没有(尽管它有很多 #includes,所以也许确实存在对它的调用,埋在其中一个 #includes 中)。

为什么这个函数调用导致其他对象不可见,我可以用什么替换它来修复它?

编辑:这是更大上下文的场景配置:

为了在3D中显示模型space,我们通常将这个模型的所有顶点乘以MVP - Model, View 投影 矩阵。

UnityObjectToClipPos() 函数只是将一个点从对象 space 变换到齐次坐标中的相机剪辑 space。这相当于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0)),应该代替它使用。

因此,我认为 UnityObjectToClipPos() 函数不是导致您出现问题的原因。 您应该更详细地描述您的问题,我们会尽力帮助您。

问题最终出在我用于文本的着色器上。

文本使用名为 SuperTextMesh 的 Unity 资源,它为文本提供了多个着色器。当我需要使用“Dropshadow and outline”着色器时,我使用的是“Dropshadow and outline unlit”着色器。 “未点亮”的那个引起了问题。