Начните с pyglet. Он содержит лучший высокоуровневый API, который содержит все, что вам нужно для начала, от открытия окна до рисования спрайтов и примитивов OpenGL с использованием их дружественных и мощных классов Sprite и Batch.
Позже вы также можете написать свой собственный низкоуровневый код, который выполняет вызовы непосредственно для функций OpenGL, таких как glDrawArrays и т. Д. Вы можете сделать это, используя привязки Pyglet OpenGL или PyOpenGL. Хорошей новостью является то, что независимо от того, что вы используете, вы можете вставить такие вызовы прямо в середину вашего существующего приложения Pyglet, и они будут «просто работать». Переход вашего кода из Pyglet в PyOpenGL довольно прост, поэтому вам не нужно беспокоиться об этом заранее. Обмен между этими двумя:
Привязки PyOpenGL делают интерфейс OpenGL более дружественным и питонным. Например, вы можете передавать массивы вершин в разных формах, массивы ctypes, массивы numpy, простые списки и т. Д., А PyOpenGL преобразует их во что-то, что OpenGL может использовать. Подобные вещи делают PyOpenGL действительно простым и удобным.
Привязки pyglet OpenGL генерируются автоматически и не так удобны для использования, как PyOpenGL. Например, иногда вам придется вручную создавать объекты ctypes, чтобы передавать виды аргументов типа «указатель C» в OpenGL. Это может быть неудобно. Плюс, однако, это то, что привязки pyglet, как правило, значительно быстрее.
Это означает, что существует оптимальное среднее положение: используйте pyglet для управления окнами, событиями мыши, звуком и т. Д. Затем используйте дружественный API PyOpenGL, когда вы хотите совершать прямые вызовы функций OpenGL. Затем при оптимизации замените только небольшой процент критичных к производительности вызовов PyOpenGL, которые находятся в вашем внутреннем цикле рендеринга, эквивалентами pyglet. Для меня это дает в 2–4 раза более высокую частоту кадров, с удобством PyOpenGL для 90% моего кода.