PyOpenGl или пиглет?

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
25
0
17 432
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

Привет. Незначительное уточнение: я считаю, что описание PyOpenGL как «ближе к металлу» может ввести в заблуждение. Это правда, что PyOpenGL не предлагает того же высокоуровневого материала, что и Pyglet, но, с другой стороны, привязки OpenGL, предоставляемые PyOpenGL, более дружелюбны, питоничны и медленнее, чем привязки OpenGL в pyglet.

Jonathan Hartley 24.11.2010 20:54
Ответ принят как подходящий

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

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

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

Кто-нибудь знает, так ли это по состоянию на февраль 2013 года?

abelito 19.02.2013 04:18

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

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

pyglet.gl

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

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

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

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

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

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

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

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

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

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

В последних версиях Pyglet (1.3, в настоящее время в стадии бета-тестирования) добавлена ​​дополнительная поддержка для выполнения прямых вызовов openGL и указания вершин opengl для передачи пакетам Pyglet.

Jonathan Hartley 03.01.2018 19:33

Скажем, я планировал интегрировать свое приложение opengl в инструментарий, такой как wxpython, имеет ли смысл переходить на pyglet, или мне следует придерживаться pyopengl?

gmagno 23.02.2019 18:25

@gmagno Стоит прочитать: mail.python.org/pipermail/python-list/2008-De December/468416.h‌ tml

theGtknerd 24.02.2019 02:48

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

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

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

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

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

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

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

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

  • ModernGL - отличная альтернатива PyOpenGL. Вы можете использовать современный OpenGL API с меньшим количеством написанного кода. ModernGL не создает окно самостоятельно, но вы можете интегрировать его в пиглет, Pygame, PyQt5 и даже в GLUT. Редактировать Теперь вы можете использовать moderngl-window для самостоятельного создания окон. pip install moderngl-window

В 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.

Привет, если вы продвигаете свою библиотеку, вы должны хотя бы раскрыть, что являетесь автором этой библиотеки. Учитывая, что OP заинтересован в «PyOpenGl или pyglet», этот ответ больше похож на спам, чем на ответ на вопрос.

Yakov Galka 04.12.2020 07:33

Другие вопросы по теме