Войти
ПрограммированиеФорумГрафика

Unity3D проверка видимости PointLight

Страницы: 1 2 Следующая »
#0
2:49, 4 дек. 2017

Пытаюсь понять как проверить виден ли PointLight камерой. Для renderer объектов это OnBecameVisible и OnBecameInvisible,
но лампочка не renderer.

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

Есть варианты:

Vector3 screenPoint = playerHead.leftCamera.WorldToViewportPoint(targetPoint.position);
bool onScreen = screenPoint.z > 0 && screenPoint.x > 0 && screenPoint.x < 1 && screenPoint.y > 0 && screenPoint.y < 1;

но это для точки, а мне нужно для сферы, кроме того вычисления WorldToViewportPoint нивелируют мою оптимизацию.

Можно еще угол направления камеры к направлению до объекта считать (с учетом fov), но опять же это до точки и доп. вычисления.

Можно заюзать:
https://docs.unity3d.com/ScriptReference/GeometryUtility.TestPlanesAABB.html
но нужно считать боундинг по сфере для света + опять же свои проверки, а хочеться выцепить готовое уже посчитанное
Не хочется в ручную фрустумом проверять со сферой лампы, толку от такой оптимизации мало, там логики в лампочке не так много

думаю движок и так где-то хранит уже вычисленную видимость, но судя по классам Light : Behaviour : Component : Object ничего нет такого :( Возможно есть где-то список видимых лампочек (но опять же выборку не хочется делать)

Интересно мнение форума?


#1
2:53, 4 дек. 2017

есть еще вариант CullResults.visibleLights, но смущает выборка в списке видимых ламп и надпись в документации:

Experimental: this API is experimental and might be changed or removed in the future.

#2
4:49, 4 дек. 2017

Durane
> надпись в документации:
зная Unity... это вообще не страшно, так как обновление проекта и так через ж.пу происходит

#3
10:16, 4 дек. 2017

Durane
> Я дописал кастомную логику для лампочки (влияние ветра, мерцание и пр.) и не
> хочу считать ее, когда лампочка не в камере.
Лампочка разве не мешак ? И как быть с освещением, которое не зависит от того - в камере лампочка или нет ?

#4
11:12, 4 дек. 2017

Я делал через CullingGroup. Работает быстро и для Point-лампочек подходит идеально

#5
12:52, 4 дек. 2017

Nickulus
Не мешак

Bonus
Спасибо, попробую

#6
14:04, 4 дек. 2017

Добавить сферу-child к лампочке?

#7
14:18, 4 дек. 2017

arcturgray
как вариант, но идея с CullingGroup больше нравится

#8
15:47, 4 дек. 2017

> как вариант, но идея с CullingGroup больше нравится

А лампочку оттуда не выкинет в случае низких настроек качества и forward рендера ?

#9
16:36, 4 дек. 2017

ASD
в моем случае камера под изометрию и deffered

#10
17:39, 4 дек. 2017

Но на самом деле странно. Ведь движок перед рендером все равно проверяет лампочки на попадание во фрустум. Закинул предложение на форум юнити:

https://feedback.unity3d.com/suggestions/light-component-need-var… ble-isvisible

#11
7:35, 5 дек. 2017

Durane
рендер реалтайм ? Лайтмапы не участвуют ?

#12
8:10, 5 дек. 2017

Nickulus
нет лайтмапов, процедурный мир

#13
8:15, 5 дек. 2017

Можно извратится и добавить меш фильтр с меш рендерером типа кубика, и сделать ему прозрачный материал.
Затем как обычно чекать.
Не очень эффективно, но возможно юнити не рисует объекты прозрачные

#14
13:22, 5 дек. 2017

Durane
> Но на самом деле странно. Ведь движок перед рендером все равно проверяет
> лампочки на попадание во фрустум

По-моему все логично. Логика, которую разрешено править пользователям отделена от рендера. Логика может обновляться с другой частотой кадров, нежели рендер. Поэтому из логики максимум, что можно получить (теоретически), так это состояние с предыдущего рендер-кадра.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.