【问题标题】:Why is my shader's call to UnityObjectToClipPos() causing my *other* shaders to be invisible?为什么我的着色器调用 UnityObjectToClipPos() 导致我的 *other* 着色器不可见?
【发布时间】:2021-10-08 23:55:34
【问题描述】:

我通过一个名为 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;

然后其他着色器/对象渲染得很好。然而,这当然意味着这个着色器看起来不正确。

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

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

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

【问题讨论】:

    标签: unity3d shader hlsl


    【解决方案1】:

    为了在 3D 空间中显示模型,我们通常将这个模型的所有顶点乘以 MVP - ModelViewProjection 矩阵。

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

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

    【讨论】:

    • 谢谢哈米德。看来问题在于场景本身,而不是着色器;我已经用更多关于场景的上下文更新了这个问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多