PyOpenGl还是pyglet?

问题描述 投票:24回答:9

我希望对openGL和Python做一些修改,并且无法找到使用PyOpenGl和pyglet的充分理由

你会推荐哪个?为什么?

python pyglet pyopengl
9个回答
29
投票

正如托尼所说,这实际上取决于你的目标。如果你正在“修补”试图了解一般的OpenGL或3D渲染,我会免除所有的烦恼并开始使用PyOpenGL,这就是你要接近使用Python的“原始”3D编程。

另一方面,如果你通过模拟游戏或多媒体应用程序来“修补”,或者试图了解一般的编程实践,那么Pyglet将通过为输入事件提供钩子来节省大量的前期开发时间这些前期投资通常会阻止人们完成他们的项目,因此为您完成这项工作并不是一件值得忽视的事情。 (它也是非常Pythonic,以避免重新发明轮子。)

如果您正在寻求进行任何类型的重型提升(通常不属于我的“修补”定义,但如果您正在修改3D引擎设计,则可能没有),那么您可能需要查看Python-Ogre ,它包装了功能齐全,功能强大的OGRE 3D图形引擎。


32
投票

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

稍后,您可能还想编写自己的低级代码,直接调用OpenGL函数,如glDrawArrays等。您可以使用pyglet的OpenGL绑定或使用PyOpenGL来执行此操作。好消息是,无论您使用哪种方式,都可以将这些调用直接插入到现有pyglet应用程序的中间,并且它们将“正常工作”。将代码从Pyglet转换为PyOpenGL非常简单,因此这不是您需要过早担心的决定。两者之间的交易是:

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

pyglet的OpenGL绑定是自动生成的,并且不像PyOpenGL那样友好。例如,有时您必须手动创建ctypes对象,以便将“C指针”类型的args传递给OpenGL。这可能是繁琐的。尽管如此,pyglet的绑定往往会明显加快。

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


7
投票

试试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中,您可以使用单个调用创建一个简单的着色器程序:

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
投票

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

如果你想要一个强大的现成3D引擎你有Ogre


4
投票

pyglet有很多很好的附加功能(如图像加载和声音)。如果你刚开始,我会首先尝试pyglet,然后切换到PyOpenGL,如果你想要更接近金属。

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


4
投票

我推广pyglet,因为它有我在这样的东西上见过的最好的API。

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

朋友给了他.公里


4
投票

嗯,我会建议pyglet,它真的提供游戏或应用程序所需的一切。

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

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

简单总结:如果你不想编码直到你哭,选择pyglet,但如果你想成为一个主人,选择PyOpenGL。转到http://pyopengl.sourcefourge.net阅读PyOpenGL上的文档和http://pyglet.org阅读pyglet上的文档。希望这有用!


3
投票

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


3
投票

pyglet的GL API远没有PyOpenGL那么好 - pyglet位于原始ctypes层,这意味着你也需要学习ctypes。如果你打算做一堆OpenGL编程,你会想要使用PyOpenGL。

好的是你可以将两者混合得很好。使用pyglet提供GL上下文,声音,事件,图像加载和纹理管理,文本呈现等。使用PyOpenGL进行您需要执行的实际OpenGL编程。

© www.soinside.com 2019 - 2024. All rights reserved.