【问题标题】:PyOpenGl or pyglet? [closed]PyOpenGl 还是 pyglet? [关闭]
【发布时间】:2010-09-21 17:59:19
【问题描述】:

我希望对 openGL 和 Python 进行一些修改,但找不到使用 PyOpenGl 与 pyglet 的充分理由

您会推荐哪个以及为什么?

【问题讨论】:

    标签: python pyglet pyopengl


    【解决方案1】:

    正如托尼所说,这真的取决于你的目标。如果您正在“修补”以尝试学习 OpenGL 或一般的 3D 渲染,那么我将免除所有的寒暄并开始使用 PyOpenGL,这与您将使用 Python 进行“原始”3D 编程一样接近.

    另一方面,如果您通过模拟游戏或多媒体应用程序来“修补”,或者尝试学习一般的编程实践,那么 Pyglet 将通过提供挂钩为您节省大量前期开发时间用于输入事件、声音、文本/广告牌等。通常,这种前期投资会阻止人们完成他们的项目,因此为您完成它是不容忽视的事情。 (避免重新发明轮子也是非常 Pythonic 的。)

    如果您想要进行任何类型的重型起重(这通常不属于我对“修补”的定义,但如果您正在修补 3D 引擎设计,则可能不会)那么您可能想看看Python-Ogre,它封装了 very 功能齐全且功能强大的OGRE 3D 图形引擎。

    【讨论】:

    • 有谁知道截至 2013 年 2 月这是否仍然正确?
    【解决方案2】:

    从 pyglet 开始。它包含最好的高级 API,包含您开始使用所需的一切,从打开窗口到使用友好且强大的 Sprite 和 Batch 类绘制精灵和 OpenGL 基元。

    稍后,您可能还想编写自己的低级代码,直接调用诸如 glDrawArrays 等 OpenGL 函数。您可以使用 pyglet 的 OpenGL 绑定或使用 PyOpenGL 的绑定来完成此操作。好消息是,无论您使用哪种方法,您都可以将此类调用直接插入现有 pyglet 应用程序的中间,它们将“正常工作”。将您的代码从 Pyglet 转换到 PyOpenGL 相当容易,所以这不是您需要预先担心太多的决定。两者之间的权衡是:

    PyOpenGL 的绑定使 OpenGL 界面更加友好和 Pythonic。例如,您可以传递许多不同形式的顶点数组、ctypes 数组、numpy 数组、普通列表等,PyOpenGL 会将它们转换为 OpenGL 可以使用的东西。像这样的事情让 PyOpenGL 变得非常简单和方便。

    pyglet 的 OpenGL 绑定是自动生成的,使用起来不如 PyOpenGL 友好。例如,有时您必须手动创建 ctypes 对象,以便将“C 指针”类型的参数传递给 OpenGL。这可能很繁琐。不过,好的一面是 pyglet 的绑定往往要快得多。

    这意味着有一个最佳的中间立场:使用 pyglet 进行窗口、鼠标事件、声音等。然后在您想要直接调用 OpenGL 函数时使用 PyOpenGL 的友好 API。然后在优化时,只用 pyglet 等价物替换位于内部渲染循环中的一小部分性能关键的 PyOpenGL 调用。对我来说,这让我的帧速率提高了 2 到 4 倍,而且 PyOpenGL 对我 90% 的代码都很方便。

    【讨论】:

    • Pyglet 的最新版本(1.3,目前处于测试阶段)增加了对直接调用 openGL 和指定 opengl 顶点以传递给 Pyglet 批次的支持。
    • 假设我打算将我的 opengl 应用程序集成到像 wxpython 这样的工具包中,选择 pyglet 是否仍然有意义,还是应该坚持使用 pyopengl?
    【解决方案3】:

    试试ModernGL

    pip install ModernGL
    
    • PyOpenGL 是原始 OpenGL API(使用 SWIG 生成)的自动生成版本。原始的 OpenGL API 对 python 不友好。生成的 python 绑定很难使用。

    • pyglet 主要用于窗口创建和事件处理,但是您可以使用类似 PyOpenGL 的 API(例如 pyglet.gl.glClearColor

    • pygame 提供了一个窗口,您可以在其中使用 PyOpenGL 进行渲染。

    • ModernGL 是 PyOpenGL 的绝佳替代品,您可以使用现代 OpenGL API 编写更少的代码。 ModernGL 不会自己创建窗口,但您可以将其集成到pygletpygamePyQt5 甚至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”感兴趣,这个答案看起来更像是垃圾邮件而不是回答问题。
    【解决方案4】:

    我想说 Pyglet 实际上比 PyOpenGL 更进化。它有一个很好的自己的 API,它有一个完整的 OpenGL 包装器,可以通过 pyglet.gl 模块访问! PyOpenGL 甚至没有包装 OpenGL 的所有功能。 Pyglet 还有一个很棒的库,可以通过 OpenGL 硬件加速来渲染 2D,而且做的非常好。

    如果您想要一个功能强大的现成 3D 引擎,您可以使用 Ogre

    【讨论】:

      【解决方案5】:

      pyglet 包含许多不错的附加功能(例如图像加载和声音)。如果你刚开始,我会先尝试 pyglet,然后如果你想更接近金属,我会切换到 PyOpenGL。

      但真正重要的问题是:您想要完成什么?

      【讨论】:

      • 嘿。小改进:我认为将 PyOpenGL 描述为“更接近金属”可能会产生误导。 PyOpenGL 确实没有提供与 Pyglet 相同的高级功能,但另一方面,PyOpenGL 提供的 OpenGL 绑定比 pyglet 中的 OpenGL 绑定更友好、pythonic 和更慢。
      【解决方案6】:

      我推广 pyglet 是因为它拥有我所见过的最好的 API。

      Pyglet 也有 opengl API。但是使用最近添加的顶点列表支持通常会更好。

      pyglet.gl

      【讨论】:

        【解决方案7】:

        pyglet 的 GL API 远不如 PyOpenGL 的好——pyglet 位于原始 ctypes 层,这意味着您还需要学习 ctypes。如果你打算做一堆 OpenGL 编程,你会想要使用 PyOpenGL。

        好消息是您可以将两者混合使用。使用 pyglet 提供 GL 上下文、声音、事件、图像加载和纹理管理、文本渲染等。使用 PyOpenGL 进行实际需要做的 OpenGL 编程。

        【讨论】:

          【解决方案8】:

          嗯,我建议使用 pyglet,它确实提供了游戏或应用程序所需的一切。

          请注意,pyglet 可以用 PyOpenGL 做很多事情,例如创建一个窗口,您只需:
          glutInitWindow(标题)

          虽然我认为 glutInitDisplayMode 必须在此之前调用。

          简单总结:如果你哭到不想写代码,选择pyglet,但如果你想成为高手,选择PyOpenGL。转到 http://pyopengl.sourceforge.net 阅读 PyOpenGL 上的文档,转到 http://pyglet.org 阅读 pyglet 上的文档。希望这对您有所帮助!

          【讨论】:

            【解决方案9】:

            我会推荐 Pyglet,因为它很容易上手并运行一些基本的东西,然后您可以按照自己的节奏添加更高级的技术。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-06-18
              • 2010-09-10
              • 2011-07-03
              • 2011-03-27
              • 2010-12-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多