Почему вызов моего шейдера UnityObjectToClipPos() приводит к тому, что мои *другие* шейдеры становятся невидимыми?

#unity3d #shader #hlsl

Вопрос:

Я создал шейдер с помощью инструмента шейдеров на основе узлов под названием Shadero Sprite, и я пытаюсь устранить проблему с ним. Поскольку код был сгенерирован инструментом на основе узлов, я не совсем уверен, какова цель каждой строки в шейдере, что затрудняет отладку этой проблемы.

Проблема в том, что, хотя сам шейдер работает нормально, наличие объекта с ним в моей сцене единства приводит к тому, что некоторые другие объекты в моей сцене вообще не отображаются; они становятся невидимыми.

Похоже, это что-то связанное с этим призывом 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, у которых все есть пользовательские шейдеры. Один шейдер использует вызов UnityObjectToClipPos(). Другой , похоже, нет (хотя у него их много #includes , так что, возможно, призыв к нему действительно существует, скрытый в одном из них #includes ).

Почему этот вызов функции приводит к тому, что другие объекты становятся невидимыми, и чем я могу его заменить, чтобы исправить это?

ИЗМЕНИТЬ: Вот конфигурация сцены для большего контекста:

введите описание изображения здесь

Ответ №1:

Чтобы отобразить модель в 3D — пространстве, мы обычно умножаем все вершины этой модели на матрицы MVP- модели, вида и проекции.

UnityObjectToClipPos() Функция просто преобразует точку из пространства объекта в пространство клипа камеры в однородных координатах. Это эквивалентно mul(UNITY_MATRIX_MVP, float4(pos, 1.0)) и должно использоваться вместо него.

Поэтому я не думаю, что UnityObjectToClipPos() функция является причиной вашей проблемы. Вы должны описать свою проблему более подробно, и мы постараемся вам помочь.

Комментарии:

1. Спасибо, Хамид. Тогда кажется, что проблема связана с самой сценой, а не с шейдером; Я обновил вопрос, добавив немного больше контекста о сцене.

Ответ №2:

Проблема заключалась в шейдере, который я использовал для своего текста.

В тексте используется ресурс Unity под названием SuperTextMesh, который предлагает несколько шейдеров для текста. Я использовал шейдер «Тень и контур неосвещенные», когда мне нужно было использовать шейдер «Тень и контур» вместо этого. «Неосвещенный» вызывал проблемы.