Я пытаюсь реализовать отложенный рендеринг на телефоне Android с помощью OPENGL ES 3.0. Я получил это, чтобы работать нормально, но только очень медленно, что скорее поражает весь смысл. Что действительно замедляет работу, это несколько вызовов шейдеров. Вот, вкратце, то, что мой код делает:Есть ли что-нибудь, что я могу сделать с накладными расходами от запуска шейдера несколько раз
Геометрия Pass:
Рендер сцены - выход положение, нормальный и цвет кремовый экрана буферов.
Для каждого источника света:
а) Трафарет Pass:
Рендер сферу в текущей позиции света, сортируют по размеру в соответствии с интенсивностью света. Отметьте эти пиксели под воздействием текущего света. Нет фактического выхода.
б) Light Pass:
Рендер сферы снова, на этот раз, используя данные из геометрии прохода применять световые уравнения для пикселей, отмеченных в предыдущем шаге. Добавьте это в буфер закадрового
Blit экранировать
Это это перезапуск шейдеров для каждого источника света, вызывающего узкого место. Например, при 25 лампах вышеуказанные шаги работают со скоростью около 5 кадров в секунду. Если вместо этого я сделаю: Geometry Pass/Stencil Pass - нарисуйте 25 огней/Light Pass - нарисуйте 25 огней, они работают со скоростью около 30 кадров в секунду. Итак, кто-нибудь знает, как я могу избежать повторной инициализации шейдеров? Или, по сути, просто объясните, что занимает время? Помогло бы или даже было бы возможно (и мне жаль, если это звучит глупо), чтобы сохранить шейдер «открытым» и перезаписать предыдущие данные, а не делать все, что требуется, так много времени перезапускает шейдер? Или я должен дать это как метод для многократного освещения, в любом мобильном устройстве.