Я настраивал свой рендеринг для моего ноутбука, у которого есть Radeon HD 3850. У этого чипа есть приличная мощность обработки, но ограниченная пропускная способность памяти, поэтому я пытаюсь переместить больше шейдерной работы в меньше проходов.
Раньше я использовал простую многопроходную модель:
- Свяжите и очистите буфер смешивания FP16 (с буфером глубины)
- Только для глубины
- Для каждого света выполните вспомогательный световой проход
- Свяжите backbuffer, используйте буфер смешивания как текстуру
- Передача тонального сигнала
В попытке улучшить производительность этого метода я написал новый путь рендеринга, который подсчитывает количество и тип огней для динамической сборки пользовательских шейдеров GLSL. Эти шейдеры принимают все параметры света как униформы и делают все освещение за один проход. Я ожидал столкнуться с каким-то пределом, поэтому сначала проверил его с одним светом. Затем три. Затем двадцать один, без ошибок или артефактов, и с отличной производительностью. Это приводит меня к моим актуальным вопросам:
Можно ли восстановить максимальное количество униформ?
Является ли этот метод жизнеспособным на более раннем оборудовании или более унифицированы?
Если я надаю слишком далеко, в какой момент я получу ошибку? Компиляция шейдера? Связывание программ? Использование программы?