Вместо того, чтобы найти один, измените способы расчета.
I'm using GLSL fragment shaders for GPGPU calculations (I have my reasons).
Я не уверен, какая у вас версия OpenGL, но использование компьютерного шейдера поверх FS решит проблему
In nSight I see that I'm doing 1600 drawcalls per frame.
Вы имеете в виду фактические колл-колы OpenGL? это может быть одной из причин наверняка. Вы можете нарисовать что-то на FBO, чтобы рассчитать их с помощью GPU. В этом большая разница между компьютерным шейдером и фрагментным шейдером. Рисование звонков всегда тормозит программу, но компьютерный шейдер.
Архитектурным преимуществом вычислительных шейдеров для обработки изображений является
что они пропускают шаг ROP (Render output unit). Очень вероятно, что пишет из пикселя
шейдеры проходят через все обычные аппаратные средства смешивания, даже если вы этого не сделаете
используйте это.
Если вам нужно как-то использовать FS, тогда
- попытайтесь найти уменьшение количества вызовов.
- найти способ хранения рассчитываемых данных.
Это было бы похоже на использование текстур рендеринга в качестве памяти, если вам нужно менять вершины с помощью RTT, вам нужно будет загружать текстуры как положение, скорость или все, что вам нужно, чтобы изменить вершины или их атрибуты, такие как normal / color.
Чтобы найти истинную причину, лучше использовать GPU и профилировщики GPU в зависимости от вашего чипсета и ОС.