Подтвердить что ты не робот

PyOpenGl или пиглет?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Начните с пиглета. Он содержит лучший API высокого уровня, который содержит все, что вам нужно для начала, от открытия окна до рисования спрайтов и примитивов OpenGL с использованием их дружественных и мощных классов Sprite и Batch.

Позже вы также можете написать свой собственный код нижнего уровня, который напрямую вызывает вызовы функций OpenGL, таких как glDrawArrays и т.д. Вы можете сделать это, используя привязки OpenGL пиглета или используя PyOpenGL. Хорошей новостью является то, что в зависимости от того, что вы используете, вы можете вставлять такие звонки прямо в середину существующего приложения pyglet, и они будут "просто работать". Переход кода с Pyglet на PyOpenGL довольно прост, поэтому это не решение, о котором вам нужно беспокоиться о слишком большом авансе. Торги между ними:

Связывание PyOpenGL делает интерфейс OpenGL более дружественным и pythonic. Например, вы можете передавать массивы вершин в разных формах, массивах ctypes, массивах numpy, простых списках и т.д., А PyOpenGL преобразует их во что-то, что может использовать OpenGL. Такие вещи делают PyOpenGL очень простым и удобным.

pyglet Связывание OpenGL автоматически генерируется и не так дружелюбен к использованию как PyOpenGL. Например, иногда вам придется вручную создавать объекты ctypes, чтобы передавать типы аргументов "C-указатель" в OpenGL. Это может быть неудобно. Плюс-сторона, однако, является привязкой пиглетов, как правило, значительно быстрее.

Это означает, что существует оптимальная промежуточная площадка: используйте pyglet для окон, событий мыши, звука и т.д. Затем используйте дружественный API PyOpenGL, когда вы хотите совершать прямые вызовы функций OpenGL. Затем при оптимизации заменяйте только небольшой процент критически важных вызовов PyOpenGL, которые лежат внутри вашего внутреннего цикла рендеринга с эквивалентами pyglet. Для меня это дает мне от 2 до 4 раз быстрее фреймрейтов, с удобством PyOpenGL для 90% моего кода.

Ответ 3

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

Если вам нужен мощный готовый 3D-движок, вы получите Ogre и такие

Ответ 4

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

Реальный важный вопрос, хотя: что вы пытаетесь достичь?

Ответ 5

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

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

pyglet.gl

Ответ 6

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

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

Хотя я думаю, что перед этим нужно вызвать glutInitDisplayMode.

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

Ответ 7

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

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

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

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

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

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

my_vertex_shader = ctx.vertex_shader('''
    #version 330
    in vec2 vert;
    void main() {
        gl_Position = vec4(vert, 0.0, 1.0);
    }
''')

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

Ответ 8

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

Ответ 9

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

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