Давайте посмотрим на # 1:
Учитывая, что каждый объект может иметь свой собственный материал, он включает в себя множество вызовов glUseProgram.
Это не так уж многосделки, правда.Менять программы сложно, но вы бы тоже поменялись текстурами, так что это не значит, что вы еще не меняете важное состояние.
Предполагается создание большого количества объектов шейдерной программы.
Это будет больно.Действительно, главная проблема с # 1 - взрывная комбинация шейдеров.Хотя ARB_separate_program_objects поможет, это все равно означает, что вам нужно написать много шейдеров или придумать способ не писать много шейдеров.
Или вы можете использовать отложенный рендеринг ,что помогает смягчить это.Одним из его многочисленных преимуществ является то, что он отделяет генерацию данных материала от вычислений, которые преобразуют эти данные материала в коэффициент отражения света (цвета).Из-за этого у вас гораздо меньше шейдеров для работы.У вас есть набор шейдеров, которые создают данные материала, и набор, который использует данные материала для вычислений освещения.
Так что я бы сказал, использовать # 1 с отложенным рендерингом.