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

Unity3D: HxVolumetricLighting с несколькими камерами

#0
21:03, 25 мар. 2020

Привет всем!
Нужно сделать так, чтобы плагин HxVolumetricLighting работал с несколькими камерами. Кто-нибудь пробовал уже это сделать?
Есть несколько камер которые:
1) рендерят по очереди depth в RenderTexture FinalTex
2) каждая камера пишет цвет в RGB и depth в A-канал

В итоге у меня вроде все есть чтобы плагин рисовал лучи. Плагин я вешаю на последнюю камеру и заменяю _CameraDepthTexture на _FinalTex.

Ну и везде переписываю все типа так: Linear01Depth(tex2Dlod(_FinalTex, UV).a);
Как результат все работает криво: некоторые лучи рисуются поверх стен, а не должны.
Думал, что проблема в A-канале, вроде в ним все нормально.
Формат FinalTex текстуры : depth 32, ARGB32.

Понятно, что ванг нет, и что проблема может быть вообще в чем угодно, но все же.
Есть идеи что может быть не так? Может кто-то уже переписывал плагин под себя и столкнулся с этим?


#1
(Правка: 2:34) 2:33, 26 мар. 2020

Я так понимаю что это ScreenSpace механика.
Пробовал поэтапно, делать замену _CameraDepthTexture, только для одной камеры и смотреть в чем разница? А лучше вывести саму _CameraDepthTexture как она используется с расчетом _FinalTex и сравнить их результаты.

#2
(Правка: 14:14) 14:14, 26 мар. 2020

foxes
> Я так понимаю что это ScreenSpace механика.
> Пробовал поэтапно, делать замену _CameraDepthTexture, только для одной камеры и смотреть в чем разница? А лучше вывести саму _CameraDepthTexture как она используется с расчетом _FinalTex и сравнить их результаты.

Как раз это и пробую.
План такой: все камеры по очереди будут дозаписывать буффер глубины в текстуру с помощью SetTargetBuffers.
На сколько понял, SetTargetBuffers позволяет "дозаписывать" глубину.
Вот пытаюсь использовать SetTargetBuffers, но пока безуспешно.

Я не понимаю что такое ColorBuffer и depthBuffer у renderTexture. Я так понимаю, RenderTexture - это текстура заданного формата (формат задается при создании, например ARGB32). А что такое depth у этой ткстуры (это отдельная текстура получается или что?)? Почему depth может быть только 16 или 24? Может он быть 32 (4 байта)?

#3
17:17, 26 мар. 2020

Alerr
> Может он быть 32 (4 байта)?

может

#4
(Правка: 16:07) 14:50, 27 мар. 2020

Много всего перепробовал за 2 дня, результат один - не работает.

Написал несколько писем разработчику плагина, получил ответ:

+ Показать

У меня в сцене 4 камеры. Каждая из этих камер рендерит разные обьекты. Последняя камера содержит скрипт плагина лучей.
Первая камера чистит буффер глубины (Depth only). Остальные камеры не меняют буфферы глубины. Все выглядит так:

+ Показать

Плагин добавляет следующие CommandBuffers:
-- | Unity3D: HxVolumetricLighting с несколькими камерами

На сколько я понимаю, моя цель - сделать так, чтобы текстура глубины собралась со всех камер и дошла до камеры с плагином.
Для этого я добавил на каждую камеру такой скрипт:

+ Показать

Скрипт переназначает вывод с камеры: глубину в depthTex, цвет в colorTex
colorTex и depthTex такого формата:

+ Показать

Еще есть такой скрипт:

[code]public class SetGlobalTex : MonoBehaviour {

    [SerializeField] RenderTexture depthTex;

    void Awake() {
        Shader.SetGlobalTexture ( "_CameraDepthTexture", depthTex );
    }
}
_CameraDepthTexture я пробовал переименовывать во всем проекте в _CameraDepthTextureCustom, на всякий случай. Но это кажется ничего не дало.

В целом я так и не понял: SetTargetBuf в итоге заменяет текстуру глубины или нет. Можете посмотреть  видео  с FrameDebugger?
Еще мне не нужно менять Color TargetBuffer (я думаю), я пробовал сделать myCam.SetTargetBuffers ( Display.main.colorBuffer, depthTex.depthBuffer );, но почему-то это не работает, выдает:

You're trying to mix color and depth buffers from RenderTexture and from screen.
UnityEngine.Camera:SetTargetBuffers(RenderBuffer, RenderBuffer)
SetTargetBuf:Awake() (at Assets/Scenes/Scripts/SetTargetBuf.cs:39)

Это попытка вывести картинку на экран, а глубину в текстуру.
Могу скинуть тестовый проект, если кто-то сможет помочь разобраться.

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