Есть куча объектов на сцене, часть из них светиться, часть нет.
Алгоритм таков:
1. Рендерим все в FB0
2. Снова рендерим все в FB1, но не светящиеся объекты рендерим сплошным черным
3. Размываем FB1 и накладываем адитивом на FB0
Два раза рендерить сцену затратно как-то. МРТ нет (OpenGL ES 2)
Думал извратиться с цветом (типо если цвет 1, 1, 1 то светиться, иначе нет), то тогда нельзя делать разноцветное текстурное самосвечение
В общем может у кого есть какие идеи?
Спасибо заранее
Простых решений пишут что нет
Рендерить всё
Рендерить только светящиеся и накладывать блум или блур (радиальный например можно без шейдеров делать).
Можно совместить если флаг светимости будет находиться в самой текстуре, и сложный шейдер сделает всё в один проход.
oxotnik
> 3. Размываем FB1 и накладываем адитивом на FB0
твоя задача сделать блум этим объектам т.е.?
в общем, всё можно сделать так же, но без "снова рендерим все чёрным", реюзай zbuffer от FB0 и рисуй только светящиеся повторно, они готовым збуфером будут загораживаться попиксельно где надо.
другой вариант например выплёвывать флаг светимости в альфаканал рендертаргета, затем алгоритм блюра пусть блюрит color*alpha, т.е. только светящееся.
oxotnik
В один проход пиши светимость объектов в альфу, потом разблюришь по альфе в постпроцессе.
Попробовать исключить из цикла отрисовки не светящиеся объекты, а не рендерить черным.
Wraith
> В один проход пиши светимость объектов в альфу, потом разблюришь по альфе в
> постпроцессе.
Забыл совсем уточнить. Все в 2д, естественно альфа нужна, z bufferа нет:(
K4t3N0k
> Попробовать исключить из цикла отрисовки не светящиеся объекты, а не рендерить
> черным.
тут фишка в том, что не светящийся объект может перекрывать светящийся, я тут думал как вариант заюзать стенсил буффер как флажок светимости, но пока особо не придумал как
oxotnik
А почему збуфера нет?
bool
Зачем мне в 2д zbuffer? когда все на одной плоскости + работа c zbufferom это какой-никакой, но оверхэд
Так же все рисуется в зависимости от порядка, (примерно как Node в Cocos2d )
oxotnik
А, я думал что-то более серьезное. Ну тогда ответ на вопрос, зачем тебе збуфер, содержится в твоем вопросе)
bool
Не особо понял, хранить в zbuffer флаг светимости? При этом отключить zwrite и ztest и писать в z вручную?
Но если у тебя 2d, то почему тебя так беспокоит оптимизация?
Кстати, можно писать в HDR цвет так, чтобы цвета до 1 были у обычных объектов, а >1 у светящихся.
Потом это хэндлить как-то в финальном проходе.
-Eugene-
Потому что нужно 4k 60fps на Android TV
Думал по HDR, но насколько затратно это?
Если есть деление на слои не рендерить все что ниже светящихся(фон), попробовать отсекать через коллизию двух прямоугольников те которые не сталкиваются со светящимися(можно раз в несколько кадров).
А вообще попробовать то что ты изначально предлагал и посмотреть на скорость.
K4t3N0k
Тот алгоритм, что я давал в самом начале уже реализован. И он тормозит:(
Идея с отсеканием фона показалась отличной, т.к. сейчас рендеринг фона занимает большую половину времени. (из-за того, что фон покрывает 80% пикселей экрана).
Думаю еще добавить дополнительный if в шейдер рендера, что б если color == Black, то не сэмплим из текстуры ()
Но вот все таки интересует вопрос: можно ли как-то использовать stencil buffer для своих целей, в качестве флагов?
Можно попробовать в каждый например 8-мой пиксель по горизонтали и вертикали выводить свечение. Потом вычленить и размыть, а дырки на основном буффере замазать.
Тема в архиве.