Как приглушить свет в Unity3D?

9

Во-первых, я владею Unity Pro.

Я искал оглушающие источники света, когда их некоторое время не просматривали, чтобы улучшить производительность. Основными методами, с которыми я столкнулся, было использование BecameVisible () и тестирование усеченной камеры.

Моя главная проблема заключалась в том, что если игрок просматривает область, которая будет освещена светом, я все равно хочу, чтобы свет был включен.

В настоящее время я использую метод, который проверяет, находится ли освещенная область в усеченной камере, но проблема в том, что иногда огни находятся в усеченной зоне, когда игрок фактически их не видит (например, стена между ними и игроком). Я пробовал использовать их с помощью радиопередачи, но вы никогда не сможете получить достаточно подробные сведения о фактической освещенной области (лучшее, что я мог определить, было использовать renderer.bounds.extent и renderer.bounds.center для расчета максимальных освещенных точек от источника света).

Кто-нибудь знает о простом способе в Unity Pro перекрывать свет? Или не могли бы вы сказать мне хороший способ использовать тот метод опоры камеры, о котором я говорил?

Тимоти Уильямс
источник
1
Вы можете проверить, пересекаются ли усеченная камера и огневая точка, но я ожидаю, что единство уже делает это.
Арчи
1
В Unity Pro OcclusionCulling также должен обрабатывать источники света.
Арчи
Хорошо, мой художник сказал, что Occlusion Culling не будет работать на свет. Таким образом, я бы, вероятно, просто установил свои различные источники света как окклюзии в областях окклюзии, которые я уже настроил?
Тимоти Уильямс
И что-то вроде проверки камеры и легкого усеченного контура может сработать, хотя мне нужно, чтобы оно работало на 360 градусов.
Тимоти Уильямс
Отбор окклюзии, кажется, не работает с огнями, несмотря на то, что художник и я стараемся. Как именно я бы перекрыл свет?
Тимоти Уильямс

Ответы:

1

Вы можете написать свой собственный сценарий, чтобы перекрыть свет. Нечто подобное прикреплено к основной камере:

List<Light> Lights = new List<Light>();
const float OccludeDist = 100;
void Update()
{
    foreach (Light light in Lights)
    {
        if ((transform.position - light.transform.position).sqrMagnitude > OccludeDist * OccludeDist))
        {
            light.enabled = false;
        }
        else{
            light.enabled = true;
        }
    }
}

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

JPtheK9
источник
Красиво