- Рейтинг
- 14
Пишу свой первый шейдер.
Застрял на реализации point-cloud-based color bleeding'а. Документацию по нему прочитал, но проблемы остались.
Сложность - в том, что сцену надо рендерить 2 раза. При этом в первый раз назначать один простой шейдер (который бэйкает цвета в point-cloud). А во второй - другой, который рендерит со всеми прелестями (в том числе считает индирект по полученному поинт-клауду).
Конечно, это можно реализовать по-простому через майские рендер-леера. Но гораздо логичнее и удобнее сделать так, как ведут себя дефолтные шейдера в RFM'е:
Соответственно, у меня вопрос: как непосредственно из RSL'а получать данные от рендер-пасса?
А именно:
Застрял на реализации point-cloud-based color bleeding'а. Документацию по нему прочитал, но проблемы остались.
Сложность - в том, что сцену надо рендерить 2 раза. При этом в первый раз назначать один простой шейдер (который бэйкает цвета в point-cloud). А во второй - другой, который рендерит со всеми прелестями (в том числе считает индирект по полученному поинт-клауду).
Конечно, это можно реализовать по-простому через майские рендер-леера. Но гораздо логичнее и удобнее сделать так, как ведут себя дефолтные шейдера в RFM'е:
- Создаётся дополнительная нода, в которой централизованно указаны все параметры бэйка в поинт-клауд. В RFM - это Environment Light. Все шейдеры берут параметры бэйка из неё.
- Сама эта нода связывается с нодой рендер-пасса. В рендер-пассе указано, куда сохраняется файл с облаком точек.
- При рендере через этот связанный рендер-пасс на все объекты назначается первый шейдер (простой, запекающий), при финальном пассе - второй (основной, читающий).
Соответственно, у меня вопрос: как непосредственно из RSL'а получать данные от рендер-пасса?
А именно:
- Как вообще узнать, через какой пасс идёт текущий рендер? Чтобы в зависимости от этого через простой if () выполнять в шейдере вообще другой код (как RFM'овский первый, простой шейдер).
- Как получить параметры "запекающего" рендер-пасса? Конкретно - файл, в который запекать и собственно название этого пасса (для вышеупомянутого сравнения в if() ).
- В идеале - через ту самую ноду Environment Light. Чтобы оттуда же брать все параметры бэйка. Но этих нод в сцене может быть несколько (чтобы бейкать свет сетами / бейкать при разных параметрах), поэтому нельзя просто создать доп. атрибут, через который прилинковать шейдер к ноде Environment Light. Нужно как-то по-хитрому узнавать, какой Environment Light прицеплен к текущему рендер-пассу.
- Если через неё не получится - хотя бы связывать шейдер с нодой пасса напрямую. Костыль, но не такой кошмарный, как использование майских рендер-лееров с оверрайдами.