Я был не точен, действительно, буффер глубины в случае с URP надо скопировать в отдельную текстуру.
Я бы все-равно проверил время отработки копирования с резолвом для depth буфера, на пк это происходит довольно быстро (средней нагруженности сцена, меньше 0.1мс)
Unity как правило выполняет DepthPrepass в начале кадра и эта текстура и называется _CameraDepthTexture. Вам не нужно копировать, вам нужно семплить прямо из неё. Она к моменту использования уже готова.
Зачем сцену рисовать дважды? Depth текстура рендерится в процессе отрисовки непрозрачной геометрии, вам нужно в вашем кастом проходе использовать её (погуглите _CameraDepthTexture).
Резолвить тоже не нужно, это ведь тень. Если у нее будет не до конца точная геометрия, игрок это не заметит. Семплинг глубины тут нужен не для того, чтобы определить, какие объекты перекрывают тень, а для того, чтобы понять как её проецировать поверх них.
Этот подход в мобильных играх на девайсах из 2010-х работает стабильно, уверен что для свитча это не проблема.
В любом случае, ваша работа уже выполнена и будет странно всё переделывать)
ИМХО, безумное количество работы ради незначительного эффекта, которого можно было бы достичь меньшими затратами. Особенно примечательно, что других теней в сцене вообще нет и все силы стоило бы бросить на решение этой проблемы.
В индустрии давно используются обычные Box меши, которые размещаются под днищем объекта, в данном случае танка. В шейдере семплим depth текстуру и через object-space определяем, находится ли пиксель внутри этого бокса. Если да, то смешиваем с фоном. Ну и разумеется мы это все делаем после Tansparent прохода.
Вы пишете, что семплинг depth текстуры слишком дорог, но это выглядит довольно странно. Может быть вы написали неэффективный шейдер, который семплит каждый пиксель? В этой реализации мы "смотрим" малую часть этого буффера, только ту, которую занимает box. В норме такой подход вообще должен быть бесплатен для одного бокса (по моим данным 0.009мс при времени кадра 33мс, платформа PC).
Я был не точен, действительно, буффер глубины в случае с URP надо скопировать в отдельную текстуру.
Я бы все-равно проверил время отработки копирования с резолвом для depth буфера, на пк это происходит довольно быстро (средней нагруженности сцена, меньше 0.1мс)
Что вы имеете ввиду под "сформировать"? Вся сцена уже отрендерена в нее, вы можете семплить из буффера глубины "как есть". Используйте
float sceneZ = LOAD_TEXTURE2D(_CameraDepthTexture, somePosition.xy).x;
И вы получите данные из нее без необходимости куда-то копировать
Unity как правило выполняет DepthPrepass в начале кадра и эта текстура и называется _CameraDepthTexture. Вам не нужно копировать, вам нужно семплить прямо из неё. Она к моменту использования уже готова.
Не поленюсь продемонстрировать
Зачем сцену рисовать дважды? Depth текстура рендерится в процессе отрисовки непрозрачной геометрии, вам нужно в вашем кастом проходе использовать её (погуглите _CameraDepthTexture).
Резолвить тоже не нужно, это ведь тень. Если у нее будет не до конца точная геометрия, игрок это не заметит. Семплинг глубины тут нужен не для того, чтобы определить, какие объекты перекрывают тень, а для того, чтобы понять как её проецировать поверх них.
Этот подход в мобильных играх на девайсах из 2010-х работает стабильно, уверен что для свитча это не проблема.
В любом случае, ваша работа уже выполнена и будет странно всё переделывать)
ИМХО, безумное количество работы ради незначительного эффекта, которого можно было бы достичь меньшими затратами. Особенно примечательно, что других теней в сцене вообще нет и все силы стоило бы бросить на решение этой проблемы.
В индустрии давно используются обычные Box меши, которые размещаются под днищем объекта, в данном случае танка. В шейдере семплим depth текстуру и через object-space определяем, находится ли пиксель внутри этого бокса. Если да, то смешиваем с фоном. Ну и разумеется мы это все делаем после Tansparent прохода.
Вы пишете, что семплинг depth текстуры слишком дорог, но это выглядит довольно странно. Может быть вы написали неэффективный шейдер, который семплит каждый пиксель? В этой реализации мы "смотрим" малую часть этого буффера, только ту, которую занимает box. В норме такой подход вообще должен быть бесплатен для одного бокса (по моим данным 0.009мс при времени кадра 33мс, платформа PC).
В простейшей реализации даже текстуры не нужны, все задается параметрами материала.
С этого стоит начать ресерч: https://godotshaders.com/shader/decal-example/