Почему некоторые игры показывают, что огни светят сквозь стены?

28

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

Несколько примеров игр, в которые я недавно играл, это Borderlands 2 (взрывы ракет) и Call of Cthulhu (фонари; игра даже использует Unreal Engine 4).

Это ошибка или есть причины производительности?

Пример Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (несколько раз, но быстро)

Дополнительный вопрос: есть ли в последнем случае дешевая трассировка лучей для решения проблемы? Я думаю, что дорогой RT определенно решил проблему, но мне интересно, можно ли его использовать в «дешевой» форме для решения этой конкретной проблемы.

Маркус
источник
21
Картинка стоит 1000 слов.
Evorlor
8
Мне нужно пойти поиграть, чтобы проверить, но действительно ли это свет, который просачивается сквозь него, или это может быть эффект светящихся частиц? В частности, для вашего примера взрыва ракеты я мог бы представить аддитивный эффект «огненной» частицы, который, скорее всего, будет игнорировать столкновения. Фонари также могли бы сделать то же самое, чтобы создать видимый ореол, я полагаю ...
AC
@Evorlor добавил один пример.
Маркус

Ответы:

43

Разбираясь в правильном ответе TomTsagk, я подумал, что это может помочь немного подробнее рассказать о том, почему игры работают так.

Свет в играх на самом деле не «путешествует» от источника, на поверхность, на камеру, и на этом пути он будет преградить путь.

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

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

Если мы хотим смоделировать тени, мы должны сделать это отдельно. Одним из распространенных способов является то, что называется Shadow Map. В этой версии, прежде чем мы затеняем нашу сцену, мы сначала визуализируем сцену с точки зрения каждого источника света, как если бы этот источник света был камерой, сохраняя глубину каждого пикселя, который он видит, в текстуру вне экрана.

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

Существует множество классных приемов, которые делают эти тени на карте более привлекательными, с меньшим количеством артефактов / псевдонимов, но пока я их затушевываю. Достаточно сказать, что они, как правило, тоже не свободны.

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

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

Д.М.Григорий
источник
3
Другая проблема заключается в том, что хотя выяснить, находится ли источник света перед или позади поверхности, тривиально, предотвращение свечения поверхностей при освещении сзади часто приводит к странным результатам.
суперкат
И это особенно верно в отношении эффектов частиц (что, вероятно, является взрывом, по крайней мере, частично), поскольку частицы должны быть особенно дешевыми, чтобы быть очень полезными.
Луаан
2
Свет и частицы - это две разные вещи. Частица также может «протекать» через препятствие, но по совершенно другим причинам. Иногда система частиц также включает в себя свет, чтобы помочь продать эффект (например, костер или рой светлячков), но свет внутри эффекта частиц все еще просто свет, обычно не какой-то особый вариант.
DMGregory
2
Альтернативный подход к теневым картам - теневые объемы , которые решают проблему наложения имен, но стоят дороже: требуется рендеринг дополнительной геометрии (новый многоугольник на ребро силуэта каждого объекта для каждого источника света), а также дополнительные проходы рендеринга. Однако я ожидаю, что картографический подход достаточно хорош для большинства ситуаций.
Дартфеннек
22

Короче говоря, это происходит по причинам производительности.

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

Это легче решить на статических объектах, используя статическое и запеченное освещение, но это не то же самое для динамических источников света, таких как взрывы, как вы заметили.

На ваш бонусный вопрос трассировка лучей и дешёвка не идут вместе в одном предложении. Единственная причина, по которой трассировка лучей до сих пор не получила широкого распространения, - это производительность. Предполагая, что все источники света используют трассировку лучей, эта проблема будет «решена», но за счет производительности.

TomTsagk
источник
6
Так является ли трассировка лучей больше для CGI-фильмов, чем для игр в реальном времени?
накопление
21
@ Аккумуляция Это правильно. Рендеринг одного кадра фильма может занять часы, в то время как игра имеет только миллисекунды.
NobodyNada - Восстановить Монику
16
Тем не менее, игры все чаще исследуют использование raytracing или raymarching в тандеме с методами растеризации, позволяя растеризатору делать то, что у него хорошо, а лучи делать то, что у них хорошо получается. Это не полная трассировка лучей каждого пикселя, но вы все равно можете получить отличные эффекты таким образом.
DMGregory
2
@DMGregory Действительно, в таких играх, как Duke Nukem 3D, уже использовался очень упрощенный вариант трассировки лучей - хотя он не использовался для динамического освещения и определенно не отслеживал каждый пиксель на экране (обычно это делалось для каждого столбца). пикселей), а отражения и прозрачность по-прежнему были частным случаем, а не по умолчанию. Программное обеспечение 3D-рендеринга всегда играло с подобными подходами, это было аппаратное 3D, которое закрыло эту авеню (до сих пор).
Луан
@Acccumulation Raytracing происходит на разных уровнях, поэтому, несмотря на то, что игры могут на аппаратном уровне снимать первичные лучи, они по-прежнему не выполняют достаточного количества вторичных отскоков или нескольких отскоков на пиксель. Таким образом, даже если вы захотите использовать raytrace, вы все равно будете иметь компромиссы в производительности. Таким образом, способность отслеживать основные источники света еще не означает, что вы можете позволить себе воспроизводить все дополнительные источники света.
Джуджаа