Фантастическая активность
Ладно, попробуем с др стороны. Обычная схема: eсть "клиент" - объект который использует шейдер.
C++ (Qt)
typedef QMap<MyObject *, QSharedPointer<Shader> > TShaderMap;
Недостаток в том что оказывается очень хлопотно отслеживать эту мапу. Клиент может быть удален или "пересесть" на др шейдер, или использовать еще шейдер(ы). Заботиться обо всем этом в десятках (или даже сотнях) мест явно не хочется.
В принципе вариант "максимум 100 (или др число) шейдеров" (простецкий LRU) вполне бы устроил. Если грохнули какой-то шейдер - не беда, его всегда можно опять создать, главное чтобы это не случалось при каждом рисовании. Но не с потолка же брать это 100. Итак что есть на руках
- MyObject * известен на момент рисования (ID имеется)
- Начало и конец рисования в данном окне (вот правда окон много)
- Ну и конечно "ключ" шейдера (по которому он ищется/создается)