PyOpenGl или pyglet? - PullRequest
       20

PyOpenGl или pyglet?

24 голосов
/ 11 ноября 2008

Я собираюсь немного поработать с openGL и Python и не смог найти веских причин для использования PyOpenGl против pyglet

Что бы вы порекомендовали и почему?

Ответы [ 9 ]

32 голосов
/ 22 ноября 2010

Начните с 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% моего кода.

29 голосов
/ 11 ноября 2008

Как сказал Тони, это действительно будет зависеть от ваших целей. Если вы «возитесь», пытаясь узнать об OpenGL или 3D-рендеринге в целом, я бы обошелся без всяких шуток и начал бы работать с PyOpenGL, который настолько близок, насколько вы собираетесь перейти к «сырому» 3D-программированию с использованием Python .

С другой стороны, если вы «переделываете» путем макетирования игрового или мультимедийного приложения или пытаетесь узнать о методах программирования в целом, Pyglet сэкономит вам много времени на предварительную разработку, предоставляя хуки для входных событий, звуков, текста / рекламных щитов и т. д. Часто эти первоначальные инвестиции мешают людям завершить свои проекты, поэтому не стоит игнорировать их выполнение для вас. (Это также очень Pythonic, чтобы не изобретать велосипед.)

Если вы хотите выполнять какие-либо тяжелые работы (которые обычно выходят за рамки моего определения «ковыряться», но, возможно, нет, если вы работаете с 3D-дизайном двигателя), то вы можете взглянуть на Python-Ogre, который включает в себя очень полнофункциональный и надежный OGRE 3D графический движок.

7 голосов
/ 06 июля 2016

Попробуйте ModernGL .

pip install ModernGL
  • PyOpenGL - это автоматически сгенерированная версия оригинального API OpenGL (сгенерированная с помощью SWIG). Оригинальный API OpenGL не является дружественным для Python. Сгенерированные привязки Python трудно использовать.

  • pyglet в основном предназначен для создания окон и обработки событий, однако вы можете использовать API, аналогичный PyOpenGL (например, pyglet.gl.glClearColor)

  • pygame предоставляет окно, в котором вы можете использовать PyOpenGL для рендеринга.

  • ModernGL - отличная альтернатива PyOpenGL. Вы можете использовать современный OpenGL API с меньшим количеством написанного кода. ModernGL не будет создавать само окно, но вы можете интегрировать его в pyglet , pygame , PyQt5 и даже в GLUT .

В ModernGL вы можете создать простую шейдерную программу с одним вызовом:

prog = ctx.program(
    vertex_shader='''
        #version 330
        in vec2 in_vert;
        void main() {
            gl_Position = vec4(in_vert, 0.0, 1.0);
        }
    ''',
    fragment_shader='''
        #version 330
        out vec4 f_color;
        void main() {
            f_color = vec4(0.3, 0.5, 1.0, 1.0);
        }
    ''',
)

С ModernGL у вас есть полный контроль над OpenGL API.

6 голосов
/ 03 января 2009

Я бы сказал, что Pyglet на самом деле более развит, чем PyOpenGL. У него хороший API и полная оболочка для OpenGL, доступ к которой осуществляется через модуль pyglet.gl! PyOpenGL даже не включает в себя все функции, которые есть в OpenGL. В Pyglet также есть отличная библиотека для рендеринга 2D с аппаратным ускорением через OpenGL, и она действительно хорошо сделана.

Если вам нужен мощный готовый 3D-движок, у вас есть Огр и все такое

4 голосов
/ 09 декабря 2012

Хм, я бы предложил pyglet, он действительно предоставляет все необходимое для игры или приложения.

Имейте в виду, вы можете делать много вещей, которые pyglet делает с PyOpenGL, например, чтобы создать окно, все что вам нужно сделать:
glutInitWindow (название)

Хотя я думаю, что glutInitDisplayMode должен вызываться до этого.

Простая сводка: если вы не хотите писать код, пока не заплачет, выберите pyglet, но если вы хотите стать мастером, выберите PyOpenGL. Перейдите к http://pyopengl.sourcefourge.net, чтобы прочитать документы на PyOpenGL, и к http://pyglet.org, чтобы прочитать документы на Pyglet. Надеюсь, это было полезно!

4 голосов
/ 11 ноября 2008

Я продвигаю pyglet, потому что у него самый красивый API, который я когда-либо видел на подобных вещах.

Pyglet также имеет API opengl. Но часто лучше использовать недавно добавленную поддержку списка вершин.

pyglet.gl

4 голосов
/ 11 ноября 2008

В Pyglet есть много приятных дополнений (например, загрузка изображений и звука). Если вы начинаете, я сначала попробую pyglet, а затем переключусь на PyOpenGL, если вы чувствуете, что хотите приблизиться к металлу.

Действительно важный вопрос: чего вы пытаетесь достичь?

3 голосов
/ 07 марта 2010

GL API pyglet далеко не так хорош, как PyOpenGL - pyglet находится на уровне необработанных ctypes, что означает, что вам также нужно изучать ctypes. Если вы планируете заниматься программированием на OpenGL, вам нужно использовать PyOpenGL.

Приятно то, что вы можете отлично смешать два. Используйте pyglet для предоставления контекста GL, звуков, событий, загрузки изображений и управления текстурами, рендеринга текста и т. Д. И т. Д. Используйте PyOpenGL для фактического программирования OpenGL, которое вам нужно сделать.

3 голосов
/ 29 декабря 2008

Я бы порекомендовал Pyglet, потому что это очень легко начать и иметь что-то базовое, а затем вы можете добавить более продвинутые техники в своем собственном темпе.

...