Это примечания, о которых следует помнить при обновлении проектов с Unity 4 до Unity 5, если в вашем проекте используется собственный шейдерA программа, работающая на графическом процессоре. Подробнее
См. в коде Словарь.
Шейдеры больше не применяют двукратное увеличение интенсивности света
Шейдеры больше не применяют двукратное увеличение интенсивности света. Вместо этого свет автоматически улучшается, чтобы быть в два раза ярче. Это создает большую согласованность и простоту в легких установках. Например, направленный свет, падающий на белую диффузную поверхность, получит точный цвет света. Обновление не влияет на анимацию, поэтому, если у вас есть анимированное значение интенсивности света, вы должны изменить свои кривые анимацииПозволяет добавлять данные к импортированному клипу, чтобы вы могли анимировать синхронизацию других элементов в зависимости от состояния аниматора. Например, для игры в ледяных условиях вы можете использовать дополнительную анимационную кривую для управления скоростью излучения системы частиц, чтобы показать сгущающееся дыхание игрока в холодном воздухе. Подробнее
Посмотрите в Словарь или в коде скрипта и увеличьте их вдвое, чтобы получить то же самое смотри.
В случае пользовательских шейдеров, в которых вы определяете свои собственные функции освещения, вам необходимо удалить * 2 самостоятельно.
// A common pattern in shader code that has this problem will look like this
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);
// You need to fix the code so it looks more like this
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);
Увеличено количество интерполяторов и инструкций для некоторых поверхностных шейдеров
Встроенный конвейер освещения в Unity 5 может в некоторых случаях использовать больше интерполяторов текстурных координат или счетчика математических инструкций (чтобы заставить работать такие вещи, как неравномерный масштаб сетки, динамическое GI и т. д.). Некоторые из ваших существующих поверхностных шейдеровУпрощенный способ написания шейдеров для встроенного конвейера рендеринга. Подробнее
См. Словарь может привести к ограничению координат текстуры или инструкций ALU, особенно если они были нацелены на шейдерную модель 2.0 (по умолчанию). Добавление «#pragma target 3.0» может обойти эту проблему. Для справки см. http://docs.unity3d.com/Manual/SL-ShaderPrograms. .
Неравномерный масштаб сетки должен учитываться в шейдерах
В Unity 5.0 неравномерные сетки больше не «предварительно масштабируются» на ЦП. Это означает, что нормальные и касательные векторы могут быть ненормализованы в вершинном шейдерепрограмме, которая работает с каждой вершиной 3D-модели. когда модель визуализируется. Подробнее
См. в Словарь. Если вы выполняете расчеты освещения вручную, вам придется их нормализовать. Если вы используете поверхностные шейдеры Unity, весь необходимый код будет сгенерирован за вас.
Обработка тумана была изменена
В Unity 5.0 встроенный туман работает на Windows Phone и консолях, но для этого мы немного изменили принцип работы тумана. Для поверхностных шейдеров и шейдеров с фиксированными функциями ничего дополнительно делать не нужно — туман будет добавлен автоматически (вы можете добавить «nofog» в строку #pragma поверхностного шейдера, чтобы явно запретить туман).
Для вершинных/фрагментных шейдеров, написанных вручную, туман теперь не возникает автоматически. Вам нужно добавить #pragma multi_compile_fog и макросы обработки тумана в код шейдера. Ознакомьтесь со встроенным исходным кодом шейдера, например Unlit-Normal, как это сделать.
Изменение альфа-канала шейдеров поверхности
По умолчанию все шейдеры непрозрачных поверхностей теперь выводят 1.0 («белый») в альфа-канал. Если вы хотите остановить это, используйте опцию «keepalpha» в строке #pragma.
Все шейдеры поверхностей с альфа-смешением теперь используют альфа-компонент, вычисленный функцией освещения, в качестве коэффициента наложения (вместо s.Alpha). Если вы используете пользовательские функции освещения, вы, вероятно, захотите добавить что-то вроде «c.a = s.Alpha» ближе к концу.
Удалена сортировка по индексу материала
Unity больше не выполняет сортировку по индексу материала в прямом цикле рендеринга. Это повышает производительность, поскольку можно отобразить больше объектов без изменения состояния между ними. Это нарушает совместимость контента, который использует индекс материала как способ сортировки. В версии 4.x meshосновной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
See in Словарь с двумя материалами всегда будет отображать первый первый материал, а второй материал второй. В Unity 5 это не так, порядок зависит от того, что уменьшает большинство изменений состояния для рендеринга сценыСцена содержит среды и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь.
Исправлена функция TexGen, матрицы текстур и некоторые режимы комбайнера SetTexture удалены
В Unity 5.0 удалена поддержка этой фиксированной функции шейдера:
- Генерация UV-координат (команда TexGen).
- Матрицы UV-преобразования (команда Matrix для свойства текстуры или внутри SetTexture).
- Редко используемые режимы комбайнера SetTexture: сложение со знаком (a+-b), сложение со знаком умножения (ab+-c), вычитание умножения (abc), скалярное произведение (dot3, dot3rgba).
Все вышеперечисленное теперь ничего не сделает, и шейдер инспекторокно Unity, отображающее информацию о текущем выбранном игровом объекте, настройки актива или проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
See in Словарь покажет предупреждения об их использовании. Вы должны переписать затронутые шейдеры, используя вместо этого программируемые вершинные + фрагментные шейдеры. В настоящее время все платформы поддерживают их, и использование шейдеров с фиксированными функциями не дает никаких преимуществ.
Если в вашем проекте есть довольно старые версии пакетов шейдеров Projector или Water, шейдеры могут использовать эту функцию. Обновите пакеты до версии 5.0.
Совмещение частей шейдера программируемых и фиксированных функций больше не допускается
Совмещение частично фиксированных функций и частично программируемых шейдеров (например, вершинное освещение с фиксированной функцией и пиксельный шейдер или вершинный шейдер и объединители текстур) больше не поддерживается. В любом случае, он никогда не работал на мобильных устройствах, консолях или DirectX 11. Это потребовало изменения поведения шейдера Legacy/Reflective/VertexLit, чтобы этого не делать — он потерял поддержку отражения для каждой вершины; с положительной стороны, теперь он ведет себя согласованно между платформами.
Шейдерный компилятор D3D9 был переключен с Cg 2.2 на HLSL
В основном это должно быть прозрачным (просто приведет к меньшему количеству ошибок codegen и немного более быстрым шейдерам). Однако компилятор HLSL может быть немного более требовательным к синтаксису. Некоторые примеры:
- Необходимо полностью инициализировать выходные переменные. Используйте вспомогательный макрос UNITY_INITIALIZE_OUTPUT, как в D3D11.
- Конструкторы float3(a_4_component_value) не работают. Вместо этого используйте «a_4_component_value.xyz».
Переменная шейдера «unity_Scale» удалена
Свойство шейдера «unity_Scale» удалено. В 4.x unity_Scale.w был масштабом преобразования 1/uniform, Unity 4.x отображал только модели без масштабирования или с однородным масштабированием. Другие масштабы выполнялись на ЦП, который был очень дорогим и имел непредвиденные накладные расходы памяти.
В Unity 5.0 все это делается на GPU путем простой передачи шейдерам матриц с неравномерным масштабом. Таким образом, unity_Scale был удален, поскольку он не может отображать полную шкалу. В большинстве случаев, когда использовалось «unity_Scale», мы рекомендуем вместо этого сначала преобразовать в мировое пространство. В случае преобразования нормалей вам всегда нужно использовать нормализацию преобразованной нормали. В некоторых случаях это приводит к немного более дорогому коду в вершинном шейдере.
// Unity 4.x
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal * unity_Scale.w);
// Becomes this in Unity 5.0
float3 norm = normalize(mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal));
// Unity 4.x
temp.xyzw = v.vertex.xzxz * unity_Scale.xzxz * _WaveScale4 + _WaveOffset;
// Becomes this in Unity 5.0
float4 wpos = mul (_Object2World, v.vertex);
temp.xyzw = wpos.xzxz * _WaveScale4 + _WaveOffset;
Тени, текстуры глубины и проходы ShadowCollector
Тени направленного света, визуализируемые вперед, больше не выполняют отдельный проход «сборщика теней». Теперь они рассчитывают тени экранного пространства от камерыкомпонента, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
Посмотрите в текстуре глубины Словарь (как при отложенном освещении).
Это означает, что проходы LightMode=ShadowCollector в шейдерах ни для чего не используются; вы можете просто удалить их из своих шейдеров.
Сама текстура глубины больше не генерируется с помощью замены шейдера; он визуализируется с помощью проходов шейдера ShadowCaster. Это означает, что пока ваши объекты могут отбрасывать правильные тени, они также будут правильно отображаться в текстуре глубины камеры (раньше это было очень сложно сделать, если вы хотели пользовательскую анимацию вершин или необычное альфа-тестирование). Это также означает, что Camera-DepthTexture.shader сейчас ни для чего не используется. Кроме того, все встроенные шейдеры теней не использовали отсечение задней поверхности; который был изменен, чтобы соответствовать режиму отбраковки обычного рендерингапроцесса рисования графики на экране (или текстуры рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь.