Добавить свойства для каждого экземпляра к GPU шейдерам экземпляров во Встроенном Render Pipeline
По умолчанию Unity GPU экземпляры GameObjects с различными Преобразования в каждом вызове рисования экземпляра. Чтобы добавить больше вариаций в экземпляры, измените шейдер, добавив свойства для каждого экземпляра, такие как цвет. Вы можете сделать это как в шейдерах поверхностей, так и в шейдерах вершин/фрагментов.
Пользовательские шейдеры не нуждаются в данных на экземпляр, но они требуют экземпляр ID, потому что матрицы мира нуждаются в нем для правильной работы. Шейдеры поверхности автоматически устанавливают экземпляр ID, но пользовательские шейдеры вершин и фрагментов этого не делают. Чтобы настроить ID для пользовательских шейдеров вершин и фрагментов, используйте UNITY_SETUP_INSTANCE_ID в начале шейдера. Пример того, как это сделать, см. в Shader вершин и фрагментов.
При объявлении инстансированного свойства Unity собирает все значения этого свойства из объектов MaterialPropertyBlock, заданных для GameObject, в один вызов отрисовки. Пример использования объектов MaterialPropertyBlock для задания данных на экземпляр во время выполнения см. Изменение данных на экземпляр во время выполнения.
При добавлении данных по экземплярам в многопроходные шейдеры следует учитывать следующие моменты:
- Если многопроходный шейдер имеет более двух проходов, то Unity инстанционирует только первый проход. Это потому, что Unity рендирует последующие проходы вместе для каждого объекта, что заставляет изменять материал.
- Если в Built-in Render Pipeline используется путь отображения Forward, то Unity не может эффективно инстанционировать объекты, на которые влияют несколько световых сигналов. Unity может эффективно использовать инстанционирование только для базового прохода, а не для дополнительных проходов. Дополнительную информацию о проходах освещения см. в документации по Forward Rendering и Pass Tags.
При использовании нескольких свойств для каждого экземпляра, вам не нужно заполнять все из них в объектах MaterialPropertyBlock. Кроме того, если в одном экземпляре отсутствует свойство, Unity берет значение по умолчанию из материала, на который сделана ссылка. Если материал не имеет значения по умолчанию для свойства, Unity устанавливает значение 0. Не помещайте свойства, не инстанцируемые в MaterialPropertyBlock, потому что это отключает инстанцирование. Вместо этого создайте для них разные материалы.