Как я могу заставить частицы светиться и освещать их окружение?

22

В настоящее время я пытаюсь создать эффект светлячка в темном лесу. Уровень имеет очень слабое освещение, и игрок является одним из немногих источников света. Чтобы игрок лучше видел уровень, я стараюсь, чтобы светящиеся светлячки появлялись на карте случайным образом. Одним из способов является использование системы частиц. Но я не могу заставить частицы излучать свет вокруг. Есть ли способ сделать это?

DarkDestry
источник
3
Настоящая проблема здесь в том, что «свет дорогой». Возможно, было бы лучше разместить несколько источников света с фиксированной точкой, которые достаточно освещают область, запечь источники света в карте света, а затем использовать частицы, чтобы объяснить, откуда исходит источник света, вместо того, чтобы использовать десятки ужасно дорогих динамических источников света.
Draco18s
@ Draco18s Там не будет десятков светлячков. Они только появятся в поле зрения игрока. Это сверху вниз и как таковой легко контролировать. И в любой момент времени должно быть не более 10 светлячков. Я не думаю, что 10 динамический точечный свет стоит дорого?
DarkDestry
По умолчанию Unity позволяет только двум активным динамическим источникам света освещать геометрию за раз (хотя это может отличаться для 2D-установки). Конечно, вы можете увеличить это, но имейте в виду, что +1 свет в 2 раза влияет на колл-коллы.
Draco18s
2
@ Draco18s это может быть верно для прямого пути рендеринга, но, как указано в документации «При использовании отложенного затенения, нет ограничения на количество источников света, которые могут воздействовать на объект» - многие небольшие источники света, которые влияют только на небольшую часть экран - это именно тот тип путей отсроченного рендеринга, который эффективен при обработке. (При типичной стоимости одного вызова отрисовки на уникальный свет, а не множителя, как при прямом рендеринге)
DMGregory
Неплохо подмечено. Я забываю о различных путях рендеринга в большинстве случаев.
Draco18s

Ответы:

7

Светоизлучающие частицы теперь являются встроенной функцией Unity в 5.5.

Просто включите источники света в инспекторе частиц, добавьте ссылку на готовый источник света (работают как точечные, так и точечные источники света) и измените соотношение на 1.

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

И вуаля, частицы, которые излучают свет: ! [введите описание изображения здесь

Оказывается, это довольно оптимизированная установка, работающая со скоростью 1500+ кадров в секунду на моей установке даже при максимальном освещении в сотни.

Редактировать: После некоторого наблюдения, мне кажется, что частицы света переключаются между освещением каждого фрагмента и освещением вершины (предположительно для оптимизации?). Это может привести к небольшому количеству визуальных артефактов, если максимальное освещение установлено слишком высоко.

Edit2: как указывает DMGregory, артефакты являются побочным продуктом оптимизации прямого рендеринга. Отложенное освещение решает проблему. Добавлен лучший подарок

eclmist
источник
1
Это хорошие новости! :) Этот ответ был бы еще лучше, если бы в нем содержались пошаговые инструкции о том, как настроить это с помощью новых функций системы частиц.
DMGregory
1
Поведение освещения вершин, которое вы видите, звучит немного похоже на некоторые оптимизации, которые Unity применяет при прямом рендеринге. Видите ли вы то же поведение при использовании отложенного пути?
DMGregory
Вы правы! Артефакты больше не присутствуют при использовании отложенного пути рендеринга.
Эклмист
31

Берегись:

Этот ответ устарел. Unity теперь поддерживает точечные световые частицы. Пожалуйста, смотрите этот ответ для более подробной информации.

Я оставлю сообщение здесь для любого любопытного, или использующего старые версии Unity, или нуждающегося в большем количестве ручного управления, чем предлагает нативный метод - просто отметьте, что нативная поддержка, вероятно, будет гораздо более эффективной и масштабируемой, чем подход, представленный ниже.


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

Вот быстрый пример, который я приготовил: Пример светлячков с огнями

Я использую этот сценарий для динамического появления достаточного количества света для моих максимальных частиц (убедитесь, что вы настроили параметры системы частиц так, чтобы максимальное значение было разумным - значение по умолчанию 1000 не сделает вашу видеокарту очень счастливой), а затем обновляет их, чтобы следовать активным частицы:

[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {

    public Light lightPrefab;

    ParticleSystem _system;
    ParticleSystem.Particle[] _particles;
    Light[] _lights;


    void Start () {
        _system = GetComponent<ParticleSystem>();
        _particles = new ParticleSystem.Particle[_system.maxParticles];

        _lights = new Light[_system.maxParticles];
        for(int i = 0; i < _lights.Length; i++)
        {
            _lights[i] = (Light)Instantiate(lightPrefab);
            _lights[i].transform.parent = transform;
        }
    }

    void Update () {

        int count = _system.GetParticles(_particles);
        for(int i = 0; i < count; i++)
        {
            _lights[i].gameObject.SetActive(true);
            _lights[i].transform.localPosition = _particles[i].position;

            // Looks like the GetCurrentColor function was added in 5.3.
            // You can use other methods in earlier Unity versions.
            _lights[i].color = _particles[i].GetCurrentColor(_system);
        }

        for (int i = count; i < _particles.Length; i++)
        {
            _lights[i].gameObject.SetActive(false);
        }
    }
}

Редактировать: вы можете создать префаб , сначала создав игровой объект (в данном случае «Создать» -> «Свет» -> «Точечный свет»), установив в нем нужное имя / параметры / scripts / children, а затем перетащив его из иерархии в Ваш исследователь проекта. Это сохраняет объект в качестве актива, который вы можете повторно использовать в нескольких сценах и сценариях со степенью наследования. Вы можете удалить копию в вашей сцене, и актив останется в папке «Ресурсы», к которому можно будет обращаться при необходимости.

Убедитесь, что lightPrefab имеет относительно небольшой диапазон и не использует теневую трансляцию, чтобы обеспечить максимальный запас производительности для всего, что происходит в вашей сцене. Вам не нужно делать сам LightPrefab зеленым (или цветом ваших светлячков) - он будет подбирать его по цвету частиц.

Тем не менее, вы можете обнаружить, что у вас есть лучший контроль над полетом светлячков, если вы сделаете каждый из них своим собственным GameObject с квадратом с билбордом и источником света, прикрепленным с помощью специального сценария движения / бликинга, поскольку для получения убедительного блуждания требуется больше мастерства системы частиц, чем Я знаю. ;)

Д.М.Григорий
источник
На самом деле ... хотя я сказал не использовать тенистую передачу для светлячков, я просто попытался включить ее в моем примере сцены, и это не вызвало никаких проблем. То, как тени вращаются вокруг светлячков, проходящих мимо объектов, действительно круто и может добавить в жуткую атмосферу. Ваш пробег может варьироваться в зависимости от сложности вашей сцены и вашего целевого оборудования, поэтому профиль, чтобы быть уверенным, но это может быть случай преждевременной оптимизации с моей стороны. :)
ДМГригорий
Как создать легкий сборный дом?
DarkDestry
Кроме того, по какой-то причине ParticleSystem.Particle ссылается на устаревшую частицу. Для него нет метода GetCurrentColor или GetCurrentSize.
DarkDestry
@DarkDestry Я добавил примечание к ответу о создании префабов. Что касается отсутствующих функций, это может быть проблемой версии - я работаю в 5.3, в более ранних версиях Unity вы могли бы сделать это по-другому. Давайте обсудим детали реализации в чате , используя комнату, любезно созданную Хамзой Хасаном.
DMGregory
Таким образом, легкий сборный домик такой же, как и обычный сборный дом. Был смущен, когда это упоминается как легкий сборный дом.
DarkDestry
3

Несколько лет назад, до того, как динамические источники света стали доступны по цене, мы просто использовали эффект частиц с двумерным билбордом с аддитивным смешиванием. Это осветлит сцену в сторону белого. Рисуя его с правильной глубиной светлячка, вы получаете почти правильную сортировку. Аддитивная альфа не нуждается в сортировке при перерисовке по сравнению с альфа смешиванием. Он не осветит ВСЕ сцены, но осветит область, окружающую светлячка. Затем вы можете взять динамический свет и выбирать одну из светлячков каждые несколько секунд, чтобы фактически осветить сцену, если вам это нужно.

Уже есть вопрос и ответ об эффектах свечения. Как добиться такого освещения в Unity для 2D-игр?

Стивен
источник
0

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

В любом случае, независимо от того, с каким двигателем вы работаете, динамические фары - это то, чего вы всегда должны избегать. Они очень дороги в вычислительном отношении и, как правило, добавляют сложность сцены очень экспоненциальным образом. Однако, как правило, для большинства 3D-рендеринга существует множество способов достижения аналогичных эффектов путем обмана;

Возможный способ добиться аналогичного эффекта - сопоставить предварительно созданную текстуру свечения с рельефом ниже ваших светлячков (при условии, что система координат Y = вверх / вниз) с позициями X и Z, контролирующими местоположение свечения на местности и смещение Y от местности, контролирующей альфа текстуры (ярче = ближе к местности)

Конечно, у этого метода есть несколько недостатков. Вы не будете отбрасывать тени, поскольку свет не используется, и вы не будете влиять на любую другую геометрию в мире (реквизит, листва и т. Д.)

JonBee
источник
-2

Используйте Lightв начале огня и поиграйте с его размером в сценарии, чтобы получить эффект горения. И используйте свою систему частиц :)

Хамза Хасан
источник
Там нет огня в сцене. У меня дефицитные частицы появляются и исчезают. Там нет никакого фиксированного положения для частиц вообще. Пожалуйста, прочитайте вопрос.
DarkDestry
Итак, в чем же дело? вы можете прикрепить свет к вашему префабу с частицами, а не по заранее определенным позициям
Hamza Hasan
Вопрос в том, как это сделать. Я использую систему частиц единства. И я не вижу там сборного дома. Если только вы не попросите меня просто создать сборный, который будет иметь подсветку и создать базу на основе сценария
DarkDestry
Итак, у вас есть частица gameObject на сцене. Прикрепите источник света к тому же игровому объекту и создайте его заранее, перетащив этот игровой объект в Unity File Explorer.
Хамза Хасан
У меня есть объект Particle System gameObject на сцене. Не частица
DarkDestry