В некоторых играх я вижу свет, проникающий сквозь стены, даже если я устанавливаю качество видео на высоком уровне.
Несколько примеров игр, в которые я недавно играл, это Borderlands 2 (взрывы ракет) и Call of Cthulhu (фонари; игра даже использует Unreal Engine 4).
Это ошибка или есть причины производительности?
Пример Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (несколько раз, но быстро)
Дополнительный вопрос: есть ли в последнем случае дешевая трассировка лучей для решения проблемы? Я думаю, что дорогой RT определенно решил проблему, но мне интересно, можно ли его использовать в «дешевой» форме для решения этой конкретной проблемы.
lighting
shadows
raytracing
Маркус
источник
источник
Ответы:
Разбираясь в правильном ответе TomTsagk, я подумал, что это может помочь немного подробнее рассказать о том, почему игры работают так.
Свет в играх на самом деле не «путешествует» от источника, на поверхность, на камеру, и на этом пути он будет преградить путь.
Чтобы выяснить, насколько ярко нарисовать каждый пиксель поверхности на основе заданного света, мы используем (или приближаемо) математическую формулу, которая использует направление поверхности и направление от этой точки на поверхности к источнику света. Вот и все, только направление, из которого он сияет - мы обычно не направляем луч, чтобы проверить, действительно ли свет достигает этого пикселя, потому что делать это для каждого пикселя на экране и проверять луч по всей детальной геометрии сцены обычно все еще слишком дорого для игр в реальном времени.
Так что по умолчанию никакие игровые огни не отбрасывают тени. Направление к источнику света остается неизменным, даже если на пути есть заклинатель теней, поэтому математика дает нам то же значение яркости.
Если мы хотим смоделировать тени, мы должны сделать это отдельно. Одним из распространенных способов является то, что называется Shadow Map. В этой версии, прежде чем мы затеняем нашу сцену, мы сначала визуализируем сцену с точки зрения каждого источника света, как если бы этот источник света был камерой, сохраняя глубину каждого пикселя, который он видит, в текстуру вне экрана.
Затем, когда мы затеняем сцену, мы можем сравнить математическое расстояние этого пикселя от источника света с глубиной, которую мы записали в соответствующем пикселе на карте теней. Если глубина карты теней меньше, то это означает, что между светом находится другая поверхность, и вместо этого мы рисуем этот пиксель в тени.
Существует множество классных приемов, которые делают эти тени на карте более привлекательными, с меньшим количеством артефактов / псевдонимов, но пока я их затушевываю. Достаточно сказать, что они, как правило, тоже не свободны.
Потому что это требует рендеринга (вплоть до) всей сцены снова с точки зрения каждого источника света - до шести раз, если это точечный источник света, который светит во всех направлениях {север, юг, восток, запад, вверх, вниз}, и нам нужно -поставлять карту теней в любое время, когда что-то движется, это может стать очень дорогим.
Поэтому игры часто фокусируют свой бюджет на рендеринг на самых важных источниках света в сцене - таких как направленный солнечный свет - чтобы они имели хорошо выглядящие тени. Маленькие, недолговечные, незначительные огни, такие как вспышка взрыва, часто простительны, если они немного просачиваются через окклюдеры. Зачастую это более приемлемо для игроков, чем заминка в частоте кадров из-за внезапного увеличения стоимости рендеринга из-за всех дополнительных рендеринга и вычислений карты теней. Особенно, если это занятая сцена действия, где текучесть важнее, чем совершенство пикселей.
источник
Короче говоря, это происходит по причинам производительности.
Когда на экране есть свет, по умолчанию он светит на всех объектах (заблокированных или нет), поэтому игре нужно будет сделать дополнительные вычисления, чтобы увидеть, на какой объект что влияет.
Это легче решить на статических объектах, используя статическое и запеченное освещение, но это не то же самое для динамических источников света, таких как взрывы, как вы заметили.
На ваш бонусный вопрос трассировка лучей и дешёвка не идут вместе в одном предложении. Единственная причина, по которой трассировка лучей до сих пор не получила широкого распространения, - это производительность. Предполагая, что все источники света используют трассировку лучей, эта проблема будет «решена», но за счет производительности.
источник