Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Сентябрь 12, 2016, 10:08



Название: Динамическое создание шейдеров
Отправлено: Igors от Сентябрь 12, 2016, 10:08
Добрый день

Сейчас в приложении используется один GLSL шейдер "на все случаи жизни", который давно превратился в монстра и работает медленно. Основной метод ускорения в GLSL - разбивка большого шейдера на более мелкие. При этом неважно что из большого шейдера активно только, к примеру, 10% кода, он все равно остается медленным, неактивный код все равно потребляет ресурсы GPU (до сих пор не могу у этому привыкнуть).

Сама по себе разбивка трудностей не вызывает. Упрощенный пример: объект имеет текстуры - генерим для него один шейдер, не имеет - другой. Объект должен рисоваться wireframe - третий, с "заливкой" (phong) - четвертый и.т.д. Хотя реально этих вариантов больше, но общее число шейдеров остается небольшим, в пределах десятков, если, конечно неиспользуемые шейдеры будут удаляться, а созданные юзаться 2-мя и более объектами. Вроде обычная логика "шаред", но не соображу как это оформить.

Вот все случаи когда для объекта нужно сменить шейдер - сгенерить новый (если такого еще нет) и/или
удалить старый если нет больше объектов его использующих

1) Юзер может создать/удалить объект
2) Юзер может изменить опции самого объекта (напр назначить или убрать текстуру)
3) Юзер может открыть/закрыть каждое окно в котором рисуется объект, или изменить опции окна. Напр в одном окне объект должен рисоваться только wireframe, в другом - только с заливкой, а в третьем юзер решает как.

Как же мне построить такую мапу (или несколько)?

Спасибо


Название: Re: Динамическое создание шейдеров
Отправлено: Igors от Октябрь 07, 2016, 12:39
Фантастическая активность :) Ладно, попробуем с др стороны. Обычная схема: eсть "клиент" - объект который использует шейдер.
Код
C++ (Qt)
typedef QMap<MyObject *, QSharedPointer<Shader> > TShaderMap;
 
Недостаток в том что оказывается очень хлопотно отслеживать эту мапу. Клиент может быть удален или "пересесть" на др шейдер, или использовать еще шейдер(ы). Заботиться обо всем этом в десятках (или даже сотнях) мест явно не хочется.

В принципе вариант "максимум 100 (или др число) шейдеров" (простецкий LRU) вполне бы устроил. Если грохнули какой-то шейдер - не беда, его всегда можно опять создать, главное чтобы это не случалось при каждом рисовании. Но не с потолка же брать это 100. Итак что есть на руках

- MyObject * известен на момент рисования (ID имеется)
- Начало и конец рисования в данном окне (вот правда окон много)
- Ну и конечно "ключ" шейдера (по которому он ищется/создается)


Название: Re: Динамическое создание шейдеров
Отправлено: __Heaven__ от Октябрь 07, 2016, 14:46
Не совсем понятно, зачем вы удаляете шейдеры при их неиспользовании, а потом снова конструируете при необходимости. Пусть себе живут на протяжении всей жизни программы.

Вы говорили, что у вас есть некий менеджер шейдеров, можно ему доверить хранить все программы.
Пусть объект обладает методом, который будет возвращать флаги, на основании которых можно подобрать нужный шейдер.
Допустим типа flags = Phong | Textures. Менеджер вам прикрутит необходимую для данного объекта программу.
Кстати, удобно будет хранить в члене менеджера типа QMap соотношение флагов и шейдеров.

Я как-то так это вижу.


Название: Re: Динамическое создание шейдеров
Отправлено: Igors от Октябрь 07, 2016, 15:22
Не совсем понятно, зачем вы удаляете шейдеры при их неиспользовании, а потом снова конструируете при необходимости. Пусть себе живут на протяжении всей жизни программы.
Потому что число материалов (т.е. вариантов) не фиксировано, юзер может их свободно создавать/удалять.

Допустим типа flags = Phong | Textures
Там флажков уже десятка 2 набралось :) Напр сколько текстур (от 0 до 8 ). Как мапятся текстуры (от 0 до 5) и.т.д.


Название: Re: Динамическое создание шейдеров
Отправлено: __Heaven__ от Октябрь 07, 2016, 15:40
Там флажков уже десятка 2 набралось :)
Ничего страшного, int вмещает 32 флажка. Можно и bitset задействовать при необходимости.

текстур (от 0 до 8 ). Как мапятся текстуры (от 0 до 5) и.т.д.
Я не работал плотно с текстурами. Примеры из книги предлагали использовать одну программу для наложения нескольких текстур. А что у вас под этими цифрами 0..8, 0..5?


Название: Re: Динамическое создание шейдеров
Отправлено: Igors от Октябрь 07, 2016, 16:37
Я не работал плотно с текстурами. Примеры из книги предлагали использовать одну программу для наложения нескольких текстур. А что у вас под этими цифрами 0..8, 0..5?
0..7 число используемых текстур (и соответственно самплеров). Не все операции с текстурами можно уложить в for. А 0..5 как мапятся. Напр кубик карта солидный кусок кода который нужен редко. Ну и вообще с "материалом" (хоть и без текстур) стоит только начать - польется сразу. Это только в книге маленький ошметок  :)