Кастомные шейдеры
Последняя задача по рендерингу, которую я планировал сделать – это возможность писать и использовать кастомные шейдеры.
В Pixi для решения этой задачи можно использовать фильтры. Это такой механизм для добавления пост обработки. Фильтры влияют не только на сам объект, но и на всех его потомков. Именно поэтому я вносил доработки в рендерер и добавлял дерево, чтобы при использовании фильтров использовать это преимущество.
На практике, когда я собрал первый черновик и пошел тестировать – ничего не заработало. Как я выяснил позднее, фильтры плохо дружат со слоями, которые я использовал чтобы контролировать порядок отрисовки. Я завел issue на гитхабе Pixi, чтобы убедиться, что я понимаю все правильно и спустя месяц получил ответ мол, да это такое ограничение у RenderLayers.
Раздосадованный я продолжил искать другие варианты и остановился на мэшах. Это более низкоуровневый вариант отображения графики чем спрайт, фигура или текст, которые я уже добавил в движок. Тут нужно самостоятельно описывать вершинный и фрагментный шейдеры, задавать текстуру через uniform переменную и все что еще потребуется для отрисовки.
По итогу я реализовал новый компонент Mesh, который очень похож на уже существующий Sprite, за тем исключением, что через поле material ему можно указать скрипт с шейдерами для отрисовки. От фильтров я тоже полностью отказываться не стал и оставил возможность повесить фильтры на все сцену целиком для случаев если захочется добавить эффекты вроде CRT. И то, и другое можно создавать из шаблонов через редактор.
Шейдеры можно использовать не только для каких-то мудреных эффектов, но и для решения простых задач, вроде рисования выделения вокруг объекта или эффекта вспышки, чтобы показать получение урона. Это намного удобнее, чем тратить время на рисование дополнительных кадров в спрайте и обновлять стейт машину анимации.
Полагаю, что с отрисовкой я пока что закончил, поскольку делать одно и то же несколько месяцев – сильно утомляет. Вернусь к улучшению редактора, к тому же хочется посмотреть как с моими задачами справится Codex.