Программа не нагружает ни процессор ни видеокарту на 100%, что делать (openGL)?
Загрузка процессора на 100% обычно означает загрузку всех ядер. В вашем случае приложение однопоточное, и может загрузить только одно.
Вполне вероятно что даже одно ядро будет большую часть времени ожидать отправки данных в видеокарту и не будет загруженно на все 100.
Загрузка GPU еще более сложное понятие. Там уже могут быть сотни ядер и распределение нагрузки на них зависит от кучи параметров.
Есть программы профайлеры, которые могут показать некоторую дополнительную информацию о вашей программе.
Для NVIDIA есть https://developer.nvidia.com/nsight-systems 
С их помощью можно увидеть что именно делает программа большую часть времени.
Тут еще вмешивается Vsync который ограничивает fps скоростью обновления монитора. Так что большую часть времени происходит ожидание.
Программа написана на старорежимном OpenGL, не использует дисплейные списки - куча времени уходит на пересылку команд по шине.
Используйте шейдеры.