#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, который предлагает несколько шейдеров для текста. Я использовал шейдер «Тень и контур неосвещенные», когда мне нужно было использовать шейдер «Тень и контур» вместо этого. «Неосвещенный» вызывал проблемы.